2010-03-30 2 views
8

난 그냥 우리의 코드베이스에서 몇 가지 코드를 보았다 (그리고 펄 3 펄 사일 같이 OLD 코드의) (I 크게 단순화하고 있습니다) 다음과 같습니다이 경우 펄을 사용하기 위해이 인수로 Perl은 무엇을하고 있습니까?

@array; 
push(array, $some_scalar); 

공지 사항을 그 array에서 push()에는 @이 없습니다. 나는 push behind 코드가 첫 번째 인자가 배열이기 때문에 배열이 array 타입 그랩이라는 것을 알고 있다고 가정한다. 그것은 더 많거나 적습니까? Perl이 문제없이 문제를 해결할 수 있다면 왜 @을 포함해야합니까?

+1

이 코드를'use warnings'과 함께 실행하고 이것이 당신의 질문에 답하는 지보십시오. – mob

+1

이 오래된 코드에 대한 경고를 켜면 흔들리지 않는 재앙이 될 수 있지만 귀하의 요점을 알 수 있습니다. – Morinar

+2

@Monirar :이 코드를 유지 관리해야하는 경우 경고를 사용하여 실행되도록 개선하면 매우 유용하다는 증거를 얻을 수 있습니다. –

답변

9

이것은 파서의 오래된 '기능'입니다. 변수가 패키지 변수 인 경우 @는 밀어 넣기에서 필수가 아닙니다. 이것은 많은 사람들에 의해 고쳐 져야하는 버그로 간주됩니다. 당신은 정말로 이것을해서는 안됩니다.

+0

흠, 실제로 푸시를 수행하지 않는 것 같습니다. 이것으로 :'perl -e 'my @array =(); 푸시 (배열, "foo"); print "@array \ n"; ''출력이 없습니다. DId 나는 바보 같은 짓을? – Cascabel

+2

아마도 타입 글롭과 관련이 있을지 모릅니다. 위의 Jefromi의 샘플 코드는 아무 것도 출력하지 않지만 'my'를 제거하면 출력됩니다. – mob

+1

네 말이 맞아. 패키지 변수에 대해서만 작동하는 것 같습니다. –

4

이것은 사용되지 않는 perl 동작의 모호한 "기능"입니다. 그것은 오류가되어야하지만 작동합니다.

Array @aa missing the @ in argument 1 of push() at xx.pl line 2. 
관련 문제