[Moscow.pm] Странности депарсинга given/when

Andrew Shitov andy на shitov.ru
Ср Июн 3 04:15:56 PDT 2009


Вот такая программа с использованием given:

~$ cat given.pl
use Modern::Perl;

my $x = 2.3;
given($x) {
    when(int) {say "[$_]int"};
    default   {say "[$_]default"}
}


Работает, как интуитивно и ожидается:

~$ perl given.pl
[2.3]default


Смотрим на Deparse:

~$ perl -MO=Deparse given.pl
use Modern::Perl;
use warnings;
use strict 'refs';
BEGIN {
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
my $x = 2.3;
given ($x) {
    when ($_) {
        say "[$_]int";
    }
    default {
        say "[$_]default";
    }
}
given.pl syntax OK

Внимание привлекает, что when (int) превратилось в when ($_).


Теперь другая программа, где вместо when (int) записано when ($_):

~$ cat given.pl
use Modern::Perl;

my $x = 2.3;
given($x) {
    when($_) {say "[$_]int"};
    default   {say "[$_]default"}
}


Работает тоже интуитивно и правильно:

~$ perl given.pl
[2.3]int


Но Deparse выдает тот же код с when ($_).

~$ perl -MO=Deparse given.pl
use Modern::Perl;
use warnings;
use strict 'refs';
BEGIN {
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
my $x = 2.3;
given ($x) {
    when ($_) {
        say "[$_]int";
    }
    default {
        say "[$_]default";
    }
}
given.pl syntax OK


Как так?

-- 
Andrew Shitov
______________________________________________________________________
andy на shitov.ru | http://shitov.ru


Подробная информация о списке рассылки Moscow-pm