4
A
回答
16
一個子返回子作爲CODEREF:
# example 1: return a sub that is defined inline.
sub foo
{
return sub {
my $this = shift;
my @other_params = @_;
do_stuff();
return $some_value;
};
}
# example 2: return a sub that is defined elsewhere.
sub bar
{
return \&foo;
}
任意文本可以與eval
函數執行:請參閱文檔在perldoc -f eval:
eval q{print "hello world!\n"};
注意,這是非常危險如果你正在評估從用戶輸入中提取的任何內容,並且通常是一個糟糕的練習,因爲通常可以用cod來定義你的代碼如前面的例子中所述。
可以存儲與state variable(新中perl5.10),或具有可變範圍的比子本身更高,作爲closure狀態:
use feature 'state';
sub baz
{
state $x;
return ++$x;
}
# create a new scope so that $y is not visible to other functions in this package
{
my $y;
sub quux
{
return ++$y;
}
}
7
返回的子程序參考。
下面是一個創建子裁判關閉了一個值一個簡單的例子:
my $add_5_to = add_x_to(5);
print $add_5_to->(7), "\n";
sub add_x_to {
my $x = shift;
return sub { my $value = shift; return $x + $value; };
}
您也可以使用名爲潛艇像這樣的工作:
sub op {
my $name = shift;
return $op eq 'add' ? \&add : sub {};
}
sub add {
my $l = shift;
my $r = shift;
return $l + $r;
}
可以使用eval
與任意的字符串,但不要這樣做。該代碼很難讀取,並重新開始編譯,這會減慢一切。有少數情況下,字符串評估是該工作的最佳工具。任何時候字符串eval似乎都是一個好主意,你用另一種方法幾乎肯定會更好。
幾乎所有你想用字符串評估做的事情都可以通過關閉實現。
5
使用sub
關鍵字可輕鬆返回潛水艇。返回的子關閉它使用的詞彙變量:
#!/usr/bin/perl
use strict; use warnings;
sub mk_count_from_to {
my ($from, $to) = @_;
return sub {
return if $from > $to;
return $from ++;
};
}
my $c = mk_count_from_to(-5, 5);
while (defined(my $n = $c->())) {
print "$n\n";
}
5.10介紹state variables。
執行文本的Perl來完成使用eval EXPR
:
的
EXPR
返回值被解析和執行,就好像它是一個小Perl程序。首先解析表達式的值(它本身在標量上下文中確定),如果沒有任何錯誤,則在當前Perl程序的詞彙上下文中執行,以便任何變量設置或子例程和格式定義在之後保留。需要注意的是價值被解析每次eval
執行
執行任意的字符串將開拓巨大巨大的安全漏洞。
5
您可以創建匿名子例程並通過引用訪問它們;這種參考當然可以被分配到一個標量:
my $subref = sub { ... code ... }
或返回從另一個子程序
return sub { ... code ... }
如果你需要存儲的狀態,您可以創建類似以下這樣的外部範圍定義的詞彙變量關閉:
sub create_func {
my $state;
return sub { ... code that can refer to $state ... }
}
您可以eval
相關問題
- 1. 隱式參數:如何在函數簽名中進行編碼?
- 2. 使用Scala進行函數式編程
- 3. 如何在ANF中對身份函數進行編碼?
- 4. 我如何在C和C++中使用Vi和Emacs中的相同縮進樣式進行編碼?
- 5. 如何在使用CodeIgniter編碼進行編碼時在python中解碼?
- 6. 如何在Android中使用FFMpeg進行編碼(使用H263)
- 7. 如何在perl中格式化SQL語句(代碼樣式)
- 8. 如何在.NET中使用perl樣式替換表達式
- 9. 如何使用ASN.1進行編碼?
- 10. 如何在Perl中使用Getopt時對參數進行分組?
- 11. 在Perl中使用數組元素進行模式匹配
- 12. 你如何在Perl中對Base64進行編碼和解碼連接字符串?
- 13. 如何使用多個鍵/對象參數對代碼樣式jQuery進行編碼
- 14. PHP json_encode對函數進行編碼
- 15. 如何避免爲執行模式匹配的函數編寫樣板代碼?
- 16. 使用二進制補碼的負整數的Perl函數
- 17. 如何在Python中使用PKCS12對RSA密鑰進行編碼?
- 18. 如何在Android中使用Base64對字符串進行編碼?
- 19. 如何在perl sed中使用grep樣式「-w」選項?
- 20. 使用Lagarith進行編碼
- 21. 如何執行JavaScript函數以使用不同的樣式表?
- 22. 如何在Perl模塊中編寫函數引用?
- 23. 如何使用'函數處理'樣式函數實例化類?
- 24. 如何在jQuery/JavaScript中對URL進行編碼並在ASP.NET中進行解碼
- 25. 如何使用Java設計模式對一些XPath函數進行編程
- 26. 如何在CoffeeScript中使用模數編寫交替行函數?
- 27. 如何在C代碼中使用RcppEigen編譯函數
- 28. 如何識別數據使用Server.UrlEncode()進行編碼Asp.net
- 29. 如何使用mochijson對對象數組進行編碼?
- 30. 如何使用fold_right創建編碼運行長度的函數?
重新運行代碼ad _高階Perl_。這是一本圍繞你的問題而建立的書。 – 2010-02-04 02:05:43
鏈接:http://hop.perl.plover.com/雖然我確定Dominus讚賞實際購買的人 – ysth 2010-02-04 02:49:53