Каково значение, если вы перейдете за последний элемент массива?

В этом фрагменте кода сдвиг используется дважды, несмотря на то, что метод принимает только один параметр:

sub regexVerify ($)
{
   my $re = shift;

   return sub
   {
      local $_ = shift;
      m/$re/ ? $_ : undef;
   };
}

Что это делает значение локального $_, когда сдвиг используется снова? Я (возможно, наивно) предполагал, что переход в небытие приведет к undef. Но если бы это было правдой, эта строка не имела бы смысла, верно?:

m/$re/ ? $_ : undef;

Вышеупомянутая подпрограмма называется так:

regexVerify (qr/^([a-z].*)?$/i);

person CptSupermrkt    schedule 05.06.2013    source источник
comment
Ответ на ваш вопрос заголовка: undef.   -  person ikegami    schedule 06.06.2013


Ответы (2)


Второй shift находится внутри внутреннего объявления sub. Эта область будет иметь совершенно новый @_ для работы, который не будет иметь ничего общего с @_, переданным внешней подпрограмме.

regexVerify — это подпрограмма, которая возвращает другую подпрограмму. Предположительно, вы позже вызовете эту подпрограмму с аргументом:

my $func = regexVerify(qr/^([a-z].*)?$/i);
# $func is now a "code reference" or "anonymous subroutine"

...

if ($func->($foo)) {    # invoke the subroutine stored in $func with arg ($foo)
    print "$foo is verified.\n";
} else {
    print "$foo is not verified!\n";
}
person mob    schedule 05.06.2013
comment
Это имеет смысл, но я до сих пор не понимаю --- если внутренняя подпрограмма не принимает параметров, как инициализируется локальный $_, если не undef? - person CptSupermrkt; 06.06.2013
comment
@CptSupermrkt Внутренняя подпрограмма действительно принимает параметры, перечитайте ответ моба. regexVerify возвращает подпрограмму, которая затем вызывается как $func->($This_Is_A_Parameter)! - person amon; 06.06.2013
comment
Он принимает параметр, $foo в примере. - person ikegami; 06.06.2013

local $_ = shift; не выполняется, пока вы не вызовете анонимную функцию. то есть

my $anon_func = regexVerify (qr/^([a-z].*)?$/i);

# NOW sending arguments in @_ for local $_ = shift;
print $anon_func->("some string"); 
person mpapec    schedule 05.06.2013