sub my_sub {
my $str = shift;
$str =~ s/some/regex/;
return $str;
}
對於這樣一個簡單的子程序,五行似乎太長了。它可以被簡化,例如通過不使用中間變量?我應該如何縮短簡單的替換子程序?
sub my_sub {
my $str = shift;
$str =~ s/some/regex/;
return $str;
}
對於這樣一個簡單的子程序,五行似乎太長了。它可以被簡化,例如通過不使用中間變量?我應該如何縮短簡單的替換子程序?
沒有中介變量和較短的一個行:
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;
}
sub my_sub {
(my $str = shift) =~ s/some/regex/;
$str;
}
對於簡單替換來說這並不長。它還創建數據的副本,替換該副本,並返回修改後的副本,同時單獨保留原始副本。所以,你會使用這樣的:
my $modified = my_sub($original);
上$_[0]
有些答案的工作,第一項@_
。這是原始數據的別名。這樣,Perl就不必複製數據,直到它知道你確實需要單獨的副本。當您在別名上進行替換時,您將修改原始文件。這樣做更像是改變原來的,併爲其分配回:
$original = my_sub($original);
你問的問題,不過,是把它縮短。這通常不是一個足夠的理由去做任何事情。這是一個子程序,所以只要滿足您的要求,就儘可能長。在設計這類代碼之前,先弄清楚你的要求是什麼。
爲了使代碼可讀和可維護,額外的一行代碼有什麼問題?你認爲要獲得什麼? – pavel
@pavel我不是在尋找一種解決方案,它使得它不可讀,不可維護,但更短。例如,如果有一些我不知道的就地替換,例如? – Tim
你的問題假設perl可以或將會內聯一個子程序,這可能是也可能不是真的。在試圖縮短子程序之前,我會先確定這個問題的答案。 – chepner