Есть ли способ получить текущий дескриптор файла, который будет использоваться с оператором <> в Perl?

Я видел, что close ARGV может закрыть текущий обрабатываемый файл, но кажется, что ARGV на самом деле не является дескриптором файла, поэтому я не могу использовать его в вызове read. Есть ли способ получить текущий дескриптор файла, или мне придется явно открывать файлы самостоятельно?

... но может показаться, что ARGV на самом деле не является дескриптором файла. Это неверно. Если бы вы показали нам код, который привел вас к такому неверному выводу, мы могли бы помочь вам решить вашу проблему. Хотя я должен сказать, что если вы используете read для чтения из дескриптора файла, то использование ARGV — плохой выбор. <> и <ARGV> используют строку чтения и разделитель входных записей для определения размера буфера, тогда как read() использует указанный пользователем размер. Это два разных способа чтения файлов

TLP 20.11.2022 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

... но может показаться, что ARGV на самом деле не является дескриптором файла, поэтому я не могу использовать его в вызове чтения

ARGV — это дескриптор файла, и его можно использовать внутри read.

Цитата из perlvar:

... простой дескриптор файла, соответствующий последнему файлу, открытому <>"*

Таким образом, это дескриптор файла, и его можно использовать при чтении. Но вам нужно сначала использовать <>, чтобы файл действительно открылся. И он не продолжится волшебным образом со следующим файлом, как это сделал бы <>.

Чтобы протестировать, просто сделайте (синтаксис оболочки UNIX, вам может потребоваться адаптировать его для Windows):

perl -e '<>; read(ARGV, my $buf, 10); print $buf' file

<> откроет данный файл и прочитает первую строку. Затем read прочитает следующие 10 байтов из того же файла.

О, приятно знать. Что означает «... Обратите внимание, что в настоящее время ARGV имеет магический эффект только внутри оператора <> ...»? Как вы можете использовать <ARGV> вместо <>?

Adrian 20.11.2022 15:57

@ Адриан: Да, вы также можете написать <ARGV> вместо <>. И <> — единственное место, где есть магия открытия следующего файла и переназначения ARGV.

Steffen Ullrich 20.11.2022 15:58

Re "<> - единственное место, где есть магия открытия следующего файла и переназначения ARGV.", не совсем. readline — единственное место, хотя <...> может быть сокращением для readline.

ikegami 29.11.2022 20:46

@ikegami: я думаю, что тогда документацию необходимо будет обновить, поскольку в ней говорится: «Обратите внимание, что в настоящее время «ARGV» имеет магический эффект только внутри оператора «<>»; в других местах это просто дескриптор файла, соответствующий последнему файлу, открытому "<>"."

Steffen Ullrich 29.11.2022 22:15

Видимо так. В «машине Perl» нет оператора <>, только в грамматике Perl. <...> компилируется в glob или readline. И нет флага, указывающего на то, что использовался синтаксис <...>. Логика есть (только) в операторе readline "Perl-машины". Доберетесь ли вы туда с помощью <...> или readline, не имеет значения.

ikegami 29.11.2022 22:20

<> — это сокращение от 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>>

Другие вопросы по теме