8

Perl 文档推荐这个:

$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/;

有更好的解决方案吗?

4

3 回答 3

20

正如 ruakh 所写,/r在 perl 5.14 中是新的。但是,您可以在以前的 perl 版本中执行此操作:

(my $foo = $bar) =~ s/this/that/;
于 2011-12-20T19:53:47.223 回答
2

没有更好的解决方案,没有(尽管我通常将它写在一行上,因为s///它本质上是作为初始化过程的一部分:

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

顺便说一句,您的错误消息的原因几乎可以肯定是您正在运行不支持该/r标志的 Perl 版本。该标志是最近在 Perl 5.14 中添加的。您可能会发现使用您自己版本的文档进行开发会更容易;例如,如果您使用的是 Perl 5.12.4 ,则为http://perldoc.perl.org/5.12.4/perlop.html 。

于 2011-12-20T19:49:55.697 回答
-1

为了完整性。如果您被旧版本的perl. 并且真的想使用该s///命令而不求助于使用临时变量。这是一种方法:

perl -E 'say map { s/_iter\d+\s*$//; $_ } $ENV{PWD}'

基本上使用 map 来转换字符串的副本并返回最终输出。而不是什么s///- 返回替换计数。

于 2021-01-21T03:34:49.417 回答