1

空行をカウントしてファイルから消去し、変更を新しいファイルに保存するスクリプトを作成しようとしています。

if (@ARGV != 2) {
  print "Usage: $0 infile outfile\n";
  exit;
}
$infile = @ARGV[0];
$outfile = @ARGV[1];
open($old, "<$infile");
open($new, ">$outfile");
@mass = <$old>;
foreach $newc(@mass) {
    $counter++;
    if ($_ =~ /^$/) {
        print "blank line found in $old at line number $counter\n";
        print $new;
    }
}
close($new);
close($old);

しかし、それは機能していません。どこが間違っていますか?

4

5 に答える 5

4

別のオプションは次のとおりです。

use strict;
use warnings;

@ARGV == 2 or die "Usage: $0 infile outfile\n";

open my $fhIN,  '<', $ARGV[0] or die $!;
open my $fhOUT, '>', $ARGV[1] or die $!;

while (<$fhIN>) {
    if (/\S/) {
        print $fhOUT $_;
    }
    else {
        print "Blank at line $.\n";
    }
}

amonが示したように、最初にファイルの行を配列に読み取らずに、ファイルの行を反復処理できます。このスクリプト$.は、ファイルの現在の行番号を含む も利用します。正規表現/\S/は、行に空白以外の文字がないかどうかをチェックします。これは空白行でないことを示します。が true の場合/\S/は に行を書き込み、そうでない場合はoutfile空白行の通知を出力します。

ファイル ハンドルは (推奨される方法)の 3 つの引数形式でopenレキシカルにスコープされるため、ファイルはcloseスクリプトの最後で自動的に処理されます。


さらに一歩進んで、STDIN、STDOUT、および STDERR を利用して、最大の柔軟性と有用性を実現することもできます。

use strict;
use warnings;

while (<>) {
    if (/\S/) {
        print;
    }
    else {
        print STDERRR "Blank at line $.\n";
    }
}

次に、使用するだけです

script.pl file.in >file.out

それ以外の

script.pl file.in file.out

しかし、次のようなこともできます

prog1 | script.pl | prog2
于 2013-01-16T20:09:27.590 に答える
2

$newcループで使用せず、空白行のみを出力します

foreach $newc (@mass) {
    $counter++;
    if ($newc =~ /^$/) {
        print "blank line found in $old at line number $counter\n";
    } else {
        print $new $newc;
    }
}

コメントで既に述べたように、 と を使用$ARGV[0]$ARGV[1]ます。$ARGV[0]は の最初の値ですが@ARGV@ARGV[0]はスライスです。詳細については、スライスを参照してください。

于 2013-01-16T19:01:55.363 に答える
1

の行には@massまだ末尾の改行が含まれています。正規表現でそれを考慮するか、値をむさぼり食ってください。

ループを次のようにコーディングします

while (<$old>) {
  chomp;
  say {$new} $_ if length;
}

また、open の戻り値をテストします。

open my $old, "<", $infile or die qq(Can't open "$infile": $!);

ワンライナーとしてのコード全体:

perl -nE'chomp; say if length' infile.txt >outfile.txt

また

perl -nE'chomp; if(length){say}else{say STDERR "blank on line $."}' infile.txt >outfile.txt

($.は現在の入力行番号です。)

于 2013-01-16T19:00:15.937 に答える
-2
if (@ARGV != 2) {
  print "Usage: $0 infile outfile\n";
  exit;
}

$infile = $ARGV[0];
$outfile = $ARGV[1];
open(OLD, "<$infile");
open(NEW, ">$outfile");
while ($line = <OLD>) {
    print NEW $line unless ($line =~ /^$/);
}
close(NEW);
close(OLD);
于 2013-01-16T19:06:22.207 に答える
-2

スクリプトは次のようになります。

if (@ARGV != 2) {
  print "Usage: $0 infile outfile\n";
  exit;
}
$infile = $ARGV[0];
$outfile = $ARGV[1];
open $old, "<", $infile;
open $new, ">", $outfile;
@mass = <$old>;
$counter = 0;
foreach $newc (@mass) {
    $counter++;
    if ($newc =~ /^$/) {
        print "blank line found in $infile at line number $counter\n";
    } else { # print in the new file when not an empty line!
        print $new $newc;
    }
}
close($new);
close($old);
于 2013-01-16T19:04:12.777 に答える