2010-04-29 4 views
8

나는 이것을 Mail::IMAPClient에서 발견했습니다. $SEARCH_KEYS{ uc($_) }에있는 $_의 출처는 어디입니까? 저자가 foreach my $v (@args) 변수를 명시 적 반복자 하나에 루프 foreach (@args)에 대한 익명을 변환 $v$_의 모든 발생률을 변환하는 것을 잊었다 오타처럼 나에게 보이는

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

.

당신은 아마 CPAN에 분포에 대한 버그를 제출해야한다. 이 버그는 아마 비록

+2

나는 보고서를 썼다. –

2

,이 코드가 작동하는 방식을 고려할 수 있습니다.

$_의 값은 현재의 동적 범위에 의해 결정된다. 즉, $_은 호출 서브 루틴에 $_의 모든 값 (동적 범위 사본)을 갖게됩니다.

그래서 예를 들어 내가있는 경우 : 어휘 $_이 존재하는 최대

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

그것은 펄 5.10에서 조금 괴상 얻고, :

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; {my $ _; 말하다; } –

+0

좋아, 어쩌면 그것은 가치를 지키는 foo 일 것이다. –

관련 문제