• ベストアンサー

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; }

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

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.2

文字列を数値として比較しているので、そういった動作になります。 文字列として比較すれば望む通りの動作になると思います。 # if($tag =~ m/^tag$/ && $ref == 0){ if($tag =~ m/^tag$/ && $ref eq "0"){

noi_hh
質問者

お礼

回答いただきありがとうございます。 とても参考になりました!

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

== は「数値として」比較します. 本当に「0」のときのみにしたいなら eq じゃいかんの?

noi_hh
質問者

お礼

回答いただきありがとうございます。 とても参考になりました!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「正常に判定されていないようです. なぜでしょうか」 とか 「どのように改良するのが適切でしょうか」 と聞くなら, 何を期待しているのか書くのが当然ではありませんか? ちなみに「$ref == 0」の部分は「正常」に判定されています. あなたが何をもって「正常」と考えているのかはわかりませんが....

noi_hh
質問者

お礼

回答いただきありがとうございます。 大変失礼いたしました。 コメントアウトのところに質問を記述させて頂きました。 宜しくお願い致します。 $| = 1; my $tag = "tag"; my $ref = "test"; if($ref eq ""){$ref = "0";} $ref =~ s/%([a-f\d]{2})/pack 'H2',$1/egi; # ここで my $ref = "test"; $tag = "tag"; です。 # この場合、下記では、$ref == 0にマッチすることなく、print $ref;が実行されないことを期待していたのですが、実際に行うと実行されてしまいます。なぜでしょうか? また、$ref=0の場合のみマッチさせたいのですが、どのようにすればよいでしょうか? if($tag =~ m/^tag$/ && $ref == 0){ print $ref; }

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

関連するQ&A

  • Perl ページ表示遅い ループの改善

    ソースが汚いかもしれませんが、ご教示お願い致します。 実行したいことは、できてはいるのですが、 「表示が遅い」です。 ループのやり探し、 サーバー上でのHTML生成が 原因だと思うのですが、 どう改善すればいいのかわかりません・・・ ・下記のソースの簡単な説明 あるテキストファイルにCSV方式でデータを記録してあります。 (最終で200万バイトくらい) (現在 12万バイト) そのデータで1列目に順位の数字があり (~20位前後) それを、いろんな条件で絞込し一気に表示してます。 そこから、サーバー上でテーブルとして表示させているのですが とにかく遅いです。 ・・・サーバー上で計算するからでしょうが・・・ もう少し速くする方法はないでしょうか? スクリプトでHTMLを生成させることはできるのですが、 サーバーにデータのみを保存させ そこから生成させたいのです・・・ ※だいたい10秒前後(Wi-Fi有りで) Wi-Fiの環境がなく、さらに回線が3Gまでに なっている人だと絶望的な状況だと・・・ 下記のソースで、 (1)おかしな点 (2)改善すれば速くなる点 (3)別の案 を教えてほしいです・・・ ------ソース------ my @DataNo = ("13","14","2","1","8"); my $DataName; for(my $dn=0;$dn<=$#DataNo;$dn++){  my $DataNo = $DataNo[$dn];  my ($No) = split(/,/, $DataNo);    if($No eq "13"){ $DataName = "A" }  if($No eq "14"){ $DataName = "B" }  if($No eq "2"){ $DataName = "C" }  if($No eq "1"){ $DataName = D" }  if($No eq "8"){ $DataName = "E" } print <<END;  <h2 class="ResMidashi"> $DataNameデータ</h2>   <table class="ResultData">    <tr>     <td>[$DataName]</td>     <th>Test1</th>     <th>Test2</th>     <th>Test3</th>    </tr> END my %hash = (); my @arrey; open(F, "<","../Test/Test.txt") or die("error :$!"); eval{ flock(F, 1) }; while(<F>){  chomp;  my @temp1 = split /,/;  push @arrey , $temp1[$No]; } close F; foreach (@arrey) {  $hash{$_}++; } my @Data; if($No eq "1" || $No eq "2" || $No eq "9"){  @Data = sort keys %hash; } else{  @Data = reverse sort keys %hash; } my $matches = 0; my $Count1 = 0; my $Count2 = 0; my $Count3 = 0; for(my $Co=0;$Co<=$#Data;$Co++){  my $DATA = $Data[$Co];  my ($Main) = split(/,/, $DATA);  open(F, "<","../Test/Test.txt") or die("error :$!");  eval{ flock(F, 1) };  while(<F>){   chomp;   my @temp2 = split /,/;   if( $temp2[5] eq "$JoukenA" and $temp2[6] eq "$JoukenB" and $temp2[7] eq "$JoukenC"){    if( $temp2[$No] =~ /^$Main$/ ){     $matches++;     $Count1++ if $temp2[0] == "1";     $Count2++ if $temp2[0] == "2";     $Count3++ if $temp2[0] == "3";    }   }  }  my $T;my $P;  if($matches){   $T = ($Count1 / $matches) * 100;   $T = sprintf('%.2f', $T);   $P = (($Count1 + $Count2 + $Count3) / $matches) * 100;   $P = sprintf('%.2f', $P);   my $Frame1;my $Frame2;   if($Puk ne "0.00"){ print <<END;    <tr>     <td>$Main</td>     <th>$Count1-$Count2-$Count3-$matches</th>     <th>$T</th>     <th>$P</th>    </tr> END   }  }  $matches = 0;  $Count1 = 0;  $Count2 = 0;  $Count3 = 0;  if($Co eq $#Data){last;} } print <<END;   </table> END }

    • ベストアンサー
    • Perl
  • なぜか祝日判定がうまくいきません

    Calendar::Japanese::Holiday を利用して以下の様な祝日判定のルーチンをテストしているのですが、なぜか#(1)あるいは#(2)のようにサブルーチン内部で値を明示してやらないと正常動作(祝日判定)しません。 そこでCalendar::Japanese::HolidayのisHolidayルーチンの方に値が正常に渡っていないのかと考え、#(3)のようなチェック用のソースを組み入れてみたりもしたのですが、$year, $mon, $dayそれぞれ正常に値は渡っていました。 どのようにすれば正常動作するようになるのでしょうか? my %spdate = (#すでに$y、$m、$dにはそれぞれ2012、05、05と値が入っています。 'year' =>$y, 'month' =>$m, 'day' =>$d, ); $spdate = \%spdate; &check_date($spdate); sub &check_date{ my($spdate) = @_; #($spdate->{year},$spdate->{month},$spdate->{day})=(2012,05,05); #(1) #my $jpholiday = isHoliday(2012,05,05); #(2) my $jpholiday = isHoliday($spdate->{year},$spdate->{month},$spdate->{day}); if($jpholiday){ push(@error, 'It is a holidays today'); } }#end #Calendar::Japanese::Holiday #http://search.cpan.org/~kztomita/Calendar-Japanese-Holiday-0.03/ sub isHoliday { my ($year, $mon, $day, $furikae) = @_; #test #(3) print "Content-type: text/html; charset=utf8\n\n"; print "$year"; print "$mon"; print "$day"; my $holidays; if ($year == $Cache_holidays_Year && $mon == $Cache_holidays_Month) { $holidays = $Cache_holidays; # From Cache } else { $holidays = getHolidays($year, $mon, 1); return if not defined $holidays; # Cache $Cache_holidays = $holidays; $Cache_holidays_Year = $year; $Cache_holidays_Month = $mon; } return if !exists $holidays->{$day}; return if (!$furikae && $holidays->{$day} eq $FurikaeStr); return $holidays->{$day}; }#end

    • ベストアンサー
    • Perl
  • フォームのアクションから引数をとる

    <form action="test.cgi?ref=5" method="post"> このような感じで、引数を送ります。 my $cgi = CGI::new(); my $ref = $cgi->param('ref'); if ($ref eq 0){ (省略) }elsif ($ref eq 5){ こんな感じでプログラムを書きました。 アドレスを見ても、ちゃんとref=5となっていますし、 普通に<a href="test.cgi?ref=1">などのリンクから飛べば、指定したifの処理に入ります。 しかし、 <form action="test.cgi?ref=5" method="post"> 上のフォームのsubmitから送ると、ref=5のifが判別されません。 どうすれば、判別してくれるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください

    • ベストアンサー
    • CGI
  • perlの構文について、読み方を教えて下さい。(1)

    はじめまして、perl初心者です。基礎を勉強した段階ですが1人でやっていてわからない文章に行き当たりました。どうしてもわからないのでどうか先輩の皆さまにお教え頂きたくお願い申し上げます。いくつかあるので今後もどうか愛想をつかさずに御付合い下さい。では、以下に理解の出来ない文章を書きます。 if($tag eq "meta"and $attr->{"http-equiv"}eq "refresh"){ my ($delay,$url)=split";URL=",$attr->{content},2; $attr->{content}="$delay;URL=".$self->encode($url); ●my @attribs=map{"$_=\"$attr->{$_}\""}@$attrseq; $new_text="<$tag @attribs>";} ●の行が特にわかりません。$_は何を指すのでしょうか、$attrseq->@の要素になるのですか?$_を書くのはどうしてなのか教えて下さい。全行の解釈も書いて下さい。それと入力する時に\の半角のがキーボードで出ないのですがどうやったらよいのでしょうか。宜しくお願いします。

    • ベストアンサー
    • Perl
  • perl 下記スクリプトは正常に動きますか?

    今まで長い間、何か勘違いしていたのか、条件が2つ以上になると、 長い間このように書いていたのですが、 if( ($a%2==1 && $b==1) && ($c eq 10 && $d == 5) ) { print "ok"; } 下記スクリプトでも正常に動作しますか? if( $a%2==1 && $b==1 && $c eq 10 && $d == 5){ print "ok"; }

    • ベストアンサー
    • Perl
  • 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の「!=」と「=~」 or 「if」と「unless」必ずしも真反対の意味ではない?

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

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • perl マッチさせる方法について

    perlでマッチさせたいのですが、なかなかうまくいきません。。 詳細は $joho='これは、テストです。'; $seach='テスト'; if ($joho =~ m/$seach/) { print 'マッチしました。'; } とやっていますが、どうしてもだめです。 if ($joho =~ m/テスト/) { print 'マッチしました。'; } とすれば、マッチするのですが、何がいけないのでしょうか? 環境はperl5.8、EUC-JPです。 初心者な質問かもしれませんが、よろしくお願いします。

  • EXCEL2003で判定式について教えてください。

    仮にA1に12.9、B1に12、C1に11.4、D1に12.5とあるとして F1にはA1-B1の値を、G1にはB1-C1の値、H1にはC1-D1の値を それぞれ10倍して(小数点以下を無くし見易くする為に) 表示するものとします。 その後F1~H1の3つの値(+9、+6、-11)に対し、+5以上が 一つでもあるならなら「A」、+1~+4のみは「B」、 +の値が一つもなく0以下なら「C」と判定させたいのです。 そこで当初J1で =IF(F1:H1>=5,"A",IF(F1:H1<=0,"C","B")) としたところ複数のセルに対してはできないようなので 一旦J1でMAXを使い(+5以上か)を判定し、L1に =IF(J1>=5,"A",IF(J1<=0,"C","B")) と二つのセル、二つの式で結果的には出来たのですが、 なんとかすっきりと一つの関数式で判定させることは 出来ないでしょうか?