【问题标题】:Splice in perl scriptperl 脚本中的拼接
【发布时间】:2014-01-11 16:21:08
【问题描述】:
my @writers = qw( Horace Ovid Virgil Asimov Heinlein Dante );
my @contemporary = splice @writers, 3, 2;
print join(' ', @contemporary);

输出

Asimov Heinlein

 


my @writers = qw( Horace Ovid Virgil Asimov Heinlein Dante );
splice @writers, 3, 2;
print join(' ', @writers); # Horace Ovid Virgil Dante

输出

Horace Ovid Virgil Dante

这些脚本有什么区别。为什么它显示不同的输出?

【问题讨论】:

  • 因为在第一种情况下,您正在打印splice 的返回值,而在第二种情况下,您会看到splice 对数组@writers 产生的影响。你没有理由期望两者应该是一样的,你的期望是错误的。

标签: perl splice


【解决方案1】:

这里

 my @contemporary = splice @writers, 3, 2;
 print join(' ', @contemporary);

它返回已删除的元素

在这里

splice @writers,3,2;
print join(' ', @writers)

它只是打印数组的元素

例如在标量上下文中

 my $contemporary = splice @writers, 3, 2;
 print $contemporary;

它会打印最后一个被移除的元素

来自perldoc

从数组中删除由 OFFSET 和 LENGTH 指定的元素,如果有的话,用 LIST 的元素替换它们。 在列表上下文中,返回从数组中删除的元素。在标量上下文中,返回删除的最后一个元素,如果没有删除任何元素,则返回 undef。阵列根据需要增长或缩小。如果 OFFSET 是负数,那么它从数组的末尾开始。如果省略 LENGTH,则从 OFFSET 开始删除所有内容。如果 LENGTH 为负数,则从 OFFSET 开始删除元素,但数组末尾的 -LENGTH 元素除外。如果 OFFSET 和 LENGTH 都省略,则删除所有内容。如果 OFFSET 超出了数组的末尾,Perl 会发出警告,并在数组末尾拼接。

【讨论】:

  • 你能解释一下为什么会这样吗?
  • 它的行为是这样的,因为函数的设计者认为这将是最有用的行为。我不明白你为什么不同意。您希望看到什么?
  • @user3114045:这是一个完全不同的问题,应该这样发布。 (而且你不应该试图在这里回答 Muhiwara。)
  • @Borodin : 是的,我只是不明白他在说哪个运营商
  • @Mugiwara:您的评论很中肯,但如果您能学会忽略或标记 cmets 中提出的新问题,那就太好了。如您所见,您回复的评论已被删除,大概是因为它应该是一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2017-12-08
  • 2010-09-26
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多