【问题标题】:perl how to determine the type of a "raw symbol"perl如何确定“原始符号”的类型
【发布时间】:2018-05-17 03:17:21
【问题描述】:

显然,可以将“原始符号”(与对符号的引用相反)存储在标量变量中并在标量上下文中使用。

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

它们似乎字符串化为"*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 有一些专门的价值。

【问题讨论】:

    标签: perl typeglob


    【解决方案1】:

    *foo 被称为 typeglob,或简称 glob。 glob 是 C 结构实例的反映,该​​结构包含每个值类型的槽(可以说是“类型”的“glob”),并构成符号表的基础。

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

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

    use Scalar::Util qw( reftype );
    
    ( reftype(\$sym) // '' ) eq 'GLOB'
    

    你也可以使用

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

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多