Как сделать, жемчуг встраивает regex, не устанавливая на переменную?

Обычно, если Вы хотите заменить переменную с regex, Вы делаете это:

$string =~ s/matchCase/changeCase/; 

Но есть ли способ просто сделать замену, встроенную, не задерживая его к переменной?

Я хочу использовать его в чем-то вроде этого:

my $name="jason";
print "Your name without spaces is: " $name => (/\s+/''/g);

Что-то как этот, отчасти как preg_replace функционирует в PHP.

10
задан daxim 23 July 2010 в 19:50
поделиться

2 ответа

Пересмотрено для 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";
12
ответ дан 3 December 2019 в 23:48
поделиться
print "Your name without spaces is: @{[map { s/\s+//g; $_ } $name]}\n";
1
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: