2014-11-24 57 views
0

有沒有辦法讓我的代碼(Perl庫中的方法)判斷它是否從eval {}塊中執行?你能告訴你的代碼在eval塊內嗎?

我想吃點什麼是一樣的東西:

sub mySub { 
    my $isInEval = isInEval(); 
    if ($isInEval) { 
     # Do a dying thing 
    } else { 
     # Do a non-dying thing. 
    } 
} 

對於對轉出的複雜性有關的問題,有沒有辦法讓我崩潰垂死和非垂死的代碼轉換成相同的代碼相同的塊如果我們在eval內或不在乎,那也不在乎。

+0

自我回答,因爲我只是想出了asnwer的同時研究問題 – DVK 2014-11-24 15:52:30

+0

只是好奇 - 爲什麼你會在乎如果你在評估?你不應該總是「死」或「呱呱叫」,讓主叫方處理你無法處理的任何事情嗎? – Robert 2014-11-24 15:58:13

+0

@羅伯特 - 我無法控制的漫長而悲傷的部署故事。 – DVK 2014-11-24 15:59:10

回答

1

好的,算出來了。 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(); 
+2

不應該使用'$^S'來代替?看看[如何確定一個子程序是否使用調用者在eval內部調用?](http://stackoverflow.com/q/22183010)(看起來像一個笨蛋,btw) – ThisSuitIsBlackNot 2014-11-24 16:02:34

+0

@ThisSuitIsBlackNot - hm ...以某種方式錯過了它在我的搜索。因爲我有dupehammer,所以我自己把它當作傻瓜 – DVK 2014-11-24 16:08:29

相關問題