【问题标题】:I can't seem to splice an array from a reference in Perl我似乎无法从 Perl 中的引用拼接数组
【发布时间】:2019-03-04 15:04:17
【问题描述】:

所以我将数组引用传递给函数以清除某些数组元素:

代码如下:

if($notes->[$x] !~ /[^CF]/)
{
    print "$notes->[$x]\n";
    splice (@{$notes}), $x, 1;          
}

如果我注释掉拼接线,循环可以正常显示数组的每个 $x 元素。但如果我不注释掉拼接注释,一切都会失败。它不会打印出 $x 元素,splice 命令也不会起作用。

在模式匹配 (m//) 中使用未初始化的值 /var/www/cgi-bin/Funx.pm 第 130 行。

使用未初始化的值 /var/www/cgi-bin/Funx.pm 第 132 行的连接 (.) 或字符串。

完全不确定这里发生了什么。我可以理解我的拼接线不是正确的语法。但是为什么它会影响它上面的行我不。

任何见解将不胜感激。

【问题讨论】:

  • 试试splice @$notes, $x, 1
  • @HåkonHægland 不,仍然无法正常工作,并在其他错误之上添加了一个新错误。 'splice() 在 /var/www/cgi-bin/Funx.pm 第 133 行的数组末尾偏移。'
  • 您没有充分证明您的问题。请阅读minimal reproducible example,然后解决您的问题。

标签: arrays perl


【解决方案1】:

首先

splice(@{$notes}), $x, 1;

应该是

splice(@{$notes}, $x, 1);

这不是您询问的错误,但这是您显示的唯一错误。


导致您确实获得的错误消息的错误可能是一个不正确的循环。我相信你正在使用类似于

的东西
for (@$notes)

for (0..$#$notes)

第一个是错误的,因为不允许您从正在迭代的数组中添加或删除元素。

第二个是错误的,因为它执行循环体的次数与数组最初包含元素的次数一样多,所以你最终会循环太多次。

【讨论】:

  • 现在可以使用了。很想知道为什么你可以做 '@splice, 3, 1;'但如果是引用,则需要使用括号splice (@{$reference}, $x, 1);
  • @SergioD.Caplan:很想知道为什么你可以这样做@splice, 3, 1;,但如果它是参考,你需要使用括号splice (@{$reference}, $x, 1); 你不需要这样做splice @{$reference}, $x, 1 也可以。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2012-11-02
  • 2019-05-24
  • 2020-03-17
相关资源
最近更新 更多