0

私は初心者のPerlユーザーで、今日は時間通りに家に帰れるようにできるだけ早く仕事を終わらせようとしています:)

基本的に、空白行の次の行をテキスト ファイルに出力する必要があります。

以下は私がこれまでに持っているものです。空白行を完全に見つけることができます。あとは次の行を印刷するだけです。

    open (FOUT, '>>result.txt');

die "File is not available" unless (@ARGV ==1);

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n";

@rawData=<FIN>;
$count = 0;

foreach $LineVar (@rawData)
    {
        if($_ = ~/^\s*$/)
        {
            print "blank line \n";
                    #I need something HERE!!

        }
        print "$count \n";
        $count++;
    }
close (FOUT);
close (FIN);

本当にありがとう :)

4

5 に答える 5

5
open (FOUT, '>>result.txt');

die "File is not available" unless (@ARGV ==1);

open (FIN, $ARGV[0]) or die "Cannot open $ARGV[0]: $!\n";

$count = 0;

while(<FIN>)
{
    if($_ = ~/^\s*$/)
    {
            print "blank line \n";
            count++;
            <FIN>;
            print $_;

    }
    print "$count \n";
    $count++;
}
close (FOUT);
close (FIN);
  • ファイル全体を @rawData に読み取らないと、特に大きなファイルの場合にメモリが節約されます...

  • <FIN>コマンドが次の行を $_ に読み込むように

  • print ;それ自体は同義語ですprint $_;(今回はより明示的なバリアントを選択しましたが...

于 2009-07-03T15:25:15.470 に答える
2

Ron Savageのソリューションについて詳しく説明します。

foreach $LineVar (@rawData)
    {
        if ( $lastLineWasBlank ) 
           {
                print $LineVar;
                $lastLineWasBlank = 0;
           }
        if($LineVar  =~ /^\s*$/)
        {
                print "blank line \n";
                    #I need something HERE!!
                $lastLineWasBlank = 1;
        }
        print "$count \n";
        $count++;
    }
于 2009-07-03T15:24:10.933 に答える
1

私はこのように行きますが、おそらく他の方法があります:

for ( my $i = 0 ; $i < @rawData ; $i++ ){
   if ( $rawData[$i] =~ /^\s*$/ ){
       print $rawData[$i + 1] ; ## plus check this is not null
   }
}

J.

于 2009-07-03T15:16:23.853 に答える
0
sh> perl -ne 'if ($b) { print }; if ($b = !/\S/) { ++$c }; END { print $c,"\n" }'

好みに合わせて入力ファイル名を追加します。

于 2009-07-03T17:32:03.637 に答える
0

$lastLineWasBlank のような変数を追加し、各ループの最後に設定します。

if ( $lastLineWasBlank ) 
   {
   print "blank line\n" . $LineVar;
   }

そんな感じ。:-)

于 2009-07-03T15:16:05.040 に答える