我使用的解析脚本看起来像
use strict;
use warnings;
use 5.010;
use autodie;
my (@header, @fh);
while ( <> ) {
if ( /^(\d+)/ ) {
my $n = int $1 / 1000;
unless ( $fh[$n] ) {
my $file = sprintf 'file%d.txt', $n+1;
open $fh[$n], '>', $file;
print { $fh[$n] } @header;
}
print { $fh[$n] } $_;
}
else {
push @header, $_;
}
}
close $_ for grep $_, @fh;
我传递给脚本的文件被处理,输出在file1 file2中.....我怎么能修改脚本,脚本还有一个额外的参数,用于修改输出为file1_1 file1_2的脚本。 ..如果额外的参数为1,如果附加参数为2,那么它将是file2_1 file2 _......
答案 0 :(得分:4)
如果我要进行这样的更改,我会将该参数设置为可选,以免破坏其他依赖项。由于您已经依赖@ARGV
,这意味着我们不能简单地shift
参数,或者我们必须使参数不可选。
E.g:
my $prefix = shift; # non-optional parameter now
...
my $file = sprintf 'file%s_%d.txt', $prefix, $n+1
但是如果这个程序被某人或某个不期望该参数的东西使用,它将从输入中删除一个文件并破坏该程序。
相反,您可以使用-s
开关在命令行上使用基本开关解析,或使用Getopt::Long
,这是一个用于此目的的流行模块。
perl -s program.pl -prefix=1 input1 input2 ...
然后在程序中使用our $prefix
或$main::prefix
,这样就不会出现strict
错误。然后,您还可以检查是否已定义$prefix
,并相应地处理它。 E.g:
if (defined $main::prefix) {
$main::prefix .= "_"; # append "_"
} else {
$main::prefix = ""; # empty string
}
my $file = sprintf 'file%s%d.txt', $prefix, $n + 1;
或使用Getopt::Long
:
use strict;
use warnings;
use Getopt::Long;
my $prefix;
GetOptions("prefix=s" => \$xyz);
用法:
perl program.pl -prefix=1 input1 input2 ...