• ベストアンサー

PERLの「!=」と「=~」 or 「if」と「unless」必ずしも真反対の意味ではない?

下記コードは、同じ意味だと思っていたのですが、 実行すると違った結果が表示されます。 何故でしょうか? my $string = 'A-test'; unless($string =~ m/-Hoge/){print '=~>',$string;} if($string != m/-Hoge/){print '!=>',$string;}

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.2

if($string != m/-Hoge/){print '!=>',$string;} でなくて if($string !~ m/-Hoge/){print '!=>',$string;} だと思います。

pevtone
質問者

お礼

回答いただきありがとうございます。 あ!そうですね。 そうでした!

その他の回答 (1)

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.1

違います。 unless($string =~ m/-Hoge/){print '=~>',$string;}  ↑ 変数 $stringに文字列 「-Hoge」 が無かったら { }内を実行する if($string != m/-Hoge/){print '!=>',$string;}  ↑ 変数 $stringの値と $_=~/-Hoge/マッチング結果(真/偽)が不等だったら{ }内を実行する。(この場合、マッチング結果は「偽」で式が成立しない) したがって、 【結果】 =~>A-test

pevtone
質問者

お礼

回答いただきありがとうございます。 そうですね。勘違いしていました。

関連するQ&A

  • 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
  • ifステートメント notと!は同じ意味ですか?

    VBAのifステートメントで、notと!は同じ意味ですか? 「a」で始まらない。 と言う意味で、下記のコードを作ったのですが、どちらも思い通りの結果が得られます。 If "あabc" Like "[!a-z]*" Then Debug.Print "OK" End If If Not "あabc" Like "[a-z]*" Then Debug.Print "OK" End If End Sub ネットからのサンプルをコピペしたので、いまいち理解できてないのですが notと!は同じ意味ですか?

  • [Perl]foreach if 抽出

    質問させていただきます。 メールヘッダに対して以下のプログラムを実行します。 ソースコード ~略 my $file_data_str = join("", @file_data); my @received_datas = split(/Received:/, $file_data_str); my @received_datas = reverse(@received_datas); foreach my $sorted(@received_datas){ if($sorted =~ /by\s\w+.abc.jp/){ $sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/; print $sorted; print "\n"; } } } exit; を実行すると以下のようにに実行結果が出てきます。 from 158.217.207.30 (114.114.96.20 [114.114.96.20]) by ************abc.jp from ****************.jp (***************.jp [158.217.208.15]) by ***********abc.jp 私は [114.114.96.20]だけを取りだしのですがどうしたらいいでしょうか? foreach my $sorted(@received_datas){ if($sorted =~ /by\s\w.abc.jp/){ $sorted =~ /(\[\d+\.\d+\.\d+\.\d+\])/; ここをどうにかすればいけると思うのですが詰まってしまって… 申し訳ないですが助言をお願いします。

    • ベストアンサー
    • Perl
  • 無名サブルーチンの疑問

    下記コードを実行しましたが$nameの文字が表示されません。 コードが間違っているのでしょうか? $string = sub ("さぶろう") { my($name) = @_; return("$nameです。\n"); }; print &$string;

    • ベストアンサー
    • Perl
  • perlでの判定がうまくいきません

    $ref == 0 が正常に判定されていないようです。なぜでしょうか? また、if($tag =~ m/^tag$/ && $ref == 0){について、どのように改良するのが適切でしょうか? $| = 1; my $tag = "tag"; my $ref = "test"; if($ref eq ""){$ref = "0";} $ref =~ s/%([a-f\d]{2})/pack 'H2',$1/egi; if($tag =~ m/^tag$/ && $ref == 0){ print $ref; }

    • ベストアンサー
    • Perl
  • &と|の演算子を使ったif文のプログラムについて

    ↓のプログラムの実行結果について質問します。 public class Test{ public static void main(String args[]){ if(methodA() & methodB() ){ System.out.print(1); }else{ System.out.print(2); } if(methodA() | methodB() ){ System.out.print(3); }else{ System.out.print(4); } } private static boolean methodA(){ System.out.print("A"); return false; } private static boolean methodB(){ System.out.print("B"); return true; } } 上記のプログラムを実行すると AB2AB3 と出力されるのですが、 何故こういう風になるのか教えていただけませんか? また、if文の中をそれぞれ if(methodA() & methodB() ) if(methodA() | methodB() ) と書き換えると A2A3 となるのですが、これについてもイマイチよく分かりません。 メソッドからfalseとtrueを戻り値として受け取り 演算子によって処理を分けているんでしょうけど、 どういう流れで処理が行われているのか 出力結果を見ても読めなくて・・・

    • ベストアンサー
    • Java
  • 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が表示されるのでしょうか。

    • ベストアンサー
    • Perl
  • if (m == 1 || 2)の意味は?

    変数mが1と2の時にif文内が実行されるようにしたつもりが mが5の時なんかにもif文内が実行されてしまいます。 これでは、そのような意味にはならないのでしょうか?

  • perlの構文がおかしいようです。

    構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

    • ベストアンサー
    • Perl
  • perl サブルーチンでのファイル出力結果おかしい

    以下のコードを実行するとカレントディレクトリの配下にある すべてのファイルのリストがコンソールとファイルに出力される はずですが、コンソールに表示されているファイルの一部しか ファイルに出力されていません。 どうも、最後に do_file()を呼び出したときのファイルしか リストされていないようなのですがなぜでしょうか。 どのようにすればよいのでしょうか。 よろしくお願いします。 (Windows7, ActivePerl(v5.16.3)) ----test.pl--------------------------------------------- &do_dir('.'); sub do_dir{  open(FILE2,'>list.txt') or die "$!";  my $dirname=shift;  my $delim='/';  opendir(DIR,$dirname) or die "$!";  foreach $entry (readdir(DIR)){   next if($entry eq '.');   next if($entry eq '..');   if ($dirname=~/[\\\/]$/) {    my $delim='';   }   my $filename="$dirname$delim$entry";   if(-d $filename){    &do_dir($filename);   } else {    &do_file($filename);   }  }  close(DIR);  close(FILE2); } sub do_file{  my $filename=shift;  return unless ($filename=~/\.*$/);  print "$filename\n";  print FILE2 "$filename\n"; }

    • ベストアンサー
    • Perl