2010-06-02 83 views
4

下面是來自ref函數的文檔相關摘錄:

返回的值取決於事情的類型的引用是一個參考。內置類型包括:

SCALAR 
ARRAY 
HASH 
CODE 
REF 
GLOB 
LVALUE 
FORMAT 
IO 
VSTRING 
Regexp 

在此基礎上,我想到的是,上一個文件句柄調用ref將返回'IO'。出人意料的是,它並不:

use strict; 
use warnings; 

open my $fileHandle, '<', 'aValidFile'; 
close $fileHandle; 

print ref $fileHandle;  # prints 'GLOB', not 'IO' 

perlref試圖解釋爲什麼:

這是不可能創造一個真正 參考的IO句柄(句柄 或DIRHANDLE)使用運算符的反斜槓 。您可以得到的最多的是 對typeglob的引用,它實際上是一個完整的符號表 條目[...]但是,仍然可以使用 類型的globs和globrefs 就好像它們是IO句柄。


在什麼情況下會ref回報'IO'呢?

+0

我不要認爲'perlref'節選在這裏完全相關,但它是我能找到的最接近的。 – Zaid 2010-06-02 06:25:00

+3

http://stackoverflow.com/questions/1399833/how-can-i-get-perls-ref-function-to-return-ref-io-and-lvalue – Konerak 2010-06-02 06:38:17

回答

4

獲得IO參考的唯一方法是使用* FOO {THING}語法:

$ioref = *glob{IO}; 

其中glob是一個像STDIN這樣的命名的glob或像$ fh這樣的引用。但是一旦你有這樣一個引用,它可以像任何其他標量一樣傳遞或存儲在任意數據結構中,所以像編組模塊這樣的東西需要精通它。

由於glob或globref可以用作文件句柄並隱式獲取包含的IO thingy,因此IO引用的需求不是很多。主要的例外是:

use Symbol; 
# replace *FOO{IO} handle but not $FOO, %FOO, etc. 
*FOO = geniosym; 

(geniosym返回一個新的半匿名IO參考,任何非水珠引用到水珠分配只分配給水珠的特定基準的一部分)

2

由於Konerak說,答案是這樣一個問題:

How can I get Perl's ref() function to return REF, IO, and LVALUE?

相關的片段是:

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

,這實在不應該在生產中的代碼,因爲該死刪除使用祝福參考...

+0

嗯......這是'ref'會返回''IO''的唯一實例嗎? – Zaid 2010-06-02 06:59:07

+1

@Zaid - 看到ysth的優秀答案... +1對那個:) – DVK 2010-06-02 07:28:18

相關問題