• ベストアンサー

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が入ってしまいます。 どこが原因かわかる人いませんか?

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

文字列比較をすべきなのに == を使っているのは他の方が指摘しているので良いとして、 検索対象が見つからなかったときには常に最後のエントリのデータが返る ようになっていますね。バグの元になりますから、見つからなかったときは それなりのデータ(undefとか)を返すべきでしょう。 $temp はmyで宣言しているのに、他の変数($outputとか$nameなど)を 宣言していないのはなぜでしょうか? $temp に $_[0] の値を代入するのなら、 $temp = shift; の方が一般的に使われます。これだと元のエイリアスにアクセス できなくなるので間違ってデータを上書きしてしまうこともありません。

runner_h_a
質問者

お礼

わざわざいろいろとありがとうございます。 myで宣言してないのはあんまごたごた書くと見にくいかなと思って削除しておいたので大丈夫です。 shiftというのは知りませんでした。 もっと勉強が必要ですね。 新しい知識も入り大変助かりました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

== は、数値として比較することになるので、eq を使いましょう

runner_h_a
質問者

お礼

忘れてました! そうですよね! 前にも同じ間違いをしてました! ありがとうございます!

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

こんちは 文字列の比較演算子かなぁ 誤 if($temp == $a_name){ 正 if($temp eq $a_name){

runner_h_a
質問者

お礼

忘れてました! そうですよね! 前にも同じ間違いをしてました! ありがとうございます!

回答No.1

これはなに?Perl? $outputに名前4に入って何がダメなの? これだけじゃ、どんな実行をして、どんな意図しない結果が出ているのか分からない。だれも答えられないと思う。

runner_h_a
質問者

お礼

確かに・・・。 そうですよね。 全然考えてませんでした。 すみません。