为什么$#ARGV 0?

时间:2013-07-09 23:04:29

标签: perl

我一直在搜索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 个答案:

答案 0 :(得分:9)

来自man perlintro

  

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

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

答案 1 :(得分:2)

这应该始终为真,$#ARGV+1 == @ARGV因为$#ARGV@ARGV数组的最后一个索引。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你可以尝试:

@ARGV    或死“用法pkTkPtBdTkNo.pl输入行”

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