5

我一直在搜索 Perl 资源,但我看不出哪里出错了。我很确定我遗漏了一些明显的东西,因为当我分配

my $gArgc = $#ARGV;

但是调用我的程序perl pkTkPtBdTkNo.pl test.txt

$#ARGV等于0,我不知道为什么。

#! /usr/bin/perl -w

use strict;

my $gArgc = $#ARGV;
my $input_line;
my $bad_input;

print($gArgc);
die ("Usage pkTkPtBdTkNo.pl input-line")
    if(0 == $gArgc);

$input_line = $ARGV[0];
$bad_input = ($input_line =~ /\"\d+\D+\d*\",/);
print($bad_input); 
4

4 回答 4

10

来自man perlintro

特殊变量 $#array 告诉您数组的最后一个元素的索引: ...您可能想使用 $#array + 1 来告诉您数组中有多少项。不要打扰。碰巧的是,在 Perl 期望找到标量值(“在标量上下文中”)的地方使用 @array 将为您提供数组中元素的数量:

因此,如果您传递 0 个参数,则 $#ARGV 将为 -1,因为数组中没有元素。如果您传递 1 个参数(如您的示例中所示),则 $#ARGV 将为 0。

于 2013-07-09T23:24:55.067 回答
2

这应该总是正确的,数组$#ARGV+1 == @ARGV$#ARGV最后一个索引也是如此。@ARGV

于 2013-07-09T23:09:49.177 回答
1

变量$#ARGV是 @ARGV 数组的最后一个元素的下标,因为数组是从零开始的,所以命令行中给出的参数个数是$#ARGV + 1。

于 2013-07-10T06:30:19.207 回答
0

你可以试试:

@ARGV or die "Usage pkTkPtBdTkNo.pl input-line"

我发现完全避免使用 $#array_name 语法可以极大地提高可读性,因为这里 perl 会自动将 @ARGV 转换为标量(值为 0)。

于 2013-07-10T06:49:21.330 回答