在這個例子中,我想學習編寫自適應子程序的最佳方法。適應修剪子程序
我需要一個修剪文本的子程序(實際上,這是一個藉口,我的子程序可以做其他任何事情)。
爲了更靈活,我想我的子程序接受的參數不同的類型:
my @input = (' A ', ' B', 'C ');
my @trimmed = trim(@input);
trim(\@input);
my $out = trim($input[0]);
返回'A'trim(\$input[0]);
修剪@input的第一個元素;trim(\@a, \@b, \@c);
字符串中的每一個陣列被修整my $out = trim(\@a, ' A ', ' B');
$ OUT =(QW/A B /); (將要討論的行爲)
這裏是我目前的醜陋的解決方案:
sub trim {
state $re = qr/^\s+|\s+$/m;
my @a;
for(@_) {
if(ref eq 'SCALAR') { $$_ =~ s/$re//g; }
elsif(ref) { trim(\$_) for(@$_); }
else { push @a, s/$re//gr; }
}
return \@a if @a > 1;
return $a[0] if $a[0];
}
是否有此實現支持不同類型的輸入如我上面提出的任何更好的解決方案?
這個問題的主要原因涉及我的最終應用程序,我在其中攜帶的文本可以存儲在字符串,字符串數組或甚至哈希中。
我想這是最好寫的:
trim(\@allmytexts);
align(\@allmytexts, align=>'right');
比:
for(@allmytexts) {
trim($_);
align($_, align=>'right');
}
我同意。支持一種或兩種調用樣式 - 我建議'trim(\ $ inplace)'和/或'$ output = trim($ input)'。如果調用者需要修剪整個數組,Perl可以使用完美的'map'和'for'關鍵字。 – tobyink 2014-08-31 21:40:38
@tobyink:正如我試圖暗示的,我不同意將傳遞引用作爲指示就地功能的標誌。或者像'trim($ string,inplace => 1)'或者'trim_inplace($ string)'就好了 – Borodin 2014-08-31 21:45:27
@borodin,爲什麼你認爲我的問題是脫離主題? – nowox 2014-08-31 23:01:53