2010-04-20 55 views
3

我有一個返回文件句柄對象的方法,我想從手柄閱讀。以下不起作用,因爲該方法調用的直角支架被解釋爲輸入讀取器的閉合尖括號:我怎樣才能從返回在Perl文件句柄的方法讀?

my $input = <$object->get_handle()>; 

也就是說被解析爲:

my $input = (< $object- >) get_handle() >; 

這顯然是一個語法錯誤。有沒有什麼辦法可以執行的角度操作中的一個方法調用,或者我需要把它分成兩個步驟,也是這樣嗎?

my $handle = $object->get_handle(); 
my $input = <$handle>; 
+5

也許最好的解決辦法是使用'IO :: File',然後把手柄的對象? – 2010-04-20 05:22:18

+3

'readline'是提出的問題的最佳解決方案,但我從現在開始決定使用OO作爲我的IO。 '使用IO :: File'。因此,我真正的答案是'$對象 - > get_handle-> getline'。 – 2010-04-20 16:29:38

回答

3

你必須打破它;所述<>運營商期望像< STDIN一個類型團>,包含到一個文件句柄或類型團等< $跳頻的基準的簡單的標量變量>或類似<的* .c>爲水珠()函數的參數。在你的例子中,你實際上調用了glob('$ object-')。

<>實際上被解釋爲對readline()的調用,所以如果你真的想要你可以說my $input = readline($object->get_handle());但我不確定這是乾淨的,特別是如果你要從句柄讀取多次。

有關詳細信息,請參見http://perldoc.perl.org/perlop.html#I%2fO-Operators

0

您將無法使用<...>運營商這裏閱讀文件句柄,因爲任何比<bareword><$scalar>更復雜的解釋爲glob(...)電話,所以沒有通常的歧義招數將在這裏工作。該<HANDLE>操作是readline HANDLE語法糖,讓你可以寫這樣說:

my $input = readline $object->get_handle; 

但是,如果你在一個循環中這樣做,這將是更有效的緩存手柄在一個標量。然後<...>運營商將按照您預期:

my $handle = $object->get_handle; 
while (my $input = <$handle>) { 
    ... 
} 
+0

我寧願不使用間接對象語法。很脆弱。我必須承諾絕不允許我的代碼來到任何靠近'get_handle'子例程的地方。 – 2010-04-20 02:54:28

+0

@Ryan:如果你從純粹的學術角度不關心這個問題,我會選擇你在問題中提供的兩個陳述解決方案。但是,從語法上看,Eric的解決方案看起來可以工作。它在Perl詩歌中看起來不錯。 – Ether 2010-04-20 02:59:35

+1

'readline FILE'與''完全一樣,所以這樣可以正常工作。 – 2010-04-20 03:04:35

7

你可以考慮拼寫<...>作爲readline(...)代替,通過使用一個很好的常規語法,而不是一個特例可以避免這個問題。或者你可以將它分配給一個標量。你的選擇。

+0

是的,我現在的解決方案是'readline'。 – 2010-04-20 03:16:21

1
my $input = readline($object->get_handle()); 

use IO::Handle; 

my $input = $object->get_handle()->getline();