我基本上想做像
这样的事情while(<>){
my ($one, $two, $three) = split;
if ($one > ARGV[1]){
#some commands
}
}
我会像
那样调用它./script.pl text.txt 50
但显然我不希望while循环从50读取任何东西 有关最佳最干净方法的任何想法,比如我可以以某种方式移动命令行参数
答案 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