Когда ref ($ variable) возвращает 'IO'? - PullRequest
4 голосов
/ 02 июня 2010

Вот соответствующий отрывок из документации по функции ref:

Возвращаемое значение зависит от типа вещи, на которую ссылается ссылка. Встроенные типы включают в себя:

SCALAR
ARRAY
HASH
CODE
REF
GLOB
LVALUE
FORMAT
IO
VSTRING
Regexp

Исходя из этого, я предполагал, что вызов ref для дескриптора файла вернет 'IO'. Удивительно, но это не так:

use strict;
use warnings;

open my $fileHandle, '<', 'aValidFile';
close $fileHandle;

print ref $fileHandle;     # prints 'GLOB', not 'IO'

perlref пытается объяснить, почему:

Невозможно создать истинное ссылка на дескриптор ввода-вывода (дескриптор файла или dirhandle) используя обратную косую черту оператор. Максимум, что вы можете получить, это ссылка на typeglob, который является на самом деле полная таблица символов запись [...] Тем не менее, вы все еще можете используйте шарики типа и глобусы как будто они были ручками ввода / вывода.


При каких обстоятельствах ref вернет 'IO' тогда?

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

Единственный способ получить ссылку на ввод-вывод - использовать синтаксис * FOO {THING}:

$ioref = *glob{IO};

где glob - это именованный глобус, такой как STDIN, или ссылка, подобная $ fh. Но как только вы Такая ссылка может быть передана или сохранена в произвольных структурах данных, как и любой другой скаляр, поэтому такие вещи, как упорядочивание модулей, должны быть подкованы.

Поскольку glob или globref могут использоваться в качестве дескриптора файла и неявно получать содержимое IO, нет необходимости в IO refs. Основным исключением является следующее:

* +1007 *

(geniosym возвращает новую полуанонимную ссылку ввода-вывода, и любое не глобальное присвоение ссылки на глобус назначается только этой конкретной ссылке в глобе)

2 голосов
/ 02 июня 2010

Как говорит Конерак, ответ на этот вопрос:

Как мне получить функцию Perl ref () для возврата REF, IO и LVALUE?

Соответствующий фрагмент:

use Acme::Damn;
say 'IO:      ', ref damn *STDIN{IO}; # really prints IO

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...