【问题标题】:Perl string replacing quotes causes the browser to hangperl字符串替换引号会导致浏览器挂起
【发布时间】:2018-08-22 05:08:56
【问题描述】:

我正在读取一些数据,需要删除双引号。我正在使用

$myArray[$i] =~ tr/"//d;

虽然这可行,但当它到达数组中的特定元素时,它会挂起浏览器。该元素是:

"earnings":"{\"29262\":\"8.0595\"}"

我基本上只需要去掉引号、括号和斜线,这样它看起来就像 earnings:29262:8.0595 这样我就可以更好地处理数据。

【问题讨论】:

  • 你在解析 JSON 吗?
  • 使用现有的 JSON 解析器(例如 Cpanel::JSON::XS)而不是尝试创建自己的。
  • "earnings":"{\"29262\":\"8.0595\"}" - 这不是字符串,字符串可能是这个"\"earnings":"{\"29262\":\"8.0595\"}\"" 你能提供你的真实字符串吗?
  • 不使用 JSON,只是提取我​​提供的数据。不知道这实际上是 JSON 格式。这将是网络上的 CGI。我得看看那个解析器是否可用。
  • 正如其他人所说,这看起来像是 JSON 数据。当然,您没有义务这样对待它,但是您没有显示有效的 Perl 字符串,因此甚至无法猜测解决方案可能是什么。这是在 CGI 代码中吗?请展示一个重现问题的 Perl 程序,包括 @myArray 的定义以及您用来转储其内容的代码

标签: string perl replace double-quotes


【解决方案1】:

问题与您的正则表达式无关,取决于您如何编写循环

for ($i=0; $i <= @myArray.length; $i++)

例如,如果您的数组包含 5 个元素,则循环将允许 $i 等于 5,这等于数组中的第 6 个元素。因此,当您在$myArray[5] 上执行正则表达式时,它将用一个值填充它,这将改变数组的大小。而且由于数组的大小增加了,循环不会终止,并且会继续增长数组,直到内存不足。

如果您要在这样的循环中使用&lt;=,您希望使用$#myArray 来获得使用中的最高索引,如下所示:

for ($i=0; $i <= $#myArray; $i++)

看起来你已经解决了你的问题,因为你已经将数组的大小存储在$size 中,并且可能已经像

一样重写了循环
for ($i=0; $i <= $size; $i++)

所以它只会在数组中创建一个额外的元素并停止。如果你要使用数组的大小,你想像这样使用&lt;

for ($i=0; $i < $size; $i++)

【讨论】:

  • 是的,我确实重写了循环,但是当我将循环设置为比给我问题的那个少一时,它并没有挂起。当我将它明确设置为导致问题的那个时,它会挂起(我没有设置数组长度)。一旦我逃脱了报价,它就可以正常工作。我现在也可以使用 $size 了。谢谢各位的帮助。我很感激。我不是程序员,所以我知道有时我会问一些愚蠢的问题。
【解决方案2】:

我想我只需要转义双引号。这似乎有效:

$myArray[$i] =~ tr/\"//d;

【讨论】:

  • 这不是必需的,除非您的 Perl 代码以一种奇怪的方式执行,可能是通过对 shell 的调用?请解决这个问题,因为许多人会来到这里希望找到类似问题的解决方案。请通过编辑您的问题提供更多信息,尤其是代码和数据。在 cmets 中是不可读的。
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 2012-04-03
相关资源
最近更新 更多