2013-04-18 4 views
1

아래 코드는 명령 줄에 입력 된 인수의 개수를 표시합니다. perlintro에서

#!/usr/bin/perl –w 
$myVar = $#ARGV + 1; 
print "Hi " , $ARGV[0] , "\n"; 
print "You have $myVar arguments\n"; 

, $#ARGV 당신에게 배열의 마지막 요소의 인덱스를 알려주는 특별한 변수입니다.

이 경우 명령 줄에 값을 입력하지 않으면 $myVar 값이 0으로 끝나는 방법은 무엇입니까?

배열에 요소가 없으면 "요소 없음"의 인덱스가 -1입니까? perlvar 페이지에 따르면, -1 + 1 = 0

답변

5

는 "ARGV의 마지막 요소의 색인"을 의미합니다. perlintro 문장이 암시하는 것처럼 모든 배열이 아닙니다. 비어 있다면

어떤 배열에 대한

, $#array -1되며 scalar @array 0

가주의해야 할 것입니다 : 누군가가 $[을 수정 한 경우 ("첫 번째 요소의 인덱스"), 그뿐만 아니라 $#를 변경할 수 있습니다 . 일 것입니다.은 길이가 끝난 후 항상 scalar @array을 사용하고, 마지막 요소를 얻으려면 $array[-1]이되어야합니다.

> cat demo.pl 
my @array =(); 
print "Size=", scalar @array, " items, last=", $#array, "\n"; 
$[ = 2; 
print "Size=", scalar @array, " items, last=", $#array, "\n"; 
> perl demo.pl 
Size=0 items, last=-1 
Size=0 items, last=1 
2

로서 : 배열 @ARGV가 스크립트위한 명령 줄 인수를 포함 @ARGV

. $ ARGV는 일반적으로 $ ARGV [0]이 프로그램의 명령 이름 자체가 아니라 첫 번째 인수이므로 의 인수 수를 뺀 수입니다. 명령 이름은 $ 0을 참조하십시오.

+0

답변 주셔서 감사합니다. – iridescent

2

당신 말이 맞습니다.

$#ARGVscalar @ARGV - 1이고, 스퀴지나 (squiguy)가 지적하고있다.

그러나 대신 사용하는 것이 좋습니다 프로그램에 전달 된 인수의 수를 세는 덜 시끄럽다 대안이 있습니다 : 그것은 때문에

my $count = scalar @ARGV; # Explicit using of 'scalar' function 
my $count = [email protected];  # Implicitly enforce scalar context 
my $count = @ARGV;   # Since the context is already set by LHS 
+0

좋은 정보, 고마워요. – iridescent

+0

'$ # ARGV '는 항상'스칼라 @ ARGV-1 '이되지는 않습니다.'$ #'은 신뢰할 수없는 여주인이며 날카로운 도끼가있는 것처럼 다루어야합니다. – rjp

+2

@rjp : 당신은 맞습니다.'$ # ARGV == @ARGV - 1 + $ [;'. 내가 그것을 언급하는 것을 막는 유일한 방법은'$ [''는 5.12에서 더 이상 사용되지 않는다는 것입니다. 그것이 의미하는 것처럼, 나는 시간의 99.9 %가 $ (== 0, 더 이상 아니라면)라고 말하려고 노력할 것이다. – Zaid

0

가이 배열의 어떤 요소가없는 경우에는 "no element"의 색인은 -1입니까? -1 + 1 = 0 일 때

거의. 그것은 오히려 다음과 같은 규칙 " '어떤 요소'의 인덱스"아니다는 적용 다음

perldata

은 항상 true입니다 :

스칼라 (@whatever) == $ # 어떤 + 1;

+0

어떤 사람은'$ ['를 바꾼다면 사실이 아닐 것이다. – rjp

관련 문제