2012-06-20 31 views
5


Trong Perl, bạn có thể gọi một chức năng bằng cách tham chiếu (hoặc tên) như sau:Perl: Vấn đề gọi chương trình con bằng cách tham khảo cách sử dụng một giá trị băm

my $functionName = 'someFunction'; 
    &$functionName(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

Những gì tôi đang cố gắng để làm sử dụng là một giá trị từ một Hash, như vậy:

my %hash = (
     functionName => 'someFunction', 
    ); 

    &$hash{functionName}(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

Và lỗi tôi nhận được là biểu tượng toàn cầu "$ hash" yêu cầu tên gói rõ ràng.

Câu hỏi của tôi là: Có cách nào đúng để thực hiện việc này mà không sử dụng biến trung gian không?
Bất kỳ trợ giúp nào về điều này sẽ được đánh giá rất nhiều!

+3

Bạn cũng có thể thực hiện 'my% hash = (function => \ & someFunction)' mà không yêu cầu 'không có stric t 'refs''. – TLP

+0

@TLP +1, tôi sẽ trả lời * câu trả lời này. 'sử dụng nghiêm ngặt;' lưu ** vì vậy ** nhiều rắc rối ... – Dallaylaen

+0

Tôi có thể sử dụng nó, nhưng nó thêm một số mã không đọc được (hiện tại) ... Tôi đang tự động đặt giá trị của functionName tại thời gian chạy và gọi một hàm theo tên của nó. Perl rất vui! – Thumper

Trả lời

12

Nó chỉ là một vấn đề ưu tiên có thể được giải quyết bằng cách không bỏ qua các curlies. Bạn có thể sử dụng

&{ $hash{functionName} }() 

Hoặc sử dụng cú pháp thay thế:

$hash{functionName}->() 

Giữa chỉ số, các -> thể được bỏ qua (nhưng tôi không bỏ qua nó ở đây):

$hash{functionName}() 

Tham khảo: Deferencing Syntax

+0

Wow, đây là câu hỏi đầu tiên tôi từng hỏi ở đây, và chờ đợi một thời gian dài. Cảm ơn bạn rất nhiều! Tôi đã sử dụng giải pháp đầu tiên bạn đăng. Công cụ tuyệt vời! Cảm ơn bạn rất nhiều. – Thumper

+0

Ngoài ra, tôi quên đề cập đến tôi là khá mới để Perl (có thể một tháng kinh nghiệm), do đó, điều này thực sự sẽ giúp phát triển chuyên nghiệp của tôi. – Thumper

+1

Tôi hơi ngạc nhiên vì hầu hết mọi người đều tìm thấy ký hiệu mũi tên dễ đọc nhất, nhưng cả hai đều được chấp nhận. – ikegami