显然,可以在标量变量中存储“原始符号”(而不是对符号的引用),并在标量上下文中使用它。
如何确定标量值表达式是否是这些符号之一?
它们似乎字符串化为"*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
的一些专用价值。
答案 0 :(得分:9)
*foo
被称为typeglob,简称为glob。 glob是C结构实例的反映,它包含每种类型值的槽-a" glob" "类型",有人可能会说 - 并形成符号表的基础。
它们很奇怪,因为它们都是一种变量(*foo
)和一种值($sym
的值),尽管这在这里并不相关。
要确定某个值是否为glob,您可以使用以下命令:
use Scalar::Util qw( reftype );
( reftype(\$sym) // '' ) eq 'GLOB'
您也可以使用
ref(\$sym) eq 'GLOB' # Fooled by bless(\$sym, 'GLOB')