【问题标题】:Getting Error of Modification of a read-only value attempted尝试修改只读值时出错
【发布时间】:2016-03-04 11:55:14
【问题描述】:

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

报告@其众多问题之一是最近的@扩展 女装销售下滑,这家拥有七家商店的零售商表示将 在其所有商店开始为期三个月的清算销售。〜(A)它的 许多问题是最近的~(B) 它的许多问题是 最近~(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 分配它一个变量然后做替换

标签: perl


【解决方案1】:

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

所以你可以写:

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

【讨论】:

  • 我正在使用 Perl 5.10。这似乎在实现时给出了语法错误。
  • 是的。正如我所说,这个特性是在 Perl 5.14 中添加的。为什么不使用这十年发布的 Perl 版本? :-)
  • 我正在开发一些供我个人使用的东西,但在办公系统中。所以我不能升级它,除非我得到经理的批准。 :P
  • 好吧,首先,为什么你的办公室使用这么旧的 Perl 版本?其次,您不需要升级系统 Perl - 使用 perlbrew 安装更新版本的 Perl 以及现有版本。
【解决方案2】:

在这种情况下,您真正​​想要的是split,而不是正则表达式捕获组:

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

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

【讨论】:

  • 谢谢,我的方法是错误的。使用它,我得到了想要的结果!
【解决方案3】:

正如您所说,特殊变量 $1$2 等是只读的,这意味着您无法对它们执行替换。

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

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

请注意,在之前对 $ques 执行的替换中,您将删除所有 ~ 字符。

【讨论】:

  • 嗨,实际上我正在打印如下输出:print "$1", colored("$ques",'underline','yellow'),"$party","\n"; 如果我在拆分之前将 ~ 替换为 \n,它将在下划线中打印完整的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多