Perl读写文件

时间:2012-06-06 17:01:21

标签: perl

好吧,所以我回来了另一个问题。我知道在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;

它还没有追加......

3 个答案:

答案 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 $!;