2015-07-09 7 views
7

होने के बाद:पर्ल में "eval" ओवरराइड

use 5.014; 
use warnings; 
BEGIN { 
    use subs qw(int); 
    sub int { 
     print STDERR "\tthe int got: $_[0]\n"; 
     my $res = CORE::int($_[0]); 
     print STDERR "\tCORE::int: $res\n"; 
     return $res; 
    } 
} 

my $x; 
$x = 1.1 ; say "result of int($x) is: ", int($x); 
$x = 6.6 ; say "result of int($x) is: ", int($x); 

यह

the int got: 1.1 
    CORE::int: 1 
result of int(1.1) is: 1 
    the int got: 6.6 
    CORE::int: 6 
result of int(6.6) is: 6 

int समारोह अपने ही समारोह है, जो कुछ डिबग-प्रिंट करता है के द्वारा ओवरराइड है प्रिंट, और रिटर्न मूल (कोर) कार्यान्वयन का नतीजा।

eval के लिए इसी के लिए खोज रहे हैं। लेकिन, शायद इसलिए कि evalint जैसे फ़ंक्शन नहीं है, उपरोक्त के रूप में ओवरराइड eval के लिए काम नहीं करता है।

क्या यह कुछ हद तक हासिल करना संभव है? जैसे

  • मिला स्ट्रिंग
  • प्रिंट चाहिए और eval

संपादित के मुख्य कार्यान्वयन बुलाना चाहिए: अनुसार ओवरराइड eval (eval "$string") के रूप में ऊपर अपने ही eval, साथ जैसे चाहते हैं उपरोक्त टिप्पणियों के लिए eval के लिए संभव नहीं है। तो:

संक्षेप में: सभीeval "$strings" मेरी कार्यक्रम में की डिबग प्रिंट चाहते हैं, मूल्यांकन से पहले। यह कुछ हद तक संभव है?

+1

कम से कम http://perldoc.perl.org/CORE.html पर पहुंचना यह प्रतीत होता है कि 'eval'' कोर :: eval' के रूप में मौजूद नहीं है, जिसका मेरा मानना ​​है कि यह एक पर्ल कीवर्ड है जिसमें कमी है ओवरराइड होने का साधन। – DavidO

+0

@ डेविडो [इस उत्तर] द्वारा पुष्टि की गई है (http://stackoverflow.com/a/3678957/176646) संबंधित प्रश्न पर। – ThisSuitIsBlackNot

+2

['अधिभार :: eval'] (https://metacpan.org/pod/overload::eval) – ThisSuitIsBlackNot

उत्तर

5

evalint रूप में एक ही फैशन में ओवरराइड नहीं किया जा सकता है, क्योंकि इसके इंटरफेस नमूने नहीं किया जा सकता।

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' int 
_ 

$ perl -E'say prototype("CORE::".$ARGV[0]) // "[undef]"' eval 
[undef] 

लेकिन कुछ अच्छी खबरें हैं! किसी के पास आपकी समान ज़रूरतें थीं, इसे ऑपोड में हेरफेर करके हल किया गया था, और सभी को उपयोग करने के लिए overload::eval के रूप में सीपीएएन का समाधान प्रकाशित किया था।

प्रलेखन केवल use का शाब्दिक दायरे में eval को प्रभावित करने का दावा करता है, लेकिन वहाँ एक छिपे हुए झंडा $overload::eval::GLOBAL = 1; यह eval EXPR के लिए सभी कॉल को प्रभावित बनाता है।

+0

धन्यवाद 'मुझे ओवरलोड :: eval' पर इंगित करने के लिए, दुर्भाग्य से यह साफ-सुथरा नहीं हुआ (विफल परीक्षण) ओएसएक्स/perl-v5.22। – kobame

संबंधित मुद्दे