如何让我的Perl脚本从命令行读取参数?

时间:2015-07-08 13:36:05

标签: perl

我使用的解析脚本看起来像

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 _......

1 个答案:

答案 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 ...