2009-09-09 36 views

回答

14

这里的生产大多的快速简便的方法:

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 = 
. 

REF只是另一个参考参考。 LVALUE是一个标量的特殊情况,如果它被修改了,它会产生外部影响。

IO是手柄后面的基本类型,可以使用Acme::Damn from CPAN明确表示出来。正如Michael Carman在评论中指出的那样,您确实不应该在实际代码中使用不会出现的对象  —。

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

ref函数的源也有代码位,显示“绑定”和“未知”,但不应该有办法让那些没有用内部搞乱。 Blead也有一个有趣的“REGEXP”(不同于上面的“Regexp”);如果有人知道如何让ref的收益率...

+2

作为'该死的'这个名字是令人愉快的,它是不可能的,你会想要删除祝福。使用'Scalar :: Util :: reftype()'来查看过去的'bless'到底层的引用类型。 – 2009-09-09 15:20:35

+0

该死!我忘了Scalar :: Util! :-D不幸的是,我似乎无法用它来让'ref'返回“IO”。我会添加一个关于'该死的'不严重的警告;感谢您的提醒。 – 2009-09-09 15:33:41

2
  1. LVALUE

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

    LVALUE

    perldoc -f ref

  2. REF

    这一个是解释
    perl5.8 -e '{$a = "aaa"; $b = \\$a; print ref($b)."\n"}'

    REF

    它基本上到本身是一个参考值的参考。 可能会更好做$b = \$a; $c = \$b; print ref($c)

4

REF意味着你有一个参考参考:

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

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) 

我不知道如何直接得到IO参考。