2011-12-20 5 views
6

Perl docs рекомендую этот:Perl s/это/что/г ==> "Bareword нашел, где оператор ожидается"

$foo = $bar =~ s/this/that/r; 

Однако, я получаю эту ошибку:

Bareword found where operator expected near 
    "s/this/that/r" (#1) 

Это относится только к модификатор r, без него код работает. Однако я не хочу изменять $bar. я могу, конечно, заменить

my $foo = $bar =~ s/this/that/r; 

с

my $foo = $bar; 
$foo =~ s/this/that/; 

Есть ли лучшее решение? Не

+2

Работает ли он на Perl 5.14 ...? (Убедитесь, что у вас есть 'require v5.14;' в вашем заголовке ...) – BRFennPocock

+0

Редактировать: очевидно, 'use v5.13.2' является минимальным уровнем для' s /// r'. – BRFennPocock

+3

Что мы узнали здесь? Мы узнали, что мы должны прочитать документы *, которые пришли с * out perl distribution, а не читать документы из «где-то в Интернете». :-) – tadmc

ответ

17

Как пишет ruakh, /r является новым в perl 5.14. Однако вы можете сделать это в предыдущих версиях perl:

2

Там нет лучшего решения, нет (хотя я обычно пишу в одной строке, так как s///, по существу, выступающий в качестве части процесса инициализации:

my $foo = $bar; $foo =~ s/this/that/; 

). Кстати, причина вашего сообщения об ошибке почти наверняка заключается в том, что вы используете версию Perl, которая не поддерживает флаг /r. Этот флаг был добавлен совсем недавно, в Perl 5.14. Возможно, вам будет легче разработать, используя документацию для вашей собственной версии; например, http://perldoc.perl.org/5.12.4/perlop.html, если вы на Perl 5.12.4.