Почему шарик Perl возвращает undef для любого вызова?

  • "Там конкретная причина, что статические методы не могут быть переопределены".

Позволяют мне перефразировать тот вопрос для Вашего путем заполнения определений.

  • "Там конкретная причина, что методы, разрешенные во время компиляции, не могут быть разрешены во времени выполнения".

Или, чтобы вставить более полностью, Если я хочу назвать метод без экземпляра, но знание класса, как у меня может быть он, решило основанный на экземпляре, который я не имею.

5
задан Akers 14 August 2009 в 15:57
поделиться

3 ответа

glob в скалярном контексте:

В скалярном контексте glob выполняет итерацию по таким расширениям имени файла, возвращая undef, когда список исчерпан.

В

foreach (@list_env_vars){
    print "$_ = ".glob()."\n";
}

glob () действительно есть glob ($ _) . На каждой итерации $ _ содержит строку $ SERVER . Учитывая, что переменная среды не изменяется, $ SERVER заменяется той же строкой. Эта строка возвращается в первый раз. Затем список исчерпан, поэтому возвращается undef . В третий раз мы начинаем заново. ...

Уточнение: Не имеет значения, что аргумент для второго вызова тот же, что и для первого вызова, поскольку нет возможности сбросить glob ' s итератор.

Вы можете увидеть это более четко, используя следующий пример (текущий каталог содержит файлы '1.a', 1.b ',' 2.a 'и' 2.b '):

#!/usr/bin/perl -w
use strict;

my @patterns = (
    '*.a',
    '*.b',
);

for my $v ( @patterns ) {
    print "$v = ", scalar glob($v), "\n";
}

Вывод:

C:\Temp> d
*.a = 1.a
*.b = 2.a

Я бы рекомендовал обращаться к переменным среды через хэш % ENV :

my @list_env_vars = ($ENV{SERVER}) x 6;

или

my @list_env_vars = @ENV{qw(HOME TEMP SERVER)};
13
ответ дан 18 December 2019 в 09:51
поделиться

Между прочим, причина, по которой в 5.004 вы получаете расширение переменной, а в 5.10 вы просто получаете обратно свою буквальную строку, заключается в том, что на старом perl glob () выполнялась системой shell, который как побочный эффект выполняет расширение переменных. Начиная с Perl 5.6, glob () использует модуль File :: Glob , который выполняет свою работу самостоятельно без оболочки и не расширяет переменные среды (для которых glob никогда не предназначался). делать). % ENV - правильный способ добраться до окружающей среды.

4
ответ дан 18 December 2019 в 09:51
поделиться

Примечания к старому поведению, добавлены вики для вашего удобства (и чтобы у меня был полный диапазон разметки без ограничения в 500 символов):

Тот факт, что glob и <* globbything *> , измененный в 5.6, попутно упоминается в документации ( perl56delta , perlop , -f glob ), но единственный реальный источник информации о том, как именно он работал, - это версия perlop до 5.6. Вот соответствующий бит из 5.005:

Пример:

 while (<*. C>) {
 chmod 0644, $ _;
}

эквивалентно

 open (FOO, "echo * .c | tr -s '\ t \ r \ f' '\\ 012 \\ 012 \\ 012 \\ 012' |");
пока () {
 рубить;
 chmod 0644, $ _;
}

Фактически, в настоящее время это реализовано именно так. (Это означает, что он не будет работать с именами файлов с пробелами, если на вашем компьютере нет csh (1).)

Хех, это довольно злая штука. В любом случае, если вы когда-нибудь захотите обратиться к таким старым perldocs, просто зайдите на search.cpan.org, откройте дистрибутив perl , используйте раскрывающийся список, чтобы выбрать старую версию, затем щелкните, чтобы документ, который вам нужен. perl сам по себе не подлежит "уборке" в CPAN; в настоящее время все, начиная с 5.004, доступно без нажатия BackPan.

0
ответ дан 18 December 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: