- ベストアンサー
ifについて
アルファベットの名前から漢字の名前を取得するサブルーチンを作ったのですが、なかなかうまくいきません。 name.txtの内容は、 名前1<>コメント1<>name1<> 名前2<>コメント2<>name2<> 名前3<>コメント3<>name3<> 名前4<>コメント4<>name4<> です。 sub Get_Name{ my $temp = $_[0]; $i = 0; open(NAME,"name/name.txt"); while(<NAME>){ ($name,$comment,$a_name) = split(/<>/); if($temp == $a_name){ $output = $name; } } close(NAME); return $output; } これを実行すると、$outputに名前4が入ってしまいます。 どこが原因かわかる人いませんか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
文字列比較をすべきなのに == を使っているのは他の方が指摘しているので良いとして、 検索対象が見つからなかったときには常に最後のエントリのデータが返る ようになっていますね。バグの元になりますから、見つからなかったときは それなりのデータ(undefとか)を返すべきでしょう。 $temp はmyで宣言しているのに、他の変数($outputとか$nameなど)を 宣言していないのはなぜでしょうか? $temp に $_[0] の値を代入するのなら、 $temp = shift; の方が一般的に使われます。これだと元のエイリアスにアクセス できなくなるので間違ってデータを上書きしてしまうこともありません。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
== は、数値として比較することになるので、eq を使いましょう
お礼
忘れてました! そうですよね! 前にも同じ間違いをしてました! ありがとうございます!
- moon_piyo
- ベストアンサー率60% (88/146)
こんちは 文字列の比較演算子かなぁ 誤 if($temp == $a_name){ 正 if($temp eq $a_name){
お礼
忘れてました! そうですよね! 前にも同じ間違いをしてました! ありがとうございます!
- siritaiyo_1978
- ベストアンサー率20% (19/93)
これはなに?Perl? $outputに名前4に入って何がダメなの? これだけじゃ、どんな実行をして、どんな意図しない結果が出ているのか分からない。だれも答えられないと思う。
お礼
確かに・・・。 そうですよね。 全然考えてませんでした。 すみません。
お礼
わざわざいろいろとありがとうございます。 myで宣言してないのはあんまごたごた書くと見にくいかなと思って削除しておいたので大丈夫です。 shiftというのは知りませんでした。 もっと勉強が必要ですね。 新しい知識も入り大変助かりました。