Как сделать встроенное регулярное выражение Perl без установки переменной? - PullRequest
10 голосов
/ 23 июля 2010

Обычно, если вы хотите изменить переменную с помощью регулярного выражения, вы делаете это:

$string =~ s/matchCase/changeCase/; 

Но есть ли способ просто выполнить внутреннюю замену, не устанавливая ее обратно в переменную?

Я хочу использовать это как-то так:

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

Нечто подобное, вроде функции preg_replace в PHP.

Ответы [ 2 ]

12 голосов
/ 23 июля 2010

Пересмотрено для 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";
1 голос
/ 23 июля 2010
print "Your name without spaces is: @{[map { s/\s+//g; $_ } $name]}\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...