2009-10-11 34 views
10

tôi cần phải đạt được sau trong perlLàm thế nào tôi có thể sử dụng một biến như một tên biến trong 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; 

Vì vậy, tôi đã viết đoạn sau

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

Nó không làm việc và phá vỡ ra có lỗi.

+0

Bạn ít nhất có thể hiển thị lỗi. –

Trả lời

4

Bạn không thể chỉ biến chuỗi với nhau như vậy và nhận được một biến kết quả. Bạn có thể đánh giá biểu thức của $msg + i, nhưng có thể tốt hơn nếu bạn tạo một mảng và chỉ cần chỉ mục: $msg[$i].

31

Whenever you find yourself postfixing variable names with an integer index, nhận ra rằng bạn nên sử dụng một mảng thay vì:

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

Xem thêm FAQ How can I use a variable as a variable name?

Như câu trả lời cho các câu hỏi thường gặp ghi chú, nếu các biến không được lập chỉ mục bởi một số nguyên, bạn có thể sử dụng bảng băm:

Bằng cách sử dụng tham chiếu tượng trưng, ​​bạn chỉ sử dụng mã băm biểu tượng của gói (như %main::) thay vì băm do người dùng xác định. Giải pháp là sử dụng băm của riêng bạn hoặc một tham chiếu thực thay thế.

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

Bạn nên đọc toàn bộ danh sách câu hỏi thường gặp ít nhất mỗi năm một lần.

Cập nhật: Tôi cố ý để lại các tham chiếu tượng trưng trong câu trả lời của tôi vì chúng không cần thiết và có thể rất có hại trong ngữ cảnh câu hỏi của bạn. Để biết thêm thông tin, hãy xem Why it's stupid to 'use a variable as a variable name'?, part 2part 3 bởi mjd.

+3

Hoặc nếu val không ánh xạ bằng số, hãy sử dụng băm: % lỗi của tôi = (foo => 'Uh oh!', bar => 'Thậm chí tệ hơn!', ); cho lỗi $ của tôi (khóa% lỗi) { printmsg ($ errors {$ error}); } – Oesor

Các vấn đề liên quan