2014-04-24 48 views
3

我想這個問題可能會有些不那麼重要,但我一直在想,爲什麼Perl中沒有低優先級定義或運算符。我想這是有原因的,因爲perlop明確提到了這個事實。在那裏我會覺得它有用爲什麼在Perl中沒有相當於//的低優先級?

一個實例就是在這樣的子程序:

sub input_many_data { 
    my $x = <> // return; 
    do_some_processing_with($x); 
    my $y = <> // return; 
    do_some_processing_with($y); 
    return ($x, $y); 
} 

while (1) { 
    my ($x, $y) = &input_many_data or last; 
    do_something_with($x, $y); 
} 

它確實有$x = (<> // return)工作,但目的會更明顯,並且代碼更易讀且不易出錯,像($x = <>) dor return

+1

我也總是希望這樣的操作存在。原因可能是p5p的個人構成。 – choroba

回答

6

我從來沒有真正理解爲什麼有些搬運工[1]有問題的。我覺得有一個缺乏對如何稱呼它(definedordorerr)共識,但現在回想起來,我會傾向於認爲真正的原因是缺乏舒適性use feature。請記住,在相同版本中,use feature//已添加到Perl中。

或者可能不是。你可以在p5 porters mailing list找到對話。


順便說一句,下面的意圖是很明顯的:

my $x = <> 
    // return; 

這是一個不好的做法,隱藏return在行的啦。替代方案是:

(my $x = <>) 
    // return; 

defined(my $x = <>) 
    or return; 

my $x = <>; 
$x // return; 

my $x = <>; 
return if !defined($x); 

那些那些與普遍兼容使用5.8。


  1. 那些誰在Perl本身工作。
+0

您對於在行尾隱藏「return」的評論很有意義。但是你知道一種使'Perl :: Tidy'看到這個論證的有效性的方法嗎? – scozy

+0

@scozy這不是特別有效。如果沒有閱讀整行代碼,就應該得到一個人得到的東西。 –

+0

@VectorGorgoth,例如,某人可能正在掃描子程序代碼,試圖瞭解爲什麼它返回一個空列表。我認爲讓控制流量表脫穎而出是有道理的。 – scozy