2009-12-15 27 views
3

可能重複:
How do I implement dispatch tables in Perl?如何在Perl中使用分派表?

我有一個包含如int命令的哈希表(RAND())等 如何執行這些命令?

+0

Duplicate:「我如何在Perl中實現調度表?」 http://stackoverflow.com/questions/1281456/how-do-i-implement-dispatch-tables-in-perl – 2009-12-15 14:01:20

+2

哈希值擁有標量值。如果您在代碼中描述瞭如何在散列中存儲「命令」,那麼在回答中提供相關示例可能會有所幫助。 Perl代碼中的字符串?子程序參考?還有別的嗎? – 2009-12-15 14:43:09

回答

5

您可以使用eval($str)來執行您存儲在字符串變量$str中的Perl代碼。你可以或者存儲您的代碼作爲哈希函數內引用,所以像:

$hash{'random'} = sub { int(rand()) }; 

通過這種方式,你可以寫$hash{'random'}->(),每當你想一個隨機值來執行功能。

另請參閱PerlMonks上的Implementing Dispatch Tables

+1

'eval'幾乎從來都不是最好的方法(其中「它」==幾乎任何東西)。匿名子文件會好得多。 – Ether 2009-12-15 18:52:51

+0

**字符串評估**幾乎從來都不是最好的方法。塊eval是另一回事。 – daotoad 2009-12-15 19:36:14

1

正如其他人所說,你可以使用eval執行它們。但是,請注意,通過eval執行任意可能被污染的字符串是一個主要的安全漏洞,並且如果應用程序的性能很重要,則容易出現緩慢。

可以使用Safe module去除安全漏洞(不知道這是怎麼防彈但比裸eval更好),但性能問題將永遠存在如Perl將不得不編譯代碼執行它之前在執行主程序。

+1

當你的意思是*任意*時,請不要說*隨機*,尤其是因爲預期的字符串會包含一個對'rand'的調用,所以聽起來好像你說這在某種程度上是相關的,即使它不是。安全漏洞是該字符串可能來自外部來源(如用戶或文本文件)。 – 2009-12-15 14:38:54

+0

好的。編輯。 – DVK 2009-12-15 15:27:08