Прошу прощения, если этот вопрос звучит просто, я намерен подробно понять, как работают эти (эти?) Конкретные операторы, и мне не удалось найти удовлетворительное описание в perldocs (возможно, он существует где-то я просто не мог найти его на всю жизнь)
В частности, мне интересно узнать,
a) <>
б) <*>
или любой другой шар и
c) <FH>
принципиально похожи или различны, и как они используются внутри компании.
Я создал свои собственные функции тестирования, чтобы понять это (представлено ниже). У меня до сих пор нет полного понимания (мое понимание может даже быть неправильным), но вот что я пришел к выводу:
<>
- In Scalar Context: Reads the next line of the "current file" being read (provided in @ARGV). Questions: This seems like a very particular scenario, and I wonder why it is the way it is and whether it can be generalized or not. Also what is the "current file" that is being read? Is it in a file handle? What is the counter?
- В контексте списка: считывает ВСЕ файлы в @ARGV в массив
<list of globs>
- In Scalar Context: Name of the first file found in current folder that matches the glob. Questions: Why the current folder? How do I change this? Is the only way to change this doing something like < /home/* > ?
- В контексте списка: все файлы, соответствующие глобу в текущей папке.
<FH>
, кажется, просто возвращает undef при присвоении переменной. Вопросы: почему это undef? Разве у него нет типа? Это ведет себя аналогичным образом, когда FH не является файловым дескриптором с открытым кодом?
Общий вопрос: что обрабатывает значение ‹> и других во время выполнения? В скалярном контексте возвращается ли какая-либо ссылка или переменные, которым мы их назначаем, идентичны любому другому скаляру без ссылки?
Я также заметил, что, хотя я назначаю их последовательно, вывод каждый раз сбрасывается. то есть я бы предположил, что когда я это сделаю
$thing_s = <>;
@thing_l = <>;
@thing_l
будет отсутствовать первый элемент, поскольку он уже был получен $thing_s
. Почему это не так?
Код, использованный для тестирования:
use strict;
use warnings;
use Switch;
use Data::Dumper;
die "Call with a list of files\n" if (@ARGV<1);
my @whats = ('<>','<* .*>','<FH>');
my $thing_s;
my @thing_l;
for my $what(@whats){
switch($what){
case('<>'){
$thing_s = <>;
@thing_l = <>;
}
case('<* .*>'){
$thing_s = <* .*>;
@thing_l = <* .*>;
}
case('<FH>'){
open FH, '<', $ARGV[0];
$thing_s = <FH>;
@thing_l = <FH>;
}
}
print "$what in scalar context is: \n".Dumper($thing_s)."\n";
print "$what in list context is: \n".Dumper(@thing_l)."\n";
}
perldoc perlop
должен дать вам хорошее начало. - person ThisSuitIsBlackNot   schedule 18.09.2013@thing_l
действительно теряет первый элемент в этом случае. Посмотри снова. - person Borodin   schedule 18.09.2013