Когда я обрезаю строку, я не часто хочу сохранить оригинал.Было бы неплохо иметь абстракцию подпрограммы, но также не нужно суетиться с временными значениями.
Оказывается, что мы можем сделать это, как объясняет perlsub :
Все переданные аргументы отображаются в массиве @_
.Следовательно, если вы вызываете функцию с двумя аргументами, они будут храниться в $_[0]
и $_[1]
.Массив @_
является локальным массивом, но его элементы являются псевдонимами для фактических скалярных параметров.В частности, если элемент $_[0]
обновляется, соответствующий аргумент обновляется (или возникает ошибка, если он не обновляется).
В вашем случае trim
становится
sub trim {
for (@_) {
s/^ \s+ //x;
s/ \s+ $//x;
}
wantarray ? @_ : $_[0];
}
Помните, что map
и for
являются двоюродными братьями, поэтому с циклом в trim
вам больше не нужно map
.Например,
my $line = "1\t 2\t3 \t 4 \t 5 \n";
my ($a, $b, $c, $d, $e) = split(/\t/, $line);
print "BEFORE: [", join("] [" => $a, $b, $c, $d), "]\n";
trim $a, $b, $c, $d;
print "AFTER: [", join("] [" => $a, $b, $c, $d), "]\n";
Вывод:
BEFORE: [1] [ 2] [3 ] [ 4 ]
AFTER: [1] [2] [3] [4]