2010-04-29 8 views
8

मुझे यह Mail::IMAPClient में मिला। $SEARCH_KEYS{ uc($_) } कहां से आता है?

sub _quote_search { 
    my ($self, @args) = @_; 
    my @ret; 
    foreach my $v (@args) { 
     if (ref($v) eq "SCALAR") { 
      push(@ret, $$v); 
     } 
     elsif (exists $SEARCH_KEYS{ uc($_) }) { 
      push(@ret, $v); 
     } 
     elsif (@args == 1) { 
      push(@ret, $v); # <3.17 compat: caller responsible for quoting 
     } 
     else { 
      push(@ret, $self->Quote($v)); 
     } 
    } 
    return @ret; 
} 
+0

ऐसा लगता है कि यह $ v होना चाहिए। कभी-कभी जो आप देखते हैं वह बग हैं। :) –

+2

क्योंकि अंत में मुझे मिली 10 में से 8 बग्स कोई बग नहीं हैं, मैं थोड़ा सतर्क हूं। –

+0

अभी भी 2/10 को छोड़ देता है :) –

उत्तर

8

यह एक टाइपो जहाँ लेखक एक स्पष्ट इटरेटर चर foreach my $v (@args) साथ एक के लिए पाश foreach (@args) के लिए एक गुमनाम परिवर्तित और $v को $_ के सभी घटनाओं कन्वर्ट करने के लिए भूल गया की तरह मुझे लग रहा है।

आपको शायद सीपीएएन पर वितरण के खिलाफ एक बग दर्ज करना चाहिए।

+2

मैंने एक रिपोर्ट लिखी। –

2

हालांकि यह शायद एक बग है, इस बात पर विचार करें कि यह कोड कैसे व्यवहार करता है।

$_ का मान वर्तमान गतिशील दायरे से निर्धारित किया जाएगा। इसका अर्थ यह है कि $_ में $_ कॉलिंग सबराउटिन में जो भी मूल्य (गतिशील रूप से स्कॉप्ड प्रति) होगा।

तो उदाहरण के लिए अगर मेरे पास है:

$_ = 1 
$_ = a 
$_ = b 
$_ = c 
$_ = 2 
$_ = a 
$_ = b 
$_ = c 
... 

यह थोड़ा Perl 5.10 में weirder हो जाता है और ऊपर है, जहां एक शाब्दिक $_ मौजूद है:

for (1 .. 5) { 
    foo(); 
    bar(); 
} 

sub foo { 
    print "\$_ = $_\n"; 
} 

sub bar { 

    for ('a' .. 'c') { 
     foo(); 
    } 
} 

आप की तरह उत्पादन मिलता है। इस और मिल

for (1 .. 5) { 
    foo(); 
    bar(); 
} 

sub foo { 
    print "\$_ = $_\n"; 
} 

sub bar { 
    my $_; 
    for ('a' .. 'c') { 
     foo(); 
    } 
} 

रन:

$_ = 1 
$_ = 1 
$_ = 1 
$_ = 1 
$_ = 2 
$_ = 2 
$_ = 2 
$_ = 2 

आप देख सकते हैं, अगर यह एक बग नहीं है, यह शायद एक बुरा विचार है।

+0

@daotoad => क्या आपको लेक्सिकल '$ _' के लिए कोई अच्छा उपयोग मिला है? –

+0

क्या lexicaliced ​​$ _ मूल्य रखता है? यह काम नहीं करता है: $ _ = 10; {मेरा $ _; कहते हैं; } –

+0

ठीक है, शायद यह foo है, जो मान रखता है। –

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