我正在尝试从数据库中选择以下值:
报告@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'替换所有〜字符并打印最终值。请建议怎么做。
*我在网上研究了这个,但对于如何处理这些只读变量感到困惑。
答案 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;
它使您的代码意图更加清晰,因为您实际上是在分割@
个符号。