OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

変数の展開の展開

  • 困ってます
  • 質問No.115737
  • 閲覧数62
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 66% (2/3)

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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2

 えーと、ちょっと分かりにくいのですが、「『ログファイル』の内容を、『別ファイル』に記述された形式に従って『編集ファイル』に書き出す」ということでいいのでしょうか?

 えとですね。
$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 は内部で機械語に翻訳されて動いており、インタプリタ言語じゃないんです(^_^;
 
補足コメント
kitakitakita

お礼率 66% (2/3)

ご回答ありがとうございます。
わかりにくい説明で申し訳ありません。deagleさんの理解して頂いた通りのことがやりたかったのですが、もともとの私の勘違いというか誤解だったのですね。(勉強不足です。)

ばかを披露したついでに、ご回答について、もう一度ご質問です。

コンパイルを行う際に展開処理がされるということですので、
ログファイルを読み込み$words[]に値を入れた後に、設定ファイルを読み込んで$formatに$words[3]\t$words[0]\t$words[2]\t$words[1]\nをいれたとしてもそれは展開されないのですか?(^_^;
(実際にはそれでもできなかったのですが。)

呆れずにご返答下さい。
投稿日時 - 2001-08-08 15:47:52
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

perl は触ったことがないんですが、eval しろ、ってことではないんでしょうか。 $format = $1;  ↓ eval '$format = $1'; ...続きを読む
perl は触ったことがないんですが、eval しろ、ってことではないんでしょうか。

$format = $1;
 ↓
eval '$format = $1';
お礼コメント
kitakitakita

お礼率 66% (2/3)

ご回答ありがとうございます。

ご回答くださったことも、試行錯誤でやってはみていたのですが、
やはり無理なようでした。

ありがとうございました。
またよろしくお願いいたします。
投稿日時 - 2001-08-08 16:05:35


  • 回答No.3

>ログファイルを読み込み$words[]に値を入れた後に  ここでいう展開処理とは、「変数入りの文字列を完全な文字列に変換する」という処理ではなく、「いつでも完全な文字列に変換できるよう準備する」という意味です。  ゆえに、$word[0] の内容が途中で変わっても正しく出力できるのです。  ですので、「ログファイルを読み込む」という処理を行った時点でコンパイルはすでに終わってしまっているので、 ...続きを読む
>ログファイルを読み込み$words[]に値を入れた後に
 ここでいう展開処理とは、「変数入りの文字列を完全な文字列に変換する」という処理ではなく、「いつでも完全な文字列に変換できるよう準備する」という意味です。
 ゆえに、$word[0] の内容が途中で変わっても正しく出力できるのです。

 ですので、「ログファイルを読み込む」という処理を行った時点でコンパイルはすでに終わってしまっているので、そのあといくら$の入った文字列が来ても、$は$としてしか扱われないのです。

 ほかにいくらでもやりようはあると思いますので、そっちを模索した方が早いですよ(^_^;
お礼コメント
kitakitakita

お礼率 66% (2/3)

親切かつ迅速な
ご回答ありがとうございました。

今回のご回答できれいさっぱり理解できました。

まだまだ勉強不足ですね。(^_^;
ほんとうにありがとうございました。
投稿日時 - 2001-08-08 17:46:29
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ