Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用while(<;>;)ARGV[1]格式的perl命令行参数,是否可能使用shift命令?_Perl_Arguments - Fatal编程技术网

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

使用while(<;>;)ARGV[1]格式的perl命令行参数,是否可能使用shift命令?,perl,arguments,Perl,Arguments,我基本上想做一些像 while(<>){ my ($one, $two, $three) = split; if ($one > ARGV[1]){ #some commands } } 但很明显,我不希望while循环读取50的任何内容 关于最好的干净方法的任何想法,比如如果我能以某种方式改变命令行参数,典型的方法是将@ARGV分配给一个变量列表,以便脚本记录您希望传递的内容 my ($file, $count) = @AR

我基本上想做一些像

while(<>){
     my ($one, $two, $three) = split;
     if ($one > ARGV[1]){
          #some commands
     }
}
但很明显,我不希望while循环读取50的任何内容
关于最好的干净方法的任何想法,比如如果我能以某种方式改变命令行参数,典型的方法是将@ARGV分配给一个变量列表,以便脚本记录您希望传递的内容

my ($file, $count) = @ARGV ;
当然,这实际上并没有检查实际传递的内容(如果有的话)的有效性。如果需要,可以从许多处理模块中选择。很多人喜欢,但我更喜欢YMMV

与perl中的大多数内容一样,Gabor Szabo有一个关于@ARGV的很棒的页面。您可能会发现此引用非常有用:

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

除了这些问题之外,您还可以将其作为常规数组处理。您可以使用
foreach
浏览这些元素,或者使用索引:
$ARGV[0]
逐个访问它们

您还可以在此阵列上使用shift、unshift、pop或push

实际上,您不仅可以获取
@ARGV
的内容,还可以对其进行更改

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

读取文件句柄,您可以将其视为中所有文件名的串联。在调用
之前,
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) { ... }
}

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

./script.pl 50 text.txt
将文件名放在最后是一种更常见的做法,它将所需代码简化为以下内容:

my $limit = shift(@ARGV);

while (<>) {
    my @fields = split;
    if ($fields[0] > $limit) {
        ...
    }
}
./script.pl 50 text.txt
my $limit = shift(@ARGV);

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