• ベストアンサー

マッチ演算子に変数をはさんではいけませんか?

本を読んでPerlを自習しています。ptなるテキストファイルから、ある名前を含む行だけを標準出力に打ち出すプログラムを作ろうと、 print "who?"; $who = <STDIN>; open IN, "pt"; while (<IN>){ if(/$who/){ print; } } close IN; というスクリプト(のつもり)を書いたのですが、動きません。本の中の例文の切り貼りで作ったのですが、どこが問題なのでしょうか。スクリプトをそのまま提示して質問するのは反則かと思うのですが、どこが問題かがわからないもので。是非教えてください(動くと自分にとってはすごく便利なんです)。

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

  • ベストアンサー
  • nak205
  • ベストアンサー率60% (40/66)
回答No.2

#!/usr/bin/perl print "who?"; $who = <STDIN>; chomp($who); open (IN, "pt"); while (<IN>){ if($_ =~ /$who/){ print $_; } } close IN; これでいかがですか?日本語使えるかどうかはわかりませんが。。。

ma_san
質問者

お礼

見事に動きます! 本当にありがとうございます。どうも質問のタイトルから間違ってたようで、恥ずかしいかぎりです。なるべく皆さんに迷惑かけないようにと思ってるのですが、また路頭に(もう一週間考えてました)迷ったときはご教示ください。ありがとう!

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

その他の回答 (3)

回答No.4

なんかPerlっぽくない。 print "who?"; $who = <>; chomp $who; open(IN,"pt"); @DAT = <IN>; close(IN); foreach $l (@DAT){ if ( $l =~ /$who/ ){ print $l; } }

ma_san
質問者

お礼

打ち込んで確認するのに手間取ってました。ありがとうございます、確かに私の思うとおりの結果です。まだ使ったことのない言葉も入ってて、まだPerlっぽさの何たるかもつかめてないのですが、先輩(勝手にすみません)からのアドバイスをこうも簡単に頂けて申し訳ないです。本当にありがとうございます。今日は安心して寝れます!

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> $who = <STDIN>; だと、変数の中身に改行までくっついてきます。 そのせいでマッチに失敗しているのでは? chomp $whoo; を読み込んだ跡に実行してみたらどうなりますか? あと、ファイルオープンの成功/失敗は確認したほうがよいです。

ma_san
質問者

お礼

丁寧なアドバイスありがとうございます。ご指摘の点を変更したら動きました。改行までくっついてきてるんですね。よくわかりました。小さなプログラムですが、私の仕事をすごく便利にしてくれます。本当にありがとう!(「フォイルオープンの成功/失敗の確認」の件はまだ理解不足かもしれませんが)

すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.1

検証してないけど if(/${who}/){ だとどう?(文法的に間違ってたらごめん

ma_san
質問者

お礼

真夜中の質問なのにお答えいただき本当にありがとうございます。頂いたアドバイスと同じことも試していたのですが、うまく動きませんでした。どうも、chompが鍵だったようです。また困った時には是非アドバイスをください。ありがとう!

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

関連するQ&A