Алмазный оператор Perl перебирает немагические массивы (не @ARGV)? - PullRequest
5 голосов
/ 29 октября 2009

Я не думаю, что следующее должно работать, но оно работает:

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

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

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

Ответы [ 3 ]

11 голосов
/ 29 октября 2009

Магия на работе!

Из ' perldoc perlop ':

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

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

  1. <@ a> (синтаксически во время компиляции) определяется как расширение glob
  2. таким образом <> превращает @a в строку "1222 2 3" (интерполяция строки массива)
  3. glob ("1222 2 3") в возвращаемых контекстах списка ('1222', '2', '3')
1 голос
/ 29 октября 2009

Это вызывает glob .

0 голосов
/ 29 октября 2009

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

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

P.S. Однако, спасибо за это, это будет хорошо для соревнований по коду.

...