2009-09-09 72 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參考。