2010-12-08 5 views
17

는 내가 배열을이 구문을 사용하려배열과 함께 작동하지 않는 이유는 무엇입니까?

$x ||= 1; 

같은 변수에 대한 디폴트 값을 제공하기 위해 ||= 연산자를 사용하지만 구문 오류가 발생했습니다 :

@array||= 1..3; 
Can't modify array dereference in logical or assignment (||=) ... 

그 의미와 방법 배열에 기본값을 제공해야합니까?

답변

18

||은 스칼라 연산자이기 때문에. @array||= 1..3;이 작동하면 스칼라 컨텍스트에서 1..3을 평가할 것입니다. 이는 원하지 않는 것입니다. 스칼라 컨텍스트에서 배열을 평가하기도합니다 (스칼라 컨텍스트의 빈 배열이 false이기 때문에 괜찮습니다). 단 scalar(@array)에 할당 할 수 없다는 점이 다릅니다.

는 기본값을 사용 지정하려면 :

@array = 1..3 unless @array; 

을하지만 초기화 된 적이없는 배열과 빈리스트를 할당 된 하나의 차이를 알 수있는 방법은 없습니다 있습니다. 이것은 스칼라와 같지 않습니다. undef과 빈 문자열을 구별 할 수 있습니다 (||=은 구별하지 않습니다).

eugene y found this perl.perl5.porters message (공식 Perl 개발자 메일 링리스트)이 이에 대해 자세히 설명합니다.

+5

'||'하지 그것이 피연산자 남아에 스칼라 문맥을 부과는하지만 스칼라 연산자. Perlop에서 : "스칼라 또는 목록 컨텍스트가 평가되면 오른쪽 피연산자로 전달됩니다." ''print '[1, 2, 3]' –

+0

* "을 출력 할 수있는 방법은 없습니다. 한번 초기화되지 않은 배열과 빈리스트가 할당 된 배열의 차이점을 알려주십시오. "* 차이점을 말하기 란 불가능합니다. * 차이점은 없습니다. – Borodin

+0

이 답변은 완전히 잘못되었습니다. 'perl -le'print 0 || 1..3 "은'123'을 출력하고,'print scalar (1..3) '와 같이 빈 줄은 인쇄하지 않습니다. – ikegami

16

page는 이럴, 좋은 설명이 있습니다

op= can occur between any two expressions, not just a var and an expression, but the left one must be an lvalue in scalar context.

Since @x ||= 42 is equivalent to scalar(@x) = @x || 42 , and you aren't allowed to use scalar(@x) as an lvalue, you get an error.

관련 문제