2012-08-26 52 views
1
sub my_sub { 
    my $str = shift; 
    $str =~ s/some/regex/; 
    return $str; 
} 

對於這樣一個簡單的子程序,五行似乎太長了。它可以被簡化,例如通過不使用中間變量?我應該如何縮短簡單的替換子程序?

+3

爲了使代碼可讀和可維護,額外的一行代碼有什麼問題?你認爲要獲得什麼? – pavel

+0

@pavel我不是在尋找一種解決方案,它使得它不可讀,不可維護,但更短。例如,如果有一些我不知道的就地替換,例如? – Tim

+1

你的問題假設perl可以或將會內聯一個子程序,這可能是也可能不是真的。在試圖縮短子程序之前,我會先確定這個問題的答案。 – chepner

回答

9

沒有中介變量和較短的一個行:

sub my_sub { 
    $_[0] =~ s/some/regex/; 
    return $_[0]; 
} 

編輯:作爲@pavel指出的,這將修改原始變量。

由於Perl 5.13.2,有非破壞性的改性劑/r(供參考,見perlop),這將不修改該變量的正則表達式進行操作上 - 這也允許溝另一行:

sub my_sub { 
    return $_[0] =~ s/some/regex/r; 
} 
3
sub my_sub { 
    (my $str = shift) =~ s/some/regex/; 
    $str; 
} 
1

對於簡單替換來說這並不長。它還創建數據的副本,替換該副本,並返回修改後的副本,同時單獨保留原始副本。所以,你會使用這樣的:

my $modified = my_sub($original); 

$_[0]有些答案的工作,第一項@_。這是原始數據的別名。這樣,Perl就不必複製數據,直到它知道你確實需要單獨的副本。當您在別名上進行替換時,您將修改原始文件。這樣做更像是改變原來的,併爲其分配回:

$original = my_sub($original); 

你問的問題,不過,是把它縮短。這通常不是一個足夠的理由去做任何事情。這是一個子程序,所以只要滿足您的要求,就儘可能長。在設計這類代碼之前,先弄清楚你的要求是什麼。

相關問題