好的,算出來了。 perldoc caller
說:
# 0 1 2 3 4
($package, $filename, $line, $subroutine, $hasargs,
# 5 6 7 8 9 10
$wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
= caller($i);
注意$子程序可能被(EVAL)如果幀不是一個子程序調用,而是一個eval。在這種情況下,將設置額外元素$ evaltext和$ is_require:$ is_require如果框架由require或use語句創建,則$ true,$ evaltext包含eval EXPR語句的文本。特別是,對於一個eval BLOCK語句,$子程序是(eval),但$ evaltext未定義。
我通過使用
的perl -e「使用數據::自卸車測試此;子X {FOREACH我的$ I(0..5){我@ C =呼叫者($ⅰ) ; print Data :: Dumper-> Dump([\ @ @])}}; sub y1 {x()}; sub z {eval {y1()}}; sub z2 {z();}; Z2()」
事實上,撥打#4有caller[3]
輸出
$VAR1 = [
'main',
'-e',
1,
'(eval)',
0,
undef,
undef,
undef,
0,
''
];
最終代碼:
sub isInEval{
my $i=0;
while(1) {
my ($package, $filename, $line, $subroutine, $hasargs
,$wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
= caller($i);
last unless defined $package;
$i++;
if ($subroutine eq "(eval)" || $evaltext) {
return 1;
}
};
return 0;
}
sub x {
if (isInEval()) {
print "eval\n";
} else {
print "NO eval\n";
}
}
sub y1 { x() };
sub z1 { eval{y1()} };
sub w1 { z1(); };
print "w1: eval expected: ";
w1();
sub y2 { x() };
sub z2 { y2() };
sub w2 { z2(); };
print "w2: eval UNexpected: ";
w2();
自我回答,因爲我只是想出了asnwer的同時研究問題 – DVK 2014-11-24 15:52:30
只是好奇 - 爲什麼你會在乎如果你在評估?你不應該總是「死」或「呱呱叫」,讓主叫方處理你無法處理的任何事情嗎? – Robert 2014-11-24 15:58:13
@羅伯特 - 我無法控制的漫長而悲傷的部署故事。 – DVK 2014-11-24 15:59:10