使用perl命令行参数的格式为while(<>)ARGV [1],可能使用shift命令?

时间:2016-06-29 23:20:07

标签: perl arguments

我基本上想做像

这样的事情
while(<>){
     my ($one, $two, $three) = split;
     if ($one > ARGV[1]){
          #some commands
     }
}

我会像

那样调用它
./script.pl text.txt 50

但显然我不希望while循环从50读取任何东西 有关最佳最干净方法的任何想法,比如我可以以某种方式移动命令行参数

3 个答案:

答案 0 :(得分:4)

<>ARGV文件句柄中读取,您可以将其视为@ARGV中所有文件名的串联。在ARGV被调用之前,<>文件句柄不会被初始化,因此在while循环之前操作@ARGV是安全的。

my $val = pop @ARGV;             # take last argument
my ($val) = splice @ARGV, 1, 1;  # take 2nd argument
...
while (<>) {      # now ARGV fh uses whatever is currently in @ARGV
    my ($one,$two,$three) = split;
    if ($one > $val) { ... }
}

另请注意,如果@ARGV为空,则<>运算符将从标准输入读取。只要您在尝试阅读@ARGV之前清空<>数组,此类内容也适用于<>

./script.pl 50 < text.txt

答案 1 :(得分:1)

这样做的典型方法是将@ARGV分配给变量列表,以便脚本记录您期望传递的内容

my ($file, $count) = @ARGV ;

当然,这并没有真正检查实际传递的内容的有效性 - 如果有的话。如果您需要,有许多选项处理模块可供选择。许多人喜欢Getopt::Long,但我更喜欢Getopt::Lucid. YMMV。

与大多数事情一样,Gabor Szabo有一个关于@ARGV here的精彩页面。你可以从中找到这个引用很有用:

  

如何从@ARGV

中提取命令行参数      

@ARGV只是Perl中的常规数组。与您创建的数组的唯一区别是,它不需要声明,并且在脚本启动时由Perl填充。

     

除了这些问题,您可以将其作为常规数组处理。您可以使用foreach检查元素,也可以使用索引逐个访问它们:$ARGV[0]

     

你也可以使用shift,unshift,pop或push这个数组。

     

确实,您不仅可以获取@ARGV的内容,还可以更改它。

     

如果您希望在命令行上使用单个值,则可以通过查看$ARGV[0]来检查它是什么,或者是否提供了它。如果您期望两个变量,您还将检查$ARGV[1]

答案 2 :(得分:0)

我建议您重新排列参数的顺序

./script.pl 50 text.txt

最后放置文件名是一种更常见的做法,它简化了以下所需的代码:

my $limit = shift(@ARGV);

while (<>) {
    my @fields = split;
    if ($fields[0] > $limit) {
        ...
    }
}

诀窍是在@ARGV之前删除while (<>)以外的所有文件名。

这种做法的另一个优点是,以下内容只是从STDIN中读取:

./script.pl 50