• ベストアンサー

全行読み込むには

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
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

Perlは行テキスト指向処理なので open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; @A_DATA = <IN>; ## 配列に読み込む:スカラ型だと1行目しか入らない。 close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = join("\n",@A_DATA); ## どうしても全行スカラ型に入れたいなら、各行ごとに好きな記号(ここでは改行)をつけてくっつける。 となります。 また「IN」とはしないで「IN01」などとした方が悪い癖が付かなくて良いと思います。

yasainet
質問者

お礼

有難うございます。おかげさまで解決することが出来ました。

その他の回答 (2)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

perlでは、テキストの読み込みの際に参照する「行区切り」を指定する変数 "$/"があります。 質問文の方法のように1回読み込みを行うとファイルの先頭から行区切りまでを1行として読み込みます。 一度にファイル全体を読み込むには、"$/"にundefをセットします。 $/ = undef; なお、$/に別の文字を代入するとその文字が行区切り文字とみなされます。 $/ = 'a' # 'a'という文字まで読み込むようになる

yasainet
質問者

お礼

有難うございます。意味合いを調べてみて、教えていただいた方法も勉強してみようと思います。

回答No.1

<IN>はスカラコンテキストですと1行ずつ結果を返し、読み込める行がなくなるとundef値を返します。よって、 while($f_data = <IN>){ # 繰り返したい処理 } とやると、1行目から最後の行まで処理されます。

yasainet
質問者

お礼

有難うございます。出来ました。

yasainet
質問者

補足

申し訳ございません。よく見直してみましたら、二行目以降は読み込まれるようになったのですが、一行目が読み込まれていませんでした。以下のように変更してみましたが、どこがおかしいのでしょうか? open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; while($f_data = <IN>){ $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; print "$f_data1"; print "$f_data2"; } select STDOUT; close( OUT ) or die "Can't close word.js: $!"; close( IN ) or die "Can't close pass.dat: $!";

関連するQ&A

  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 指定の行数目から行を抽出する

    いつもお世話になっております. 環境はWindows XP Pro でActiveperlを使っています. Perlでしたいことは,「指定の行数目から行を抽出する」ことです. 具体的には以下のようにしたいと思っております. data.txt A B C D E F line.txt 2 4 6 output.txt B D F 先ほどある方からサンプルソースを教えてもらったのでそれをベースに作ってみましたが,出力のoutput.txtが空のままです. use strict; use warnings; use feature ':5.10'; use IO::File; open my $file2, '<', 'line.txt' or die "can't open input $!"; chomp(my @subjects = <$file2>); close $file2; open my $newfile, '>>', 'data_out.txt' or die "can't open output $!"; open my $file, '<', 'data.txt' or die "can't open input $!"; while (my $line = <$file>) { chomp $line; foreach my $line (@line) { print $line; if ($. eq $subjects){ say {$newfile} $line; } } } close $file; close $newfile; どこが間違っているのでしょうか.ご指摘ください.よろしくお願いします.

    • ベストアンサー
    • Perl
  • データからある文字列の次の行を出力するには

    perlの初心者です。はじめまして。 質問タイトルそのままなのですが、データからある文字列の次の行を出力するにはどのような記述をすればよろしいでしょうか?よろしくお願いします。 ・データは1ファイルで2000あります。1つのデータは[X,Y]で始まり、次の[X,Y]の前までになります。 ・出力はCSVファイル。 ・DAT errがあった場合はその次の行を出力。なかったら、DAT列は空白にする。 #!/bin/perl open(FILE,"<$ARGV[0]"); open(OUT,">$ARGV[0].csv"); ########################## err count ########################### print OUT "X,Y,NUMBER,DAT,\n"; while(<LOG>){ if($_ =~ /X=(.+)\,Y=(.+)/){ chomp($_); print OUT "\n$1,$2,"; } if($_ =~ /NUMBER (.+)/){ print OUT "$1,"; } if($_ =~ /DAT err/){ print OUT "PASS,0,"; } } close(OUT);

    • ベストアンサー
    • Perl
  • UTF-8に変換

    open( IN, "data.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">log.cgi" ); select OUT; foreach( @f_data ){ if( $i > 10 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1階 $f_data4\n"; $i++; } #書き出し先ファイルを閉じる select STDOUT; close( OUT ); 上記スクリプトでlog.cgiに書き出される文字コードをUTF-8に変換したいのですが、いろいろな解説サイトの説明通りに行うと、私のやり方が間違っているだけだと思いますが、サーバエラーになっていまいます。サーバはxrea.comを利用しております。 data.cgiの文字コードはSJISです。 上記スクリプトの場合は、どのように変更すればよろしいのでしょうか?宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • ログファイルの指定行に書込み

    open(IN,"$log") || &error("Open Error"); @data = <IN>; close(IN); while (100 <= @data) { pop(@data); } open(OUT,">$log") || &error("Write Error"); print OUT "$in{'id'}<>$in{'comment'}\n"; print OUT @data; close(OUT); ログにはID、時間、コメントが登録されています。 送信データの中に、ログに登録済みのIDがある場合には、そのIDのある行のみを書き換えたいのですが、方法がどうしてもわかりません。 $logに記録されるIDの順番は以下のようにランダムです。IDに登録される文字列は1からの数値のみです。 52<>コメント 120<>コメント 35<>コメント 8<>コメント 2<>コメント 19<>コメント 85<>コメント よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 特定の数字を抜いて、行をずらしたいです。

    0 1 2 3 4      9 8 7 6 5 6 5 4 3 2 7 8 6 9 2 8 0 9 8 1   ↓ 0 1 2 6 4 9 8 7 3 5 6 5 4 9 2 7 8 6 8 2 8 0 9 最初の行のひとつの数字(左から4つ目:3)を抜いて、行をずらしたいのですが、つまづいています。 open (IN,"< $ARGV[0].csv") or die; open (OUT,"> $ARGV[0]_out.csv") or die; ####################################################### while($line =<IN>){ ($a, $b, $c, $d, $e) = split(/\s+/,$line); if($d == "3"){ $d == "" } print OUT (////////\n); } 分割してから、3を抜いてずらしたいのですがうまくいきません。 お助けいただきたく、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • Perlで行頭にある文字が含まれている行を全部削除して詰めたい

    perl初心者です。以下のようにデータがならんでいる時、 test111 aaaaaaaaabbbbbbbbcccccc test112 aaaaccccabbbbbbbbcccccc test113 aaaaccaaabbbbbbbbcccccc test114 acccaaaaabbbbbbbbcccccc test111 aacaaaaaabbbbbbbbcccccc test112 accaaaaaabbbbbbbbcccccc test113 aaacccaaabbbbbbbbcccccc test114 aaaaaccaabbbbbbbbcccccc test112の行だけ削除して、さらにそこを詰めたい時のスクリプトを作成しています。 途中からわかりません。 行を削除する関数が調べても見つからないのです。 #!/usr/bin/perl ; open(IN, "test.doc") or die ; open(OUT, ">testout.doc"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^test112(\S+)/) { #ここでマッチさせて、一気に行を削除して、しかも行を詰めたいのですが ; } print OUT " \n" ; } } close (IN) ; close (OUT) ; 大変困っております。宜しくお願いします。

    • ベストアンサー
    • Perl
  • 配列の値の操作について教えてください

    num.datの内容が 100 200 300 400 500 の時、以下を実行すると open(IN, "./num.dat"); @number = <IN>; close (IN); $number[0] = $number[0] - 10; open(OUT, ">./num.dat"); print OUT @number; close(OUT); 書き出されたnum.datの内容は 90200 300 400 500 のようになってしまいます。これを 90 200 300 400 500 にしたいのですがどうすればよろしいのでしょうか?くだらない質問ですが、何卒ご教授の程よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 掲示板を全削除機能にしたいのですが

    現在使っている掲示板は投稿を個別に削除は出来るのですが、一括削除は出来ません。一括削除だけしたいのですが、一括削除できる定型文のようなものはあるのでしょうか?よろしくお願いします。(Iモード用BBSです。本CGIスクリプトのメンテ部分です。) sub mainte { my($del) = (0); if($form{'pass'} ne $mainte_pass){ &error ("bad password."); } $out_val{'pass'} = $form{'pass'}; if($form{'id'}){ # delete if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); open (OUT, "> $log_file.$$") or &error ("can't open $log_file.$$ to write $!"); $del = 0; while(<IN>){ if(/^$form{'id'}\t/){ $del = 1; next; }else{ print OUT $_; } } close IN; close OUT; if($del){ rename $log_file, "$log_file.bak"; rename "$log_file.$$", $log_file; chmod 0666, $log_file; $msg = qq|$form{'id'}番の投稿を削除しました。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); }else{ unlink "$log_file.$$"; $msg = qq|$form{'id'}番の投稿は存在しません。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); } } }else{ if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); while(<IN>){ ($id, $time, $name, undef, $title ) = split "\t"; $out_val{'del_list'} .= qq|$id, $time, $name, $title<BR>\n|; } &page_out($mainte_page); } } unlock($log_file); return 1; }

    • ベストアンサー
    • CGI