perl如何判断一个"raw symbol"的类型

perl how to determine the type of a "raw symbol"

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

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

它们似乎字符串化为 "*name_of_symbol"ref returns ""。但是 Data::Dumper 也能够确定它不是字符串并在不加引号的情况下打印它。

是否可以确定您何时拥有原始交易品种? Data::Dumper 做得如何?

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

local *foo = ;

my $sym = *foo;

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

产生:

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

我期待 ref $sym 的一些专用值。

*foo被称为typeglob,简称glob。 glob 是 C 结构的一个实例的反映,它包含每个类型值的一个槽——一个 "types" 的 "glob",有人可能会说——并构成符号 table 的基础.

它们很奇怪,因为它们既是一种变量(*foo)又是一种值($sym 的值),尽管这与这里无关。

要确定一个值是否为 glob,您可以使用以下方法:

use Scalar::Util qw( reftype );

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

您也可以使用

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