- ベストアンサー
変数の展開の展開
perl初心者です。私のやりたいことができるのかどうかわからないのですが、助けてください。 以下の文(ログファイルを必要事項だけ抜き出すための表現) $words[3]\t$words[0]\t$words[2]\t$words[1]\n を別ファイル(設定ファイルのように)に持って、openして読み込み、 $format = $1; ↑ここに($words[3]\t$words[0]\t$words[2]\t$words[1]\n)が読み込まれている。 その後ログファイルを読み込んで、1行ずつ、$words[]に値入れた後、 printf putfile ("$format\n");#値書きだし で編集ファイルに書き出しているのですが、どうしても、$words[]の値が展開されてくれません。 設定ファイルから読む込まず、直接 $format = "$words[3]\t$words[0]\t$words[2]\t$words[1]\n"; とすれば展開されるのですが・・・・。 別のファイルにこのような変数を含む式を記述してもだめなのでしょうか。 それともなにか、特別な方法があるのでしょうか? 教えてください。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
えーと、ちょっと分かりにくいのですが、「『ログファイル』の内容を、『別ファイル』に記述された形式に従って『編集ファイル』に書き出す」ということでいいのでしょうか? えとですね。 $format = "$words[3]\t$words[0]\t$words[2]\t$words[1]\n"; この扱いにちょっと誤解があるようです。 Perl というのは実行前にコンパイルを行ってから実際の処理を行います。上記の文も、このときに展開処置が施されます。 ですので、「実行が始まってから」$words[3]\t$words[0]\t$words[2]\t$words[1]\n という文字列をいくら用意しても、展開は行われません。 ですので、このことに注意して記述しなければならないのです。 Perl は内部で機械語に翻訳されて動いており、インタプリタ言語じゃないんです(^_^;
その他の回答 (2)
>ログファイルを読み込み$words[]に値を入れた後に ここでいう展開処理とは、「変数入りの文字列を完全な文字列に変換する」という処理ではなく、「いつでも完全な文字列に変換できるよう準備する」という意味です。 ゆえに、$word[0] の内容が途中で変わっても正しく出力できるのです。 ですので、「ログファイルを読み込む」という処理を行った時点でコンパイルはすでに終わってしまっているので、そのあといくら$の入った文字列が来ても、$は$としてしか扱われないのです。 ほかにいくらでもやりようはあると思いますので、そっちを模索した方が早いですよ(^_^;
お礼
親切かつ迅速な ご回答ありがとうございました。 今回のご回答できれいさっぱり理解できました。 まだまだ勉強不足ですね。(^_^; ほんとうにありがとうございました。
- a-kuma
- ベストアンサー率50% (1122/2211)
perl は触ったことがないんですが、eval しろ、ってことではないんでしょうか。 $format = $1; ↓ eval '$format = $1';
お礼
ご回答ありがとうございます。 ご回答くださったことも、試行錯誤でやってはみていたのですが、 やはり無理なようでした。 ありがとうございました。 またよろしくお願いいたします。
補足
ご回答ありがとうございます。 わかりにくい説明で申し訳ありません。deagleさんの理解して頂いた通りのことがやりたかったのですが、もともとの私の勘違いというか誤解だったのですね。(勉強不足です。) ばかを披露したついでに、ご回答について、もう一度ご質問です。 コンパイルを行う際に展開処理がされるということですので、 ログファイルを読み込み$words[]に値を入れた後に、設定ファイルを読み込んで$formatに$words[3]\t$words[0]\t$words[2]\t$words[1]\nをいれたとしてもそれは展開されないのですか?(^_^; (実際にはそれでもできなかったのですが。) 呆れずにご返答下さい。