perl如何确定"原始符号"的类型

Gre*_*bet 7 perl typeglob

显然,可以在标量变量中存储"原始符号"(而不是对符号的引用),并在标量上下文中使用它.

如何确定标量值表达式是否是这些符号之一?

它们似乎字符串化"*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);
Run Code Online (Sandbox Code Playgroud)

生产:

((*main::foo))
[[]]
$VAR1 = *::foo;
Run Code Online (Sandbox Code Playgroud)

我期待着一些专注的价值ref $sym.

ike*_*ami 9

*foo被称为typeglob,简称为glob.glob是C结构实例的反映,它包含每种类型值的槽 - "类型"的"glob",可以说 - 并形成符号表的基础.

它们很奇怪,因为它们都是一种变量(*foo)和一种类型的值(值$sym),尽管这与此无关.

要确定值是否为glob,可以使用以下命令:

use Scalar::Util qw( reftype );

( reftype(\$sym) // '' ) eq 'GLOB'
Run Code Online (Sandbox Code Playgroud)

你也可以用

ref(\$sym) eq 'GLOB'   # Fooled by bless(\$sym, 'GLOB')
Run Code Online (Sandbox Code Playgroud)