2

了解しました。別の質問に戻ります。Pythonには、コマンドプロンプトが表示されるまで、ファイルを指定せずにファイルを読み込む方法があることを知っています。したがって、基本的には、スクリプトを設定して、必要なファイルを読み取ることができ、毎回戻ってコーディングを変更する必要がないようにすることができます。Perlでこれを行う方法はありますか?もしそうなら、あなたもそのようなファイルを書くことができますか?ありがとう。

これは私が持っているものです:

open (LOGFILE, "UNSUCCESSFULOUTPUT.txt") or die "Can't find file";       
open FILE, ">", "output.txt" or die $!;

while(<LOGFILE>){
print FILE "ERROR in line $.\n" if (/Error/);
}






close FILE;
close LOGFILE;                  

これは私が名付けたものです:

#!/usr/local/bin/perl


my $argument1 = $ARGV[0];
open (LOGFILE, "<$argument1") or die "Can't find file";     

open FILE, ">>output.txt" or die $!;


while(<LOGFILE>){
print FILE "ERROR in line $.\n" if (/Error/);
}





close FILE;
close LOGFILE;

そして、それはまだ追加されていません...

4

3 に答える 3

3

コマンドライン引数はで提供され@ARGVます。にファイル名として渡すなど、好きなように行うことができますopen

my ($in_qfn, $out_qfn) = @ARGV;
open(my $in_fh,  '<', $in_qfn ) or die $!;
open(my $out_fh, '>', $out_qfn) or die $!;
print $out_fh $_ while <$in_fh>;

しかし、それは物事を行うための非常に統一された方法ではありません。UNIXの伝統では、コマンドラインで指定されたすべてのファイルから一度に1行ずつ以下が読み取られます。

while (<>) {
    ...
}

出力は通常、リダイレクトによってファイルに配置されます。

#!/usr/bin/env perl
# This is mycat.pl
print while <>;

# Example usage.
mycat.pl foo bar > baz

# Edit foo in-place.
perl -i mycat.pl foo

通常タッチ@ARGVするのはオプションを処理するときだけであり、それでも、直接タッチする代わりに、通常Getopt::Long@ARGVを使用します。


コードに関して、スクリプトは次のようになります。

#!/usr/bin/env perl
while (<>) {
   print "ERROR in line $.\n" if /Error/;
}

使用法:

perl script.pl UNSUCCESSFULOUTPUT.txt >output.txt

実行可能ファイル( )perlを作成すると、コマンドから削除できます。script.plchmod u+x script.pl

于 2012-06-06T17:05:43.210 に答える
2

私はあなたがperlスクリプトに引数を渡す方法を尋ねていると思います。これは@ARGV変数を使用して行われます。

use strict;
use warnings;

my $file = shift;   # implicitly shifts from @ARGV
print "The file is: $file\n";

<>スクリプトへの引数をファイルとして開くダイヤモンド演算子の魔法を利用することもできます。引数が指定されていない場合はSTDINを使用することもできます。ダイヤモンド演算子は、通常、通常のファイルハンドルとして使用されますwhile (<>) ...

ETA:

提供したコードを使用すると、次のようにしてコードをより柔軟にすることができます。

use strict;
use warnings;  # always use these
my $file    = shift;                 # first argument, required
my $outfile = shift // "output.txt"; # second argument, optional

open my $log, "<", $file    or die $!;
open my $out, ">", $outfile or die $!;

while (<$log>) {
    print $out "ERROR in line $.\n" if (/Error/);
}

また、STDINまたはファイル引数を受け入れてSTDOUTに出力するなど、他のUNIXツールのようにする方法についてのikegamiの回答も参照してください。

以前の質問でコメントしたように、あなたは単にその仕事のために既存のツールを使いたいと思うかもしれません:

grep -n Error input.txt > output.txt
于 2012-06-06T17:06:25.870 に答える
2

これはあなたが望んでいると私が信じているものです:

#!usr/bin/perl
my $argument1 = $ARGV[0];

open (LOGFILE, "<$argument1") or die "Can't find file";       
open (FILE, ">output.txt") or die $!;

while(<LOGFILE>){
print FILE "ERROR in line $.\n" if (/Error/);
}

close FILE;
close LOGFILE; 

コマンドラインから次のように実行しました。

> perl nameofpl.pl mytxt.txt

追加するには、次の行を変更します。

 open (FILE, ">output.txt") or die $!;

非常に似ているものに:

 open (FILE, ">>output.txt") or die $!;
于 2012-06-06T17:31:12.313 に答える