Пересмотрено для Perl 5.14.
Начиная с 5.14 , с флагом /r
на вернуть замену, вы можете сделать это:
print "Your name without spaces is: [", do { $name =~ s/\s+//gr; }
, "]\n";
Выможно использовать map
и лексическую переменную.
my $name=" jason ";
print "Your name without spaces is: ["
, ( map { my $a = $_; $a =~ s/\s+//g; $a } ( $name ))
, "]\n";
Теперь вам нужно использовать лексику, потому что $ _ изменит псевдоним и, таким образом, изменит вашу переменную.
Вывод
Your name without spaces is: [jason]
# but: $name still ' jason '
По общему признанию do
будет работать так же хорошо (и, возможно, лучше)
print "Your name without spaces is: ["
, do { my ( $a = $name ) =~ s/\s+//g; $a }
, "]\n";
Но лексическое копирование все еще там.Назначение в my
является аббревиатурой, которую предпочитают некоторые люди (не я).
Для этой идиомы я разработал оператор, которого я называю filter
:
sub filter (&@) {
my $block = shift;
if ( wantarray ) {
return map { &$block; $_ } @_ ? @_ : $_;
}
else {
local $_ = shift || $_;
$block->( $_ );
return $_;
}
}
И вы называете это так:
print "Your name without spaces is: [", ( filter { s/\s+//g } $name )
, "]\n";