• ベストアンサー

このスクリプトの意味を教えてください。

大変恐縮なんですが、下記のスクリプトは何をしようとしているのか判りやすく教えて下さると助かります。 C言語やDelphiなどならわかるのですが、perlは全く知らないもので・・・ open(SRC, "a.u") || die; open(DST, "> a.v") || die; select DST; while (<SRC>) { if (/^`eval/) { s/$&//; eval; } else { print; } } close SRC; close DST; exit 0;

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

open(SRC, "a.u") || die; # ファイル"a.u"を読み込みのために開く (||失敗したらスクリプトを強制終了) open(DST, "> a.v") || die; # ファイル"a.v"を書き込みのために開く (||失敗したらスクリプトを強制終了) select DST; #標準出力を(STDOUTから)DST("a.v")に変更 while (<SRC>) {#ファイルハンドルSRCより行単位で読み出し if (/^`eval/) {# 行先頭が"`eval"と一致するか? s/$&//; マッチした部分を''に置換→"`eval"の削除 eval;# 行をPerlのコードとして実行 } else { print;# 行を標準出力に出力 } } close SRC; close DST; exit 0; ファイルa.uを読み、 `eval で始まる行は`evalより後ろをPerlのコードとして実行。 そうでない行はa.vに出力。 といったことをやってるようです。 `eval というのがなんとなく怪しげ… 微妙な記号違いで意味が違う(変わる)場合があります。

参考URL:
http://www.rfs.jp/sitebuilder/perl/index.html
lachesis-r
質問者

お礼

丁寧な回答ありがとうございます! 上記の意味は成る程わかったと思います(?)。 が、結局SRCの中の `eval の行がPerlのコードとは・・ これが難解でして・・汗 兎に角ありがとうございました。

その他の回答 (1)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

ファイル「a.u」の中の文字列を ファイル「a.v」に移す作業をしています。 ただし「`eval」と言う文字列があった場合は書き込まない。(`ってメタ文字じゃないよねぇ?たぶん・・・) open(SRC,"a.u"); @SRC = <SRC>; close(SRC); foreach $src (@SRC) { if ($src =~ /^`eval/) { $src = s/$&//; eval; } else { $DTS .= $src; } } open(DST,">a.v"); print DST $DST; close(DST); 書き直すとこんな感じですか? 間違っているかもしれないので、自信ないです。

lachesis-r
質問者

お礼

早速の回答ありがとうございます! 上記の意味はわかったと思います(?)。 ・・が、結局SRCの中の `eval の行がPerlのコードなんですね・・・・ ここがまたなんとも難解なので、目的には到達できませんね(汗

関連するQ&A

  • CRLFをLFに変換したい

    テキストファイルを 1)SJIS → UTF-8 2)CRLF → LF に変換させたいのですが、1)はうまく出来たのですが、 2)がうまくいかず困っています Set Src = CreateObject("ADODB.Stream") Src.Open Src.Type = 2 Src.Charset = "Shift_JIS" Src.LoadFromFile "test.txt" Set Dst = CreateObject("ADODB.Stream") Dst.Open Dst.Type = 2 Dst.Charset = "UTF-8" Dst.LineSeparator=10 Src.CopyTo Dst Src.Close Dst.SaveToFile "utf-out.txt", 2 Dst.Close 改行コードが何も変化しません。 どうすればよいか教えてください。 ADODBではじめからファイルに書き込んでいく方法でもかまいません。

  • ランダムスクリプトの仕様を変更したい

    以下ソースはランダムに画像を差し替えるスクリプトですが、これを利用して画像ではなくhtmlファイルを差し替えるようにしたいのですが可能でしょうか? #!/usr/bin/perl $n = 3*60*60; # 画像を変更する秒数 $imgdir="./image/"; if(!opendir(DIR,$imgdir)){ print "Content-type: text/html\n\n"; print "Directory open error.\n"; exit(1);} $k = @file = grep /\.(?:jpg|gif)$/, readdir(DIR); closedir(DIR); $a = int(time / $n) % $k; open(IMAGE, "$imgdir$file[$a]"); binmode(IMAGE); $size=read(IMAGE,$image, -s IMAGE); close(IMAGE); if($file[$a] =~ /\.jpg$/){print "Content-type: image/jpeg\n\n";} else {print "Content-type: image/gif\n\n";} binmode(STDOUT); print $image; exit; ど素人なもので試行錯誤しております(汗)。どうぞよろしくお願い致します。m(_)m

  • Perl ファイルハンドルを閉じずに反映させる

    お世話になっております。 Perl(プログラミング言語)について質問です。 openメソッドで開いたファイルハンドルに print文で書込みを行った際に、ファイルハンドルをcloseせずに、 書込みを反映させる方法はありますか? 開くのはファイルではなく(他プロセスへの)パイプです。 $| を設定してもだめでした (例としては perl1.pl , perl2.pl を用意する <perl1.pl> $i; open(OUT,"| perl2.pl") while(1){ print OUT "$i" $i++  } close(OUT) <perl2.pl> while( <STDIN> ) { print $_; } のようなことをやりたいです。 上記のようなスクリプトを実行したところ、 perl1のcloseが実行されるまで反映されません。 これをcloseをせずに反映させる方法はありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • 全行読み込むには

    open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; print "$f_data1"; print "$f_data2"; select STDOUT; close( OUT ) or die "Can't close word.js: $!"; 上記スクリプトでは、pass.datの一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。

    • ベストアンサー
    • Perl
  • perlで、文字列の中から何番目から何番目までの文字を抜き出したい

    perl初心者です。 文字列の中から何番目から何番目までの文字を抜き出して 別のファイルにうつす、 というスクリプトを書いています。 でも、うまくうごいてくれません。。。 恐らく、根本的におかしな部分があると思いますし、 さらに、何番目から、は指定できていても、 次の数字は文字数を意味しているのだと思いますので、 意図するものと違う気がします。 ただ、何番目から何番目 という情報だけを入力してできたら作業上大変助かります。 本当に困っております。 アドバイスをいただけると幸いです。 大変急いでおります(;;)。 宜しくお願いします!!! #!/usr/bin/perl ; open(IN, "test.txt") or die ; open(OUT, ">after_test"); while(<IN>) { chomp ; if (/(\S+)/) { \S = $S substr ($S, 12345, 12389) = { print OUT "$_\n"; } } } close (IN) ; close (OUT) ;

    • ベストアンサー
    • Perl
  • ScriptがTABLEタグの中に表示されません。

    下記の様にScriptを使ってTABLEタグの中に表示させようと思ったのですが、test2.jsの「あれ?」がTABLEタグ欄に表示されません。 何方かご教授してもらえませんか? ↓↓↓↓<HTML File>↓↓↓↓ <HTML><BODY> <script src="./test1.js"></script> </BODY></HTML> ↓↓↓↓<test1.js File>↓↓↓↓ document.open(); document.write("<TABLE border=1><TBODY><TR><TD>1</TD><TD>おや?<script src=\"./test2.js\"></script></TD></TR><TR><TD>1</TD><TD>1</TD></TR></TBODY></TABLE>"); document.close(); ↓↓↓↓<test2.js File>↓↓↓↓ document.open(); document.write("あれ?"); document.close();

  • Perl 教えてください。

    下記のような簡単なスクリプトなんですが、なぜかサーバーにアップすると動きません。 ローカルでコマンドプロンプトから直接実行するとまともに動作します。 パーミッションは「755」と「705」でやってみましたが。 perlのパスは合っていますし、実際同じ場所に置いた他のCGIは動作します。 #!/usr/bin/perl open (DT, "<./data/***/***.csv") or die "File '***.csv' Open Error."; @data = <DT>; $data[0] = ",,,,,,\n"; open (OUT,">./data/***/***1.csv") or die "File '***1.csv' Open Error."; print OUT @data; close (DT); close (OUT); 原因が分からず困っています。 解決策でなく、原因と思えるだけの回答で結構ですので何卒よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 初心者で、困っています。(文字化け)

    すみません、すごく初歩的なことで困っています。 本を見ながら、下のようなものを書いたのですが、 出力すると、文字化けをしてしまいます。ウィンドウズの環境で、Perlは5.8を使い、読み込みのテキストはUnicodeです。どのようにすれば、文字化けをしないで、読み込めるのでしょうか。 open ( IN , "LBa3_00028.txt" ) or die; open ( out , ">out.txt" ); while ( $line = <IN>){ print out "$line\n"; } close(out); close(IN);

    • ベストアンサー
    • Perl
  • document.open()の意味とは

    HTML文書中、Javascriptのdocument.writeで文章を挿入します。 ■HTML------------------ <html><body> 文字列 <script language="JavaScript" src="message.js"></script> 文字列 </body></html> ■message.js------------ document.open(); document.write("<a href=\"---\">リンク<\/a>]"); document.close(); ------------------------ この場合、message.js中はdocument.open();とdocument.close();を書くのは正しいことですか? document.open();の意味を調べると「ドキュメントを開いて書込み可能にします。」とあって、その「ドキュメントを開く」という意味合いが理解できません。 http://www.tohoho-web.com/js/document.htm 上記でブラウザでは狙ったとおり(文字列が埋め込まれた状態)に表示されますが、 1、正しい書き方なのか 2、この場合document.open();の意味 を教えてください。

  • system で実行したプログラムの標準出力を変数で受け取りたい

    実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう