使用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