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')
显然,可以在标量变量中存储 "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')