Как напечатать то, что было заменено в операции замещения? - PullRequest
1 голос
/ 27 декабря 2010

Я понимаю, что это очень простой вопрос, но я действительно не смог найти его.= (

У меня есть что-то вроде этого:

$a =~ s/(\w*)/--word was here--/g;

И я хочу поместить в файл журнала, какие слова были заменены.

aa 123 bb 234 cc--word was here-- 123 --word was here-- 234 --word was here--

И это нормально, но я хочу запомнить aa, bb и cc и записать в файл журнала. Что мне делать?

На самом деле у меня естьскрипт удаления ссылок, но мне нужно вспомнить, какие ссылки были удалены. Я пытался упростить свою задачу для вас, но усложнил ее понимание - извините.

Ответы [ 3 ]

4 голосов
/ 27 декабря 2010

Вы можете использовать модификатор e, который оценивает правую часть как выражение:

   $a =~ s/(\w*)/log_it($1), ""/ge;
0 голосов
/ 27 декабря 2010

Вы можете сделать это в цикле вместо /g;:

my $string = "xxx ; yyy ; zzz";
my @replaced;
while ($string =~ s/(\w+)//) { push @replaced, $1 };
print join(",",@replaced);
# OUTPUT: xxx,yyy,zzz

Обратите внимание, что \w - это символ WORD, а не алфавит, поэтому он будет соответствовать цифрам 0-9 какЧто ж.Если вы хотите сопоставлять только буквы, используйте [[:alpha:]] class

0 голосов
/ 27 декабря 2010

Следующие слова сохраняются в массиве:

use strict;
use warnings;
use Data::Dumper;

my $s = 'cat dog';
my @words;
while ($s =~ s/(\w+)//) {
    push @words, $1;
}
print Dumper(\@words);

__END__
$VAR1 = [
          'cat',
          'dog'
        ];

Обновление: теперь, когда вы добавили входные и выходные данные, похоже, что вы хотите исключить числа.В этом случае вы можете использовать [a-zA-Z] вместо [\w].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...