Обычно, если Вы хотите заменить переменную с regex, Вы делаете это:
$string =~ s/matchCase/changeCase/;
Но есть ли способ просто сделать замену, встроенную, не задерживая его к переменной?
Я хочу использовать его в чем-то вроде этого:
my $name="jason";
print "Your name without spaces is: " $name => (/\s+/''/g);
Что-то как этот, отчасти как preg_replace функционирует в PHP.
Пересмотрено для 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";
Теперь вы должны использовать лексическую переменную, потому что $_ будет alias и таким образом изменит вашу переменную.
На выходе получается
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";
Но лексическое копирование все равно присутствует. Присвоение within в 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";
print "Your name without spaces is: @{[map { s/\s+//g; $_ } $name]}\n";