2009-10-11 3 views
10

나는 변수를 Perl에서 변수 이름으로 사용하려면 어떻게해야합니까?

printmsg(@val1, $msg1) if @val1; 
printmsg(@val2, $msg2) if @val2; 
printmsg(@val3, $msg3) if @val3; 
printmsg(@val4, $msg4) if @val4; 
printmsg(@val5, $msg5) if @val5; 
printmsg(@val6, $msg6) if @val6; 

그래서 내가 다음 코드

for(my $i=1; $i < 6; $i++) { 
    printmsg(@val$i, $msg$i) if @val$i; 
} 

그것은 작동과 오류가 발발하지 않습니다 쓴 펄에서 다음을 달성해야합니다.

+0

적어도 오류를 표시 할 수 있습니다. –

답변

4

변수를 함께 묶어 결과 변수를 얻을 수는 없습니다. $msg + i의 표현식을 평가할 수 있지만, msg를 배열로 만들고 인덱스 만 지정하면 더 좋을 것입니다 : $msg[$i].

31

Whenever you find yourself postfixing variable names with an integer index, 당신은 대신 배열을 사용한 것을 깨닫게 :

my @msgs = ('msg1', 'msg2', ..., 'msg6'); 
my @vals = ([ @val1 ], [ @val2 ], ..., [ @val6 ]); 

도 참조 자주 묻는 질문 FAQ를 노트에 대한 대답으로 How can I use a variable as a variable name?

, 변수는 정수 색인되어 있지 않은 경우,

기호 참조를 사용하면 기호 대신에 과 같은 기호 테이블 해시 (예 : %main::)를 사용할 수 있습니다. 사용자 정의 해시. 해결책은 대신 자신의 해시 또는 실제 참조를 사용하는 것입니다.

$USER_VARS{"fred"} = 23; 
my $varname = "fred"; 
$USER_VARS{$varname}++; # not $$varname++ 

당신은 적어도 일년에 한 번 전체 질문 목록을 읽어야합니다.

업데이트 : 나는 의도적으로 질문에 대한 문맥에서 불필요하고 매우 해롭기 때문에 의도적으로 내 대답에서 기호 참조를 남겼습니다. 자세한 내용은 Why it's stupid to 'use a variable as a variable name'?, part 2part 3mjd을 참조하십시오.

+3

val이 숫자로 매핑되지 않으면 해시를 사용하십시오. my % errors = (foo => 'Uh oh!', bar => '더 악화!', ); for my $ error (키 % 오류) { printmsg ($ 오류 {$ 오류}); } – Oesor

관련 문제