• 締切済み

perlプログラム

(1)のプログラムではtest.txtの内容を表示することができました。 (2)ではaaaが表示されつづけると思いますが、何も表示されません。 なにかまちがっていると思いますが、わかりません。 よろしくお願いします。 --------------------------------------------------------------------------------- (1) --------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print $_; last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); ------------------------------------------------------------------------------- (2) ------------------------------------------------------------------------------- sub Main() { LAST:while(){ if(defined(open(FILE,"test.txt"))){ flock(FILE,1); while(<FILE>){ print "aaa";  ←変更箇所 last LAST if($_ == 0); } } sleep(1); } close(FILE); } &Main(); -------------------------------------------------------------------------------

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

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> (2)ではaaaが表示されつづけると思いますが、何も表示されません。 なぜ、そう思ったのでしょうか? おそらく、その解釈が間違っています。 このプログラムで"aaa"が表示されつづけるのは、test.txtが一定の条件を満すときだけです。 その条件は「全ての行が、0個以上の空白+数字列で始まっていて、その数値が0でない」ことです。 実際のtest.txtはどうなっているのでしょうか? (1)の方が「表示できた」と言っているので、1行だけのテキストですか?2行目以降があった場合、表示されない可能性が高いので。 > last LAST if($_ == 0); この行の意味、わかってますか? 特に $_ == 0 、わかってますか? 「表示されない」の理由ははっきりしません。test.txtがopenできたら、最低1回は出力されます。 ・test.txtのopenに失敗している ・"aaa"には改行が無いので、 aaaと表示 → プログラム終了 → プロンプト等が行頭から表示されてaaaを上書き(aaaが表示されてないように見える) となっている可能性はあります。 そもそも、「LAST:while(){」で囲ってある意味がわかりません。何を意図したのですか? closeの位置も変です。LAST:while()のループがlastで抜けなかった場合は、FILEをcloseしないままopenを繰り返すことになります。 test.txtの内容が変化しないのなら、何度もopenするのは無駄です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「test.txtの内容を表示することができました」というのは, test.txt がどのような内容であり, それに対していかなる「表示」が得られたことをもって「表示することができました」と判断したのですか? 同様に, 「何も表示されません」というのは test.txt の内容がどうであって, それに対しどのような動作をしたことをもって「表示されません」と断じたのですか? OS や Perl のバージョン, あるいは「どのようにプログラムを動かしたのか」なども書いてもらえませんか?

関連するQ&A

  • Perlのtruncateについて

    + test.txt 0 1 2 3 + main.cgi open(FH, "+<test.txt"); my @Log = <FH>; truncate(FH, 0); seek($FileHandle, 0, 0); print(FH "4"); close(FH); これで、main.cgiを実行すると、test.txtの中身は 4 1 2 3 となってしまいます。truncateがきいてないようなのですが、なぜでしょうか。 truncate(FH, 0) or die "error"; とすると、errorと表示されてしまいます。 なぜこうなるのでしょうか。 致命的エラーがでるわけでもないので、環境が悪いわけではないような気がするのですが。 flockをしたいのですが、他にファイルの中身を空にする方法とかありませんか。

    • ベストアンサー
    • Perl
  • 同じようなソースなのですが片方だけエラーが出てしまいます。

    open(test1,"+<test1.txt"); flock(test1,2); print test1 ""; truncate(test1,tell(test1)); close(test1); open(test2,"+<test2.txt"); flock(test2,2); print test2 ""; truncate(test2,tell(test2)); close(test2); open(test3,"+<test3.txt"); flock(test3,2); print test3 ""; truncate(test3,tell(test3); close(test3); foreach(test1,test2,test3){ open($_,"+<$_.txt"); flock($_,2); print $_ ""; truncate($_,tell($_)); close($_); 上の二つのプログラムなのですが前者は問題なく出来るのですが 後者はtruncateの後にor die("$!"); とおくと"No such file or directory"と表示されてしまいます。 3つともループせずにやるかforeachでやっているかだけで ソース的には同じだと思うのですが何が違うのでしょうか・・・?

    • ベストアンサー
    • Perl
  • Perl 処理速度について

    ブログを作成し、カテゴリー別に分けたく下記のようなソースを 書きました。 sub category1 { open(FILE, "<$FILE") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 100; $back = $start - 100; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @category1); $data = $category1[$i]; &page(); } } これの処理速度が遅いのですが、なにか原因はありますでしょうか? 似たような処理で下記のソースの方が、読み込む内容としては多いのですが、 こちらは普通の速度です。 sub diary2017 { open(FILE, "<diary/diary-2017.txt") or die("error :$!"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; &buffer(); if($start > @DATA) {$start = @DATA;} $next = $start + 1000; $back = $start - 1000; if ($back < 0) { $back = 0; } for ($i=$start;$i<$next;$i++){ last if ($i > @DATA); $data = $DATA[$i]; &page(); } } カテゴリーのサブルーチンとアーカイブ専用のサブルーチンで違う点といえば $a = 0; my @category1 = grep(/,1,/, @DATA); while (<@category1>) { $a++; } このgrepのとこですが、 これが遅いとすると対処方法はありますか? ※開くファイルはアーカイブは直接名前にしてて、カテゴリーは変数を使ってますが  これは同じです。

    • ベストアンサー
    • Perl
  • perl ファイルが開かない

    perl でファイルを開きたいのですが、なぜか開けません。何がいけないのでしょうか?エラーは、 Name "main::file" used only once: possible typo とでます。エラーを見るかぎり、コードに間違いはなく、apacheかOSに何か原因があるのではないかとおもうのですが、悩んでいます。OSはubuntuです。 #!/usr/bin/perl -w open (IN, "<test.txt") or die ("Could not open $file: $!"); while(<IN>) { print "$_"; } close (IN);

  • Perlを使った正規表現について

    テキストファイルを読み込んで、以下のルールに従った文字列だけを.txtで出力するプログラムを書いています。 具体的にはテキストファイル中の "text":"★★★","to_user" で囲まれている★★★の部分のみを抽出したいです。 そこで正規表現に触りだしたのですが、表現がうまくいっていないようで1週間ほどはまっています。。うまく出力できるように直しをいただけないでしょうか。 打ち明けてしまうと、★★★の部分はtwitterの呟き(日本語)になります。 以下がそのソースになります。よろしくお願いします。 print "Input file name: "; $ifname = <STDIN>; open(IN, $ifname); open(OUT, "> out.txt"); #出力ファイル while(<IN>){ if($ifname =" m/"test":(.*?),"to_user"/; next if($_ eq ""); print OUT "$_\n"; #書き出し } close(OUT); close(IN);

    • ベストアンサー
    • Perl
  • ファイルの最後の行から表示させる(最新情報を5回分だけ表示)

    ファイルの最後に1行追加し、6行以上になるとファイルの先頭を1行削除。 表示は最後の行から行うスクリプトを作りたいのです。 新しい情報を5回分だけ表示する様にしたかったのですが、余りにも力技なのでもう少しスマートにやる方法を教えてもらえませんか? ----sort.txt---- 1a 2b 3c 4d ---------------- #!/usr/bin/perl $fname = "sort.txt"; print "Content-type: text/html;\n\n"; $aaa="5e"; open(OUT, ">>$fname"); flock(OUT, LOCK_EX); print OUT "$aaa\n"; flock(OUT, LOCK_NB); close(OUT); open(IN, "$fname"); $cnt = "0"; while($line = <IN>){ $a[$cnt] = "$line"; $cnt++; } close(IN); if($cnt > 5){ open(OUT, ">$fname"); flock(OUT, LOCK_EX); $cnt = "0"; while($cnt < 6){ if($cnt > 0){ print OUT "$a[$cnt]"; } $cnt++; } flock(OUT, LOCK_NB); close(OUT); } $cnt = "0"; open(OUT, "$fname"); @buff = <OUT>; close(OUT); foreach $line ( reverse @buff ){ $cnt++; print "$line<br>\n"; } exit();

    • ベストアンサー
    • Perl
  • Perlでファイルを読み込みタグを削除する方法

    以下のようなソースを書きました。 HTMLファイルを読み込み、タグを全て削除して他のファイルに書き込むソースです。 しかし、上手く動作しません。 問題点を教えていただけませんでしょうか。 お願いします。 #!/usr/local/bin/perl package www3sub2; sub main(){ open(FH, "<googlefile3_.txt"); my @file = <FH>; close(FH); open(OUTB,"> googlefile6.txt"); foreach(@file){ my $line = $_; $line =~ s/<("[^"]*"|'[^']*'|[^'">])*>//g; print OUTB "$line"; close(OUTB); } } 1;

  • flockについて

    ファイルを読み書きする場合に使用するflockですが、closeする前に別ファイルのflockは使用できるのでしょうか? テストしてみたところ、うまくいってるような気もするのですが、確証が持てないので質問させていただきました。 例) $file1="file1.txt"; $file2="file2.txt"; open(OUT,"+<$file") flock(OUT,2); $count1=<OUT>; open(DAT,"<$file2") flock(DAT,1); $count2=<DAT>; close DAT; $count=$count1+$count2; truncate(OUT,0); seek(OUT,0,0); print OUT "$count "; close OUT; ちょっとあえて複雑な書き方としてみましたが、上記のようにflockを使ってる最中に別ファイルのflockを使用することは出来ますでしょうか? 参考URLでも結構ですので、どなたかよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 画像とtxtファイルの表示

    現在CGIでtxtファイルが表示されるように print "Content-type: text/html; charset=euc-jp\n\n"; $count = 0; $viewline = 1; open(IN, "A.txt"); while(<IN>){ if($count == ( $viewline - 1)){ $line = $_; last; } $count++; } close(IN); print "$line\n"; としています。 ここでさらに画像も一緒にCGIで表示させたいのですが、そうゆうことはできるのでしょうか? できるのであれば教えて頂きたいです。調べてみたのですがなかなか見つからなくて・・・。 よろしくお願いします。

    • 締切済み
    • CGI
  • perlの引数が不安定になります。

    perlの引数が不安定になります。 具体的には、 同じ値が返されるはずなのに、返されません。 私の持っている、入門用の本を調べたのですが全くわかりません・・・ 分かる方、教えていただけないでしょうか。 宜しくお願い致します。 open IN, 'Testfile.txt'; #Testfile.txtは、ある程度の大きさがあったほうが良いと思うので、ヤフーのトップページのソース全てなどが適当かもしれません。 my @array = <IN>; close IN; my $count = "1"; print &test(@array,$count); #何も表示されない print "<HR>"; print &test2($count,@array); #1が表示される。 sub test() { my (@array,$count) = @_; return $count; } sub test2() { my ($count,@array) = @_; return $count; }

    • ベストアンサー
    • Perl

専門家に質問してみよう