Чтобы не менять оригиналы, вы можете написать
sub mySubst { map { (my $s=$_) =~ s|abc|xyz|ig; $s } @_ }
или
sub mySubst { my @a = @_; map { s|abc|xyz|ig; $_ } @a }
или заимствовать из ответа Синан, за исключением явного исключения временного массива:
sub mySubst { map { s|abc|xyz|ig; $_ } my(undef) = @_ }
но синтаксис все еще немного шумный. Поскольку он использует map
, обязательно вызовите его в контексте списка:
my($result) = mySubst $str; # NOT my $one = mySubst $str;
Если вы ожидаете, что в основном вызовете mySubst
с одним аргументом, но хотите обрабатывать случаи с одним или несколькими аргументами, тогда вы можете написать
sub mySubst {
s|abc|xyz|ig for my @a = @_;
wantarray ? @a : $a[0];
}
но это снова вызывает заикание.
Если вы хотите обновить сам параметр, используйте семантику псевдонимов подпрограмм Perl, как описано в perlsub :
Массив @_
является локальным массивом, но его элементы являются псевдонимами для фактических скалярных параметров. В частности, если элемент $_[0]
обновляется, соответствующий аргумент обновляется (или возникает ошибка, если он не обновляется).
Чтобы вы могли написать
sub mySubst { $_[0] =~ s|abc|xyz|ig }
или даже
sub mySubst { map { s|abc|xyz|ig; $_ } @_ }
Пример использования:
$str = "fooabcbar";
mySubst $str;
print $str, "\n";
Выход:
fooxyzbar