Я видел, что close ARGV
может закрыть текущий обрабатываемый файл, но кажется, что ARGV
на самом деле не является дескриптором файла, поэтому я не могу использовать его в вызове read
. Есть ли способ получить текущий дескриптор файла, или мне придется явно открывать файлы самостоятельно?
... но может показаться, что ARGV на самом деле не является дескриптором файла, поэтому я не могу использовать его в вызове чтения
ARGV
— это дескриптор файла, и его можно использовать внутри read
.
Цитата из perlvar:
... простой дескриптор файла, соответствующий последнему файлу, открытому
<>
"*
Таким образом, это дескриптор файла, и его можно использовать при чтении. Но вам нужно сначала использовать <>
, чтобы файл действительно открылся. И он не продолжится волшебным образом со следующим файлом, как это сделал бы <>
.
Чтобы протестировать, просто сделайте (синтаксис оболочки UNIX, вам может потребоваться адаптировать его для Windows):
perl -e '<>; read(ARGV, my $buf, 10); print $buf' file
<>
откроет данный файл и прочитает первую строку. Затем read
прочитает следующие 10 байтов из того же файла.
О, приятно знать. Что означает «... Обратите внимание, что в настоящее время ARGV имеет магический эффект только внутри оператора <> ...»? Как вы можете использовать <ARGV>
вместо <>
?
@ Адриан: Да, вы также можете написать <ARGV>
вместо <>
. И <>
— единственное место, где есть магия открытия следующего файла и переназначения ARGV
.
Re "<>
- единственное место, где есть магия открытия следующего файла и переназначения ARGV
.", не совсем. readline
— единственное место, хотя <...>
может быть сокращением для readline
.
@ikegami: я думаю, что тогда документацию необходимо будет обновить, поскольку в ней говорится: «Обратите внимание, что в настоящее время «ARGV» имеет магический эффект только внутри оператора «<>»; в других местах это просто дескриптор файла, соответствующий последнему файлу, открытому "<>"."
Видимо так. В «машине Perl» нет оператора <>
, только в грамматике Perl. <...>
компилируется в glob
или readline
. И нет флага, указывающего на то, что использовался синтаксис <...>
. Логика есть (только) в операторе readline
"Perl-машины". Доберетесь ли вы туда с помощью <...>
или readline
, не имеет значения.
<>
— это сокращение от readline( ARGV )
.
Используемый дескриптор файла — ARGV
.
Однако у readline
есть специальный код для открытия/повторного открытия ARGV
, которого нет у read
.
Однако вы можете добиться read
, используя readline
, манипулируя $/
.
$ echo abcdef | perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";'
<<ab>>
$ perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";' <( echo abcdef )
<<ab>>
... но может показаться, что ARGV на самом деле не является дескриптором файла. Это неверно. Если бы вы показали нам код, который привел вас к такому неверному выводу, мы могли бы помочь вам решить вашу проблему. Хотя я должен сказать, что если вы используете
read
для чтения из дескриптора файла, то использование ARGV — плохой выбор.<>
и<ARGV>
используют строку чтения и разделитель входных записей для определения размера буфера, тогда как read() использует указанный пользователем размер. Это два разных способа чтения файлов