好吧,所以我回来了另一个问题。我知道在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;
它还没有追加......
答案 0 :(得分: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传统中,以下内容将从命令行中指定的每个文件中读取,一次一行:
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.pl
),则可以从命令中删除chmod u+x script.pl
。
答案 1 :(得分:2)
我假设您正在询问如何将参数传递给perl脚本。这是通过@ARGV
variable.
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/);
}
另请参阅ikegami关于如何使其更像其他unix工具的答案,例如:接受STDIN或文件参数,并打印到STDOUT。
正如我在您之前的问题中所评论的那样,您可能只希望使用已有的工具来完成这项工作:
grep -n Error input.txt > output.txt
答案 2 :(得分: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 $!;