2009-03-02 3 views
5

다음 코드 줄을 보았습니다. 그것은 문제가있다 : 푸시로 동일한 작업을 수행하기위한 것입니다

  • 내가 이후 푸시
  • 을 사용하도록 변경했습니다,
  • 을 이해 푸시 읽기가 어렵다
  • 에게 사용을 주어야한다고 대다수가 생각 그것이 내가 뭔가 생각 않습니다
  • 불법, 그러나 명확하지 여기

그것입니다 :

,
$array [++$#array] = 'data'; 

제 질문은 $ # 배열을 미리 증가시키는 것이 무엇을 의미합니까? 필자는 항상 $ # array를 배열의 속성으로 간주하고 쓸 수 없다고 생각했습니다.

+0

감사합니다 - 그게 내가 작성해야 제목입니다. –

답변

14

perldata는 말한다 :

는 "배열의 길이는 스칼라 값입니다 당신은 CSH 같이 $ # 일을 평가하여 배열 @days의 길이를 찾을 수 있습니다 그러나,이 길이 아니다.. 일반적으로 0 번째 요소가 있기 때문에 다른 값인 마지막 요소의 첨자입니다. $ # days에 할당하면 실제로 배열의 길이가 변경됩니다.이 방법으로 배열을 짧게하면 중간 값이 삭제됩니다. 이전에 단축 된 것은 그 요소에 있던 가치를 회복하지 못한다. "

경우에 따라 $ # 배열을 수정하는 것이 유용하지만이 경우 명확하게 푸시하는 것이 좋습니다.

+0

더 나은 경우 중 하나는 미리 배열이 얼마나 큰지 알면됩니다. 거대한 배열을 사용하면 성능이 크게 향상됩니다. – innaM

+0

$ # array를 사용하여 이전 Perl을 길게 만들면 이전 값으로 돌아갑니다. –

+0

그것은 perl4였습니다. – ysth

4

현재 배열 길이보다 큰 값을 $#array에 할당하면 배열이 확장됩니다.

+0

나는이 링크가 허가받지 않은 책의 사본이라고 믿습니다. 나는 그것을 제거하는 것이 좋습니다 것입니다. – mirod

+0

사실, 링크는 이미 죽었지 만 불법 복제 된 책에 링크하는 것은 좋지 않습니다. – Telemachus

+0

내가 그것을 점검했을 때 그것은 죽은 것이 아니었고 거기에는 다른 책들도 많이있었습니다. – mirod

3

이 코드도 작동합니다

$ perl -le 'my @a; $a[@a]="Hello"; $a[@a]=" world!"; print @a' 
Hello world! 

펄 배열은 동적이며 한계를 넘어 할당 할 때 성장한다.

+0

++ $ # array가 어떻게 바뀌지 않을지 모르겠다. 할당 후에 $ # 배열이 아마도 같은 값으로 다시 수정된다고 가정합니다. –

+0

여기서'++ $ # array'는 쓸모가 없다고 생각합니다. –

+0

$ # array를 사용하면 ++ $ # 배열이 필요합니다. 배열의 마지막 요소를 덮어 씁니다 (또는 '생성 할 수없는 배열 값의 수정 시도, 아래 첨자 -1'오류가 발생하면 배열이 empty) – mirod

1

우선, 그것은 파울입니다.

그런데, 나는 또한 그것이 효과가 있다는 것에 놀랐다. 나는 ++$#array이 숫자를 증가 시키려고 할 때 "상수를 수정할 수 없다"라는 오류를 얻었을 것이라고 추측했을 것입니다. (물론 우연히 그런 일을 한 것은 아닙니다.) 그러나 정확하게 우리가 틀린 부분이었을 것입니다 : $#array은 상수 (숫자)가 아닙니다. 변수 식입니다. 그런대로 당신은 그것으로 혼란 스러울 수 있습니다.

my @array = qw/1 2 3/; 

++$#array; 
$array[$#array] = qw/4/; 

print "@array\n" 

그리고 심지어 여분의 재미를 위해,이 :

my @array = qw/1 2 3/; 

$#array += 5; 

foreach my $wtf (@array) { 
    if (defined $wtf) { 
    print "$wtf\n"; 
    } 
    else { 
    print "undef\n"; 
    } 
} 

그리고는, 네, 펄 요리 책 성장 또는 배열을 절단하는 $#array 엉망으로 행복을 (제 4 장 다음 사항을 고려 , 조리법 3). 나는 아직도 못생긴 것을 발견하지만, 어쩌면 그저 느린 "그러나 숫자"의 편견 일뿐입니다.

+0

나는 당신에 대해 잘 모르겠지만 * 나 * 구두점 기호가 4 개 있기 때문에 추한 것 같아요. 구분 기호 나 괄호가 아니기 때문에 ......... 내 말은 또한 나 또한 a thing b + (foo? - $ # array : + $ # array); 못생긴 B-) –

+0

나는 너무 놀랐다. –

4

사후 증가는 변수를 먼저 반환 한 다음 증분합니다.

사후 증분을 사용한 경우 마지막 요소가 수정 된 후 가장 먼저 반환 된 다음 빈 요소를 끝까지 밀어 넣으면 수정됩니다.두 번째 루프에서는 빈 값을 수정하고 나중에 빈 값을 밀어 넣습니다. 그래서 전혀 밀어 넣기처럼 작동하지 않습니다.

사전 증가는 변수를 증가시킨 다음이를 리턴합니다. 그렇게하면 예제가 항상 배열의 새 요소에 쓰여지고 밀어 넣기와 같이 작동합니다. 아래 예 :

my (@pre, @post); 

$pre[$#pre++] = '1'; 
$pre[$#pre++] = '2'; 
$pre[$#pre++] = '3'; 


$post[++$#post] = '1'; 
$post[++$#post] = '2'; 
$post[++$#post] = '3'; 

print "pre keys: "[email protected]"\n"; 
print "pre: @pre\n"; 
print "post keys: "[email protected]"\n"; 
print "post: @post\n"; 

출력 : 편집에 대한

pre keys: 3 
pre: 2 3 
post keys: 3 
post: 1 2 3 
+0

증분 연산자의 "반환"값은 중요한 차이입니다. 누군가 그것을 만들었 기 때문에 기쁩니다. – jettero

+1

@pre = (2, 3, undef); –

관련 문제