代码之家  ›  专栏  ›  技术社区  ›  FMc TLP

如何让Perl的ref()函数返回ref、io和lvalue?

  •  4
  • FMc TLP  · 技术社区  · 15 年前

    文件 ref() 提到几个可能的返回值。我了解他们中的大多数,但不是 REF , IO LVALUE . 如何编写Perl代码 ref 返回这些值?

    阅读文档后 typeglobs and file handles ,我为了 输入输出 用这个代码:

    open(INPUT, '<', 'foo.pl');
    print ref(*INPUT{IO}), "\n";  # Prints IO::Handle
    

    为了 裁判 左值 我试了几个奇怪的结构,但没有成功。

    3 回复  |  直到 15 年前
        1
  •  15
  •   JB.    15 年前

    以下是一种快速而简单的方法,可以生产大部分产品:

    use 5.010;
    say 'SCALAR:  ', ref \undef;
    say 'ARRAY:   ', ref [1..5];
    say 'HASH:    ', ref { key => 'value' };
    say 'CODE:    ', ref sub {};
    say 'REF:     ', ref \\undef;
    say 'GLOB:    ', ref \*_;
    say 'LVALUE:  ', ref \substr "abc", 1, 2;
    say 'LVALUE:  ', ref \vec 42, 1, 2;
    say 'FORMAT:  ', ref *STDOUT{FORMAT}; # needs declaration below
    say 'IO:      ', ref *STDIN{IO};   # actually prints IO::Handle
    say 'VSTRING: ', ref \v5.10.0;
    say 'Regexp:  ', ref qr/./;
    
    format =
    .
    

    引用只是对另一个引用的引用。lvalue是标量的一种特殊情况,如果对其进行修改,它将具有外部影响。

    IO是句柄后面的基本类型,您可以使用 Acme::Damn from CPAN . 正如MichaelCarman在评论中所指出的,你真的不应该解开对象的标签-不要在真正的代码中使用。

    use Acme::Damn;
    say 'IO:      ', ref damn *STDIN{IO}; # really prints IO
    

    的来源 ref 函数也有一些代码来显示“bind”和“unknown”,但是不应该有一种方法可以在不干扰内部结构的情况下获得这些代码。布莱德还有一个有趣的无抵押“regexp”(不同于上面的“regexp”);如果有人知道如何 裁判 屈服于…

        2
  •  4
  •   Brad Gilbert    15 年前

    REF 意味着您有一个参考:

    my ($x, $y, $z);
    $x = 1;
    $y = \$x;
    $z = \$y;
    print ref $z;  # REF
    

    LVALUE 引用很少,但您可以从返回lvalue的某些函数中获得它们。 substr 是:

    $x = 'abcdefg';
    $y = \ substr($x, 0, 3);
    print ref $y;  # LVALUE
    

    IO::Handle 物体实际上是有福的 IO 参考文献:

    $x = *STDIN{IO};
    print ref $x;  # IO::Handle
    print $x;      # IO::Handle=IO(0x12345678)
    

    我不知道怎么弄到 输入输出 直接裁判。

        3
  •  2
  •   Brad Gilbert    15 年前
    1. LVALUE

      perl5.8 -e '{$a = "aaa"; $b = \substr($a, 0, 2); print "$$b\n"; print ref($b)."\n"}'
      aa

      左值

      这个解释在 perldoc -f ref

    2. REF

      perl5.8 -e '{$a = "aaa"; $b = \\$a; print ref($b)."\n"}'

      裁判

      它基本上是对一个值的引用,这个值本身就是一个引用。 可能会做得更好 $b = \$a; $c = \$b; print ref($c)