Perl, как определить тип «необработанного символа» - PullRequest
0 голосов
/ 17 мая 2018

По-видимому, можно сохранить «необработанный символ» (в отличие от ссылки на символ) в скалярной переменной и использовать его в скалярных контекстах.

Как определить, является ли скалярное значениеВыражение является одним из этих символов?

Похоже, что они преобразуются в "*name_of_symbol", а ref возвращает "".Однако Data::Dumper также может определить, что это не строка, и печатает ее без кавычек.

Можно ли определить, когда у вас есть необработанный символ?Как Data::Dumper делает это?

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

local *foo = \4;

my $sym = *foo;

printf "((%s))\n", $sym;
printf "[[%s]]\n", (ref $sym);
print Dumper($sym);

производит:

((*main::foo))
[[]]
$VAR1 = *::foo;

Я ожидал какое-то выделенное значение для ref $sym.

1 Ответ

0 голосов
/ 17 мая 2018

*foo называется typeglob, или сокращенно glob.Глоб является отражением экземпляра структуры C, которая содержит слот для каждого типа значения - можно сказать, «глобуса» «типов», и формирует основу таблицы символов.

Онистранные, потому что они оба являются типом переменной (*foo) и типом значения (значение $sym), хотя здесь это не имеет значения.

Чтобы определить, является ли значение глобальным, вы можете использовать следующее:

use Scalar::Util qw( reftype );

( reftype(\$sym) // '' ) eq 'GLOB'

Вы также можете использовать

ref(\$sym) eq 'GLOB'   # Fooled by bless(\$sym, 'GLOB')
...