Найти и заменить без сохранения переменной - PullRequest
3 голосов
/ 23 октября 2010

Есть ли способ сделать это в одну строку?

my $b = &fetch();
$b =~ s/find/replace/g;
&job($b)

Ответы [ 3 ]

4 голосов
/ 23 октября 2010

Конечно, с блоком do {}:

use strict;
use warnings;

sub fetch { 'please find me' }
sub job   { print @_, "\n"   }

job( do { $_ = fetch(); s/find/replace/g; $_ } );

Причина в том, что в Perl вы не можете сделать fetch() =~ s/find/replace/;:
Can't modify non-lvalue subroutine call in substitution (s///) at ...

В Perl 5.14 будет введен флаг /r (который заставит регулярное выражение возвращать строку с подстановками, а не количество подстановок) и уменьшит вышеприведенное до:

job( do { $_ = fetch(); s/find/replace/gr; } );

отредактировано благодаря FM: можно сократить вышеуказанное до:

job( map { s/find/replace/g; $_ } fetch() );

И как только Perl 5.14 выйдет, его можно сократить до:

job( map { s/find/replace/gr } fetch() );
4 голосов
/ 23 октября 2010

Если вы спрашиваете, нужно ли вам проходить через скалярную переменную для замены, ответ - да. Это потому, что результат подстановки должен где-то храниться. Кроме того, подстановка не возвращает используемую переменную, она возвращает количество выполненных подстановок. Поэтому вы не можете встроить его (то есть, & job ($ b = ~ s / find / replace / g)) в вызов функции.

0 голосов
/ 24 октября 2010
for (fetch() . '') {   # append with '' to make sure it is a non-constant value
    s/find/replace/g;
    job($_)
}

или используйте apply из одного из модулей списка:

use List::Gen qw/apply/;

job( apply {s/find/replace/g} fetch() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...