배열

2017-10-29 1 views
0

의 기준 조각화 나는 다음과 같은지도가 내 코드에서배열

my %cps_per_level = (
        Bronze  => [100 , 65 ], 
        Silver  => [200 , 125 ], 
        Gold  => [400 , 250 ], 
        Platinum => [800 , 500 ], 
        Diamond  => [1200, 750 ], 
        Master  => [2000, 1200], 
        Grandmaster => [3000, 1750], 
       ); 

내가 두 변수에 대한 특정 항목에 대한 목록의 두 값을 모두 싶어합니다. 첫 번째 시도는 특정 항목에 대한 목록의 참조를 해제 한 다음 목록 슬라이스를 적용하고이를 아래에 표시된 것과 같이 원하는 변수에 할당하는 것이 었습니다. 여기 $level에는지도의 키가 하나 있습니다.

my ($cps_before, $cps_after) = $cps_per_level{$level}[0,1]; 

하지만 작동하지 않습니다. $cps_before은 목록의 첫 번째 값을 가져 오지만 $cps_after은 가져 오지 않습니다. 나는 이것을 2 줄로 작성하여 작동되도록했습니다 :

my $cps_before= $cps_per_level{$level}[0]; 
my $cps_after = $cps_per_level{$level}[1]; 

제 질문은 왜 슬라이스가 작동하지 않았습니까? 나는 무엇을 놓치고 있습니까?

답변

6

이것은 조각이 아닙니다. 당신이 @array이 있다면, 슬라이스는 다음과 같이 보일 것이다 :

$array[0, 1, 2] 

... 스칼라 문맥에서 ,를 사용하고 $array[2] 동일합니다 : 당신이 쓴 무엇

@array[0, 1, 2] 

이하는 것과 동일 . 사실

,

$cps_per_level{$level}[0,1] 

단지 수단

${ $cps_per_level{$level} }[0, 1] 

대한 문법적 인

$cps_per_level{$level}->[0,1] 

대한 속기

${ $cps_per_level{$level} }[1] 
01,235 16,

은 당신이 대신해야 할 것은 :

@{ $cps_per_level{$level} }[0, 1] 

@는 여러 요소를 얻기 위해 노력하고 의미합니다. 당신의 펄 (5.20 더 이상 실험 5.24 이후)만큼 새로운 없으면

, 당신은 또한이 같은 후위 역 참조 양식을 사용할 수 있습니다

$cps_per_level{$level}->@[0, 1] 
+0

는 답변에 대한 감사를 알았어요. 내가보기에 당신은'@ {...} '로리스트를 디 - 레퍼런스 (de-reference) 한 다음,리스트의 디 - 레퍼런스 된 버전에 슬라이스를 적용한다. 이것은 완벽하게 이해할 수있다. 내 실수는'->'(그리고 문법 설탕 버전'{...} [...]')이'$ {thing_to_derefence} [.]가 아닌 자동으로 모든 것을 참조 해제한다고 생각하는 것입니다. ..]'. –

+1

@ AndréSantos'@'와'[]'는 별도의 구문이 아닙니다. '@ ... []'은 배열 슬라이스의 구문입니다. '(...) []'라고 쓰여진리스트 슬라이스 연산자도 있습니다. 그러나'[]'의 첨자는 모두 단독으로 사용할 수 없습니다. 항상 더 큰 구조의 일부입니다. – melpomene