Позволяют мне перефразировать тот вопрос для Вашего путем заполнения определений.
Или, чтобы вставить более полностью, Если я хочу назвать метод без экземпляра, но знание класса, как у меня может быть он, решило основанный на экземпляре, который я не имею.
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)};
Между прочим, причина, по которой в 5.004 вы получаете расширение переменной, а в 5.10 вы просто получаете обратно свою буквальную строку, заключается в том, что на старом perl glob ()
выполнялась системой shell, который как побочный эффект выполняет расширение переменных. Начиная с Perl 5.6, glob ()
использует модуль File :: Glob
, который выполняет свою работу самостоятельно без оболочки и не расширяет переменные среды (для которых glob никогда не предназначался). делать). % ENV
- правильный способ добраться до окружающей среды.
Примечания к старому поведению, добавлены вики для вашего удобства (и чтобы у меня был полный диапазон разметки без ограничения в 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.