2010-07-01 6 views
16

이 질문은 PHP에 대해 herehere과 같은 질문을 받았으며 Perl과 동일한 질문이 있습니다. 목록을 반환하는 함수가 주어지면 임시 변수를 사용하지 않고 즉시 색인을 생성하는 방법 (또는 가장 좋은 방법)이 있습니까? 예를 들어Perl에서 반환 된 배열에 직접 인덱싱

:

my $comma_separated = "a,b,c"; 
my $a = split (/,/, $comma_separated)[0]; #not valid syntax 

두 번째 줄의 구문이 무효 인 이유를 내가 볼, 그래서 같은 효과를 얻을 수있는 방법이 있다면 내가 먼저 목록에 반환 값을 할당하지 않고 궁금하네요 및 그것에서 색인 생성. 그냥 당신이 할 수있는 것처럼

my $a = (split /,/, $comma_separated)[0]; 

답변

25

그냥 목록을 정의하고 다음 인덱스가 원하는 요소 (들)을 끌어 괄호를 사용

($a, $b, $c) = @array; 
당신은이 작업을 수행 할 수 있습니다

: 좌변 (왼쪽)에

my($a) = split /,/, $comma_separated; 

my $a

은 스칼라 문맥으로 처리된다. my($a)은 목록 컨텍스트입니다. 이것의 단일 요소 목록이므로 split에서 반환 된 첫 번째 요소 만 가져옵니다.

분할을 자동 제한하는 이점이있어서 $comma_separated이 큰 경우 낭비되는 작업이 없습니다.

+0

간단했습니다. --- 감사합니다. – Carl

+7

대부분의 경우 괄호는 함수 호출에서 선택 사항이므로 보통 'my $ x = (split /,/= $ str) [0]' –

+0

@ Carl로 생각할 수 있습니다. 'split (...) '의 경우 괄호는이 인수로 split을 호출하려는 * call * -> 주소만을 처리합니다. '[0]'을 그 위에 집어 넣는 것은 거의 의미가 없습니다. 그러나'(split ...)'는 * returned * 값을 처리합니다. 이것은 정말로 당신이 색인하고자하는 값입니다. – Axeman

8

:

+4

Perl은 이미이 최적화를 자동으로 수행합니다. "perldoc -f split"에서 : "목록에 할당 할 때 LIMIT가 생략되거나 0 인 경우 Perl은 불필요한 작업을 피하기 위해 목록의 변수 수보다 큰 LIMIT 하나를 제공합니다." – Sean

+0

오, 깔끔한, 나는 전혀 몰랐다! 항상 그 일을 한 것 같습니다. – Schwern

관련 문제