• ベストアンサー

perlですが疑問がでました

# 変数$aに1を代入せよ。 $a=1; # もし変数$aが1でなかったら A を表示せよ。 # もしくは変数$aが2でなかったら B を表示せよ。 # どれも真の場合は C を表示せよ。 unless($a==1){ print "A"; }elsif($a==2){ print "B"; }else{ print "C"; } とあって結果はCと出ます。私てきにはBが表示されるのかなと思ったのですが違いました。なぜCが表示されるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

elsifは条件が真の時にブロックが実行されます。 なので、そのコメントは間違いで、正しくは # 変数$aが1でなければ A を表示せよ。 # それ以外で、かつ変数$aが2であれば B を表示せよ。 # どの条件も満たされなければ C を表示せよ。 という感じでしょうか。 $a==2ならAが表示されてしまうので、Bが表示されることはないですね。

参考URL:
http://www.site-cooler.com/kwl/perl/6.htm#6-1
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.3

こんにちは コメントとソースに矛盾が生じてますね 『1』でなければ『A』を、『2』であれば『B』を、それ以外なら『C』を、という風になっています ですので『1』の場合、『A』『B』の条件に合わないので『C』と表示されます また、elsif、elseを使うと先頭からマッチさせていくので『1』以外の数字・文字はすべて『A』となります 考え的には『2』なら『A』、『1』なら『B』、それ以外は『C』ということなのでしょうからそのようにプログラムすればいいです $a = 1; if($a eq "1") { print "B"; } elsif($a eq "2") { print "A"; } else { print "C"; }

全文を見る
すると、全ての回答が全文表示されます。
  • metis
  • ベストアンサー率52% (86/165)
回答No.2

コメントが間違いの場合はすでに述べられていますので、一応プログラムが間違っている場合を挙げておきます。 残念ながら、unlessifという関数はありませんので、演算子を変更することになります。 「!=」と言う演算子は、左右が一致していないときに真を返す(「==」と逆)ので、これを使ってやります。 また、「どれも真」と言う表現が非常にあいまいです。 命題が「$aが1でない」「$aが2でない」と言うことであれば、この2つを同時に満たす場合にCを表示するので、多少厄介なことになります。 A,B,C全てが表示される数字もありえます(3とか)ので、この場合どう表示するかが大きな問題になってきます。 Cのみを表示させたいのであれば、Cの判定を最初に持ってきて残りをelseで纏める等の必要がありますし、該当するもの全て表示させたいのなら独立したCの判定が必要でしょう。 一方、命題が「$aが1」「$aが2」と言うことであれば、問題文のプログラムの形に近くなります。 …が、Cが表示されることがないので多分違うでしょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • perlの内容なのですがこれで合っていますでしょうか?

    print 関数は文字列や数値だけでなく、変数を指定してその値を表示することもできます。 $a=1; 1を$aに代入する。 print $a; 変数$aの値を表示させる。 $a=2; 変数$aに2を代入する。 $b=3; 変数$bに3を代入する。 print "変数\$aに変数\$bを代入\n"; 「変数$aに変数$bを代入」という文字を表示させて改行する。 $a=$b; 変数$bの値を変数$aに代入する。 print "\$a="; 「$a=」を表示させる。 print $a; 変数$aの値を表示させる。 print ",\$b="; 「,$b=」を表示させる。 print $b; 変数$bの値を表示させる。 print "\n"; 改行を表示させる。 実行結果は↓↓↓↓↓↓↓ 変数$aに変数$bを代入 $a=3,$b=3 変数の書き方 文は ; で区切るが、1行に並べることも可能。 $a=2; $b=3; ↓ $a=2; $b=3; 複数の変数に、同時に値を代入することも可能。 $a=2; $b=2; ↓ $a=$b=2;

    • ベストアンサー
    • Perl
  • Perl あっていますでしょうか?

    " " と ' ' の相違は? ""の内にある変数名は、その値に変換されます。 ''の内にあるものは、そのまま文字列として扱われます。 エスケープシーケンスは "" の内に記述した場合のみです。 $a="Hello"; 文字列Helloを変数$aに代入する。 $b="$a"; 変数$aを変数$bに代入する。 $c='$a'; $aという文字列を変数$cに代入する。 ""の内で""を使うことは出来ません。 ''の内で''も使うことは出来ません。 使うときはエスケープシーケンスを使います。 print "\"Hello\"\n"; 文字列"Hello"を表示させます。 print "'Hello'"; 'Hello'を表示させます。 ""の内で''又は''の内で""を使うことは出来ます。 $a="あいうえお"; 文字列 あいうえお を変数$aに代入する。 print "\n$a\n"; 改行して あいうえお表示して 改行する。 print '\n$a'; 文字列\n$aを表示する。 文字列の結合 . (ピリオド)を使って前後の文字列を連結することが可能です。 $a="Hello"." "."World"; 変数$aに文字列Helloと半角スペースとWorldをつないだものを代入します。 $a="c"x3; 変数$aに文字cを3回つないだものを代入します。 $a="A"; 文字Aを変数$aに代入する。 $b="B"; 文字Bを変数$bに代入する。 $c="C"; 文字Cを変数$cに代入する。 print $a.$bx3.$c; 文字Aと文字Bを3回結合したものと文字Cを表示する。 画面にはabbbcと表示されます。

    • ベストアンサー
    • Perl
  • rubyのunlessで遊んでいたら

    Rubyのunlessで適当にプログラムをつくって遊んでいました。 01:a = 10 #aに10を代入 02:b = 20 #bに20を代入 03: 04:unless a > b 05: puts "aはbより大きくない" 06:else 07: puts "aはbより小さくない" 08:end 09:#unless文にはelsif節等がなく、条件項目を増やせないのでaとbの値が同じ場合は 10:#どうしようかと、これをif文で補おうとしました。 11:if a = b 12: puts "aとbは同じです" 13:end 14: 15:puts "a=#{a} b=#{b}" そもそも、aとbの値が同じでない場合11行目のifが実行されることは無いだろうと思っていたのですが実効結果は ↓ aはbより大きくない aはbと同じ a=20 b=20 という結果がでました。実行結果一行目の「aはbより大きくない」と出力されたのはプログラム4行目のunless文の返した結果だろうと理解できましたが、実行結果2行目のif文の結果である「aはbとおなじ」が出力されたのか、実行結果3行目でaとbの変数内を参照しておりますが、ここでどうしてaの値が20に変更されているのか、わかりません。 詳しい方いらっしゃいましたらご教授願います。

    • ベストアンサー
    • Ruby
  • Perlです。サブルーチンについて

    以下の文はあっていますでしょうか。 # サブルーチンを呼び出して引数は 3 とする。 # そして返ってきた戻り値を変数$aに代入せよ。 $a=&a(3); # サブルーチン名aせよ。 sub a{ # $_[0]が引数 3 となりプラス1して変数$bに代入せよ。 $b=$_[0]+1; # 変数$bの内容を戻り値として返せ。 return $b; } # 変数$aの内容を表示せよ。 print "$a";

    • ベストアンサー
    • Perl
  • Perlインクリメントデクリメント

    あっていますでしょうか? インクリメント演算子とデクリメント演算子 インクリメント(加算)演算子は変数の数値を一つ増やす。 デクリメント(減算)演算子は変数の数値を一つ減らす。 ++ インクリメント演算子 変数の値を1増やす $a++ ++$a $aの値を1増やす -- デクリメント演算子 変数の値を1減らす $a-- --$a $aの値を1減らす $a=1; 変数$aに1を代入する print "はじめは$aでした。\n"; $aの代わりに1が入り はじめは1でした。と表示する。 $a++; $aに1を足す。 print "1増えて$aになりました。\n"; $aの代わりに2が入り、1増えて2になりました。 と表示する。 $a--; $aから1減らす。 print "1減って$aに戻りました。\n"; $aの代わりに1を入れて 1減って1に戻りました。 と表示する ↓ 実行結果 ↓ はじめは1でした。 1増えて2になりました。 1減って1に戻りました。 $a++ と ++$a の違い インクリメント演算子、デクリメント演算子には2通りの書き方があります。 ++$a(前置)と$a++(後置) --$a(前置)と$a--(後置) 前置の場合は変数の参照より先に演算が行われます。 後置の場合は変数の参照より後に演算が行われます。 $x=$a=1; 変数$xと$aに1を代入する。 $x=++$a; $aに1を足した後に$xに代入する。$xの値は2になる。 $x=$a=1; 変数$xと$aに1を代入する。 $x=$a++; 変数$aの値を$xに代入した後に$aに1を足す。$xの値は1。 文字もインクリメント出来ます。 $x="A"; "A"を$xに代入する。 $x=++$x; Aから一つ増やしてBにして$xに代入する。 $x="aaa"; "aaa"を$xに代入する。 "aaa"を一つ増やして"aab"を$xに代入する。 ただし、文字のデクリメントはできません。

    • ベストアンサー
    • Perl
  • perlの質問です

    論理演算子 複数の条件を組み合わせて、より複雑な条件を表すときに使います。 &&,and かつ ($a>=10)&&($a<50) $aは10以上かつ50未満 ||,or または ($a==1)||($a==100) $aは1または100 !,not ~ではない !($a==100) $aは100ではない $aは5以上1000未満である (5<=$a)&&($a<1000) $aは0でも1でもない !(($a==0)||($a==1)) $a=0または$a=1ではない !($a==0)&& !($a==1) $=0ではなく、$b=1でもない ($a!=0)&&($a!=1) $a≠0かつ$a≠1である 条件付き実行 条件式&&処理 条件式が真なら処理を行い、 偽なら処理を行いません。 条件式||処理 条件式が真なら処理を行わず、 偽なら処理を行います。 $a=4; 変数$aに4を代入する。 ($a<10)&&(print "\$aは10未満\n"); 変数$aに4を入れると条件式が真なので $aは10未満 を表示させる。 ($a<10)||(print "\$aは10以上\n"); 変数$aに4を入れてくらべると条件式は真なので処理は行いません。 $a=($a!=0)&&($a*2); ($a==10)&&(print "\$aの値は10\n"); 変数$aは8なので条件式は偽であるため処理は行われない。 ($a !=8)||(print "\$aの値は8\n"); 変数$aは8なので条件式は偽のため $aの値は8 を表示させる。 あっていますでしょうか。 それから $a=($a!=0)&&($a*2); の意味がわかりません。 実行してみたら一応動きます。

  • Perlですが、redoの処理がいまいちわかりません

    # 0から6未満の間で変数$aを1つずつ上げていく for ($a=0;$a<6;$a++){ # もし変数$aが3になればredo文を実行してブロック内の頭に飛べ。 if($a==3){ # 変数$aを表示して改行せよ。 print "$a a \n"; # 変数$aに100を代入せよ。 $a=100; redo; } # 変数$aを表示して改行せよ。 print "$a\n"; } と書いてみたのですが、実行結果が 0 1 2 3 a 100 となりました。 if($a==3)まで戻っていないように思います。redoのブロックが終わりぬけて100が表示されているのでしょうか。

    • ベストアンサー
    • Perl
  • perlの制御文について

    汚くて申し訳ありません。 以下のようなperlのプログラムを組んだのですが制御文が思い通りに動きません。 比較対象の数字の先頭の0を取れば正常に動くのですがどうしても0をはずすことはできないのです。 いろいろ試してみたのですがどうしてもうまきかないので知恵を貸してください。 $input = <STDIN>; if($input > 0130){ print "A\n"; } elsif(($input > 0120)&&($input < 0130)){ print "B\n"; } else{ print "C\n"; }

  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • 元号判定:Perl初心者です

    Perlにおいて、「元号を判定させる」ようにしたく、if-elsif文章を書いてみたのですが、上手くいきません。 (そもそも起動してくれないです・・・文章も合っているかわからないのですが。。) 年号を入力させて、 (meizi) X nenと表示させたいのです。 あと、明治以前の数字を入れたら、エラーと出すようにする。 被っている年号、例えば1912年と入れたら、meizi45nen/taisyou1nen ともしたいのですが、これらはどう入れたらいいのか分からなかったです。 どこを直せばいいのか、一部でもいいので、教えていただけると嬉しいです。 chomp($year = <stdin>); if($year<=1912 and $year>=1868){ $A=$year-1867 print("meizi $A nen \n"); } elsif($year<=1926 and $year>=1912){ $B=$year-1911 print("taisyou $B nen \n"); } elsif($year<=1989 and $year>=1926){ $C=$year-1925 print("syouwa $C nen \n"); } elsif($year>=1989){ $D=$year-1988 print("heisei $D nen \n"); }

    • ベストアンサー
    • Perl