2009-10-28 2 views
5

Я не думаю, что должно работать, но это делает:Выполняет ли оператор алмаза Perl по немагическим массивам (не @ARGV)?

$ perl -e '@a = qw/1222 2 3/; while (<@a>) { print $_ ."\n";}' 
1222 
2 
3 
$ 

Насколько я знаю, <> оператора в Perl Шоуда работать на FILEHANDLE, комки и так далее, за исключением буквального <> (вместо <FILEHANDLE>), который волшебным образом повторяется над @ARGV.

Кто-нибудь знает, если он должен работать, как и в моем тесте?

+0

От perlop (1) about <> и @ARGV: Вот как это работает: в первый раз <> оценивается массив @ARGV, а если он пуст, устанавливается $ ARGV [0] до «-», который при открытии дает вам стандартный ввод. Затем массив @ARGV обрабатывается как список имен файлов. Я вижу, что что-то подобное происходит с моим @a, хотя это не похоже, что это должно произойти с каждым массивом (и я знаю, что foreach или карта лучше подходят для обработки массивов). Я все еще хотел бы знать, почему, не зарываясь в код –

ответ

10

Magic at work!

От «perldoc perlop»:

Если что в угловых скобках не является ни указатель_на_файлом, ни простой скалярный переменной , содержащей ссылку на файл имя, типа-глоб, или ссылка типа-глоб, она интерпретируются как шаблон файла , чтобы быть globbed, и либо список имен файлов, либо следующий имя файла в списке - , в зависимости от контекста.

Это правило, которое вы запускаете с помощью этого кода. Вот что происходит:

  1. < @a> является (синтаксически, во время компиляции) определено как glob расширение
  2. таким образом <> превращает @a в строку «1222 2 3» (строка интерполяция массив)
  3. glob ("1222 2 3") в контексте списка возвращает ('1222', '2', '3')
+0

ОК, так что я просто встал, но я просто не получаю # 3. – innaM

+0

Поведение: если в его аргументе отсутствуют метасимволы сопоставления шаблонов, glob не беспокоится о переходе к файловой системе. Это может быть удивительно. Это помогает мне думать об этом с точки зрения функциональности оболочки glob, которую glob стремится к эмуляции: если вы скажете «cat foo», оболочка вызывает «cat» с аргументом «foo», независимо от того, «foo», существует. Если вы скажете «cat foo. *», Оболочка вызовет «cat» с переменными аргументами, в зависимости от того, что (если что-либо) соответствует шаблону. – dlowe

+0

Спасибо! Теперь я понимаю. – innaM

-1

<FH> - не имя дескриптора файла, а оператор угла, выполняющий операцию ввода строки на ручке. Эта путаница обычно проявляется, когда люди пытаются печатать на угол оператора»- Programming Perl

Так что в вашем случае массив является ручка, которая имеет смысл, и, таким образом, оператор итерацию над ней Таким образом, в ответ на ваш. вопрос, да, я думаю, что это стандартный (но неясный) Perl. Это неясно, потому что язык имеет более очевидные способы перебора массива.

PS Однако, спасибо за это, это будет отлично подходит для кодовых гольф-соревнований .

+0

Не размещайте ссылки на несанкционированные копии книг. –

+0

Упс, я даже не понял.Извините за это. –

+1

foreach (@a) столь же короткий и легкий, как в то время как (<@a>), так что это не очень помогает в кодовом гольф. –

Смежные вопросы