• ベストアンサー

変数の展開の展開

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"; とすれば展開されるのですが・・・・。 別のファイルにこのような変数を含む式を記述してもだめなのでしょうか。 それともなにか、特別な方法があるのでしょうか? 教えてください。 よろしくお願い致します。

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

  • ベストアンサー
noname#25358
noname#25358
回答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
質問者

補足

ご回答ありがとうございます。 わかりにくい説明で申し訳ありません。deagleさんの理解して頂いた通りのことがやりたかったのですが、もともとの私の勘違いというか誤解だったのですね。(勉強不足です。) ばかを披露したついでに、ご回答について、もう一度ご質問です。 コンパイルを行う際に展開処理がされるということですので、 ログファイルを読み込み$words[]に値を入れた後に、設定ファイルを読み込んで$formatに$words[3]\t$words[0]\t$words[2]\t$words[1]\nをいれたとしてもそれは展開されないのですか?(^_^; (実際にはそれでもできなかったのですが。) 呆れずにご返答下さい。

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

その他の回答 (2)

noname#25358
noname#25358
回答No.3

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

kitakitakita
質問者

お礼

親切かつ迅速な ご回答ありがとうございました。 今回のご回答できれいさっぱり理解できました。 まだまだ勉強不足ですね。(^_^; ほんとうにありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

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

kitakitakita
質問者

お礼

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

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

関連するQ&A

  • 一変数テイラー展開の一般項

    お気に入り f(x)=log(x+√(1+x^2))とするとき、x=0におけるテイラー展開をしました。f(x)を微分していくと f'(x)=1/(x^2+1)^(1/2) f''(x)=-x/(x^2+1)^(3/2) f'''(x)=(2x^2-1)/(x^2+1)^(5/2) f''''(x)=-3(2x^3+3x)/(x^2+1)^(7/2) f'''''(x)=3(8x^4-24x^2+3)/(x^2+1)^(9/2) f''''''(x)=-15x(8x^4-40^2+15)/(x^2+1)^(11/2) f'''''''(x)=45(16x^6-120x^4+90x^2-5)/(x^2+1)^(13/2) となりました。これをマクローリン展開の公式に代入すると f(x)=x-(x^3)/6+(3x^5)/40-(5x^7)/112…剰余項 となりました。 一般項を求めたいのですが、 f'(x)=1/(x^2+1)^(1/2)のときx^2=tと置き、 g(t)=(t+1)^(-1/2)としました。 g(t)についてn回微分し g(n回微分)(t)=(‐1)^n*(((2n-1)!!)/2^n)*(1+t)^-((2n-1)/2) となりました。 g(t)についてt=0の時テイラー展開したところ g(t)=1-t/2+3t^2/8-5t^3/16+…+((‐1)^n*(((2n-1)!!)/2^n))/n!+Rt となりました。 f'(x)=g(x^2)なのでg(t)のテイラー近似にx^2を代入したものがf'(x)のテイラー近似になることはわかりました。 しかしf(x)とf'(x)のテイラー近似は 数式的にはf(x)=∫f'(x)dxになると思いますが、 それには証明が必要になると言われました。また、gとfの関係をはっきりさせ、g(t)のテイラー展開からf'(x)のテイラー展開を求め、 それがf'(x)のテイラー展開と一致することからf'(0)、f''(0)…をもとめ、それを用いてf(x)のテイラー展開を書けばよいらしいのですが、 どのようなステップを踏めば良いか分かりません。 お力をお貸しください。

  • テーラー展開とマクローリン展開

    独学なのでいまいちはっきりわからなく。。。 f(x)のテーラー展開 Σ(n=0~∞) (☆/n!)(x-a)^n (☆はf(x)をn回微分したものにaを代入した値) 1)マクローリン展開はテーラー展開の一種である。(テーラー展開のaに0を代入したものをマクローリン展開という) 2)aに代入する値は別に何の数字であっても展開はできる 3)テーラー展開は基本的に無限回微分可能な関数をf(x)=多項式の形に直すのに使われる という理解でいいのですか? 間違ってたら訂正お願いします。 またこれはいつ使うのでしょうか。。?

  • プログラミングの変数について質問です。

    プログラミングの変数について質問です。 次のプログラミングは自分で書いたプログラムの一部です。 void inputmonster(int x[][3], struct monster monster) { int i, s, t, m, n; for(t = 0; t < 2; t++){ s = 0; while (s < 1){ printf("player%dは好きなモンスターを3つ選んでください\n\n", t+1); for (i = 0; i<3; i++){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); scanf("%d", &x[t][i]); printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &n); if(n == 1) s = 1; else s = 0; } } } これをコンパイルすると次のようなエラーが表示されます。 monsterbattle.c: 関数 ‘inputmonster’ 内: monsterbattle.c:497:63: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(m = 0; m < 5; m++) printf("%d, %s\n", m+1, monster[m].name); ^ monsterbattle.c:499:45: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません printf("%d体目 : %s\n\n", i+1, monster[x[t][i]-1].name); ^ monsterbattle.c:503:68: エラー: 添字が付けられた値が、配列、ポインタまたはベクト ルではありません for(i = 0; i<3; i++) printf("%d体目 : %s ", i+1, monster[x[t][i]-1].na me); どのように改変すればこのようなエラーを表示しないようにできるのでしょうか? 基本的な質問ではあると思いますが、是非教えていただけるとありがたいです。 よろしくお願いします。

  • √1+√2+√3+…+√nの漸近展開

    http://en.wikipedia.org/wiki/Euler-Mascheroni_constant によると 1+1/2+1/3+…+1/n =γ+log(n)+(1/2n)-Σ[k=2,∞](k-1)!C(k)/n(n+1)…(n+k-1) という漸近展開があるそうです。漸近展開とは、簡単に言うと、nが十分に大きい場合の近似式です。 http://en.wikipedia.org/wiki/Stirling%27s_approximation によると n! =√(2πn)*(n/e)^n*e^λ(n) という漸近展開があるそうです。 ところで、 √1+√2+√3+…+√n などの漸近展開をご存知の方がいらっしゃれば教えてください。 y=√xのグラフとy=√(x+1)のグラフではさまれた面積と考えることで、 √1+√2+√3+…+√n =(2/3)n√n+… となることはわかるのですが、 √1+√2+√3+…+√n =(2/3)n√n+α√n+… とさらに精密にしたいとき、αがどういった定数になるのかわかりません。

  • マクロの展開

    #define A(str) str\n #define B(str) #str #define C(str) printf(B(A(str)); int main() { C(hello) } をプリプロセスすると入れ子になったマクロAが展開されずに  printf("A(hello)"); となってしまいます。  printf("hello\n"); と展開されるようにするにはどうしたらいいでしょうか?  よろしくお願いします。  

  • logのテイラー展開と多価

    自然対数log(x)を複素数で定義すると多価になります。 一方で、テイラー展開した式には多価性は出てきません。 log(1+x)=Σ[n=1,∞]{(-1)^(n+1)/n*x^n} 質問1.テイラー展開すると、何故多価でなくなるのでしょうか? 質問2.テイラー展開の式から、多価性を導き出せますか? つまり、テイラー展開した式からlog(1+x)=log(1+x)+2πiが求まりますか?

  • どこがおかしいのでしょうか??

    下のプログラムはsinの級数展開を求めるプログラム…を書いたつもりなんですが計算機と違う値がでてしまい困っています。どこをどう直せばいいのか教えてもらえませんでしょうか??それともこのプログラムではうまくいかないのでしょうか?返答をお願いします。 #include <stdio.h> #include<math.h> #define NMAX 100 main() { float eps,x,t,s; int n; printf("Taylor series\n"); scanf("%g", &eps); printf("eps=%g\n", eps); for(;scanf("%g", &x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n", x); t=s=x; for(n=1;n<NMAX;n++){ t*=-x*x/((2*n+1)*(2*n)); s+=t; printf("%2d %15.6e %15.6e\n", n, t, s); if(fabs(t)<eps) break; } if(n>=NMAX) printf("--- not converged ---\n"); printf("exp(%g)=%g\tn=%d\n", x, s, n); } return(0); }

  • 一変数テイラー展開の問題がわかりません。

    見ていただきありがとうございます。 問題は次です。 f(x)=sinhx (但し、sinht={e^t-e^(-t)}/2とする。) (1)f(x)のx=1におけるテイラー展開を最初の0でない3項まで求めよ。 計算した結果は次です。 (2)f(x)のx=1におけるテイラー展開を一般の次数まで(n次)求めよ。 sinhx={e-e^(-1)}/2+{(e+e^(-1))/2}×(x-1)+{(e-e^(-1))}/4}×(x-1)^2+(余剰項) 一般項なんですが求めてみたのが次です。 (1/n!)×{〈e+(-1)^n〉e^(-1)}/2となりました。 あっているかわからないので確認よろしくおねがいします。 もし間違っていたなら、回答よろしくお願いします。

  • sinのプログラム

    #include<stdio.h> #include<math.h> #define NMAX 100 main(){ float eps,x,t,s; int n; printf("Taylor series\n"); scanf("%g",&eps); printf("eps=%g\n",&x); for(;scanf("%g",&x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n",x); t=s=1; for(n=1;n<NMAX;n++){ t*=X/n; s+=t; printf("%2d %15.6e %15.6e\n",n,t,s); if(fabs(t)<eps) break; } if(n>=NMAX) printf("---not converged ---\n); printf("exp(%g)=%g\tn=%d\n",x,s,n); } return(0); } これはeの級数展開をもとめるプログラムなのでが、これをsinの級数展開のプログラムに改造しろという問題があります。 sinのn乗の項を求めてeの部分と置き換えてやってみたのですができません。 どなたかわかる方がいましたら、教えてください。

  • フーリエ級数展開についてです。 急いでます。

    (1)下の図のような周期2の関数がある。これをf(t)=|t| (-1<t<1)とし、そのフーリエ級数展開を求めなさい。なお、フーリエ級数展開はフーリエ係数を求めそれらの係数を用いて与式を展開すること。          |        /\ |   /\ _\/__\|/__\/___      -1       1   (2) 上の結果を用いて、Σ 1/(2n-1)^2=(π^2)/8となることを導きなさい。          (n=1~∞) という問題を教えてください。

このQ&Aのポイント
  • 海外で使用する場合の適切なラベルプリンターのテープについて教えてください。
  • パソコンやスマートフォンのOSとの接続方法や関連するソフト・アプリについても教えてください。
  • また、電話回線の種類についてもお知りになりたいです。
回答を見る

専門家に質問してみよう