尝试获取修改只读值的错误

时间:2016-03-04 11:55:14

标签: perl

我正在尝试从数据库中选择以下值:

  

报告@its许多问题之一是最近@扩展   这家七店零售商表示,女装的销售将下滑   在所有商店开始为期三个月的清算销售.~(A)其中   最近有很多问题〜(二)其中存在很多问题   最近〜(C)其中很多问题是最近〜(D)他们的很多问题   是最近〜(E)他们最近遇到的很多问题〜

我在变量$ ques中选择此值,然后选择如下文本:

$ques=~s/^(.*?)\@(.*?)\@(.*?)$/$2/;

现在,在用

替换字符串中的〜字符时
$3=~s/~/\n/g;    ---->line 171

并运行脚本,我收到一个错误:

Modification of a read-only value attempted at main.pl line 171

我想用'\ n'替换所有〜字符并打印最终值。请建议怎么做。

*我在网上研究了这个,但对于如何处理这些只读变量感到困惑。

3 个答案:

答案 0 :(得分:3)

你已经从JoséCastro那里得到了很好的解释。但是,如果您使用的是最新版本的Perl(更新:已经仔细检查过,我发现这意味着5.14 +),还有另一种解决方案。替换运算符的/r参数将复制您的字符串,在副本上进行替换,然后返回该更改的值。

所以你可以写:

my $new_value = $3 =~ s/~/\n/rg;

答案 1 :(得分:2)

就像你说的那样,特殊变量$1$2等是只读的,这意味着你无法对它们进行替换。

$ques上执行替换将满足您的需求:

$ques =~ s/~/\n/g;
print $ques;

请注意,在您$ques上执行的早期替换中,您将删除所有~个字符。

答案 2 :(得分:2)

听起来你在这种情况下真正需要的是split而不是正则表达式捕获组:

my @parts = split(/@/, $ques);
$parts[2] =~ s/~/\n/g;

它使您的代码意图更加清晰,因为您实际上是在分割@个符号。