您可以使用adverb :delete
在 Perl 6 中,如果您知道数组元素的索引,则删除该元素:
my @letters = <a b c>; @letters[0]:delete; say @letters
# OUTPUT: «[(Any) b c]»
但是,如果您不知道索引,则无法执行此操作:
my @letters = <a b c>; $_:delete if $elem eq 'a' for @letters
#ERROR! → Variable '$_:delete' is not declared
如果你声明循环变量is rw
仍然是同样的问题:
my @letters = <a b c>; for @letters -> $l is rw { $l:delete if $l eq 'a' }; say @letters
#ERROR! → Variable '$l:delete' is not declared
似乎没有其他删除数组元素的方法。 equivalent for Perl 5's delete
事实上,指向那个副词。您可以使用 splice
但你必须再次知道索引。实现似乎是 this function, DELETE-POS
,它实际上需要知道数组索引。
所以问题是,如标题所示,如果您只有元素本身的句柄,而不是其索引,是否有办法删除数组(或关联数组)元素?
最佳答案
取决于您所说的删除
。在数组内部,执行 DELETE-POS
会将数组中的元素绑定(bind)到 nqp::null
,这将丢弃位于该位置的任何容器。在 HLL 级别,这由数组的类型表示:
my Str @letters = <a b c>;
@letters[1]:delete;
say @letters; # [a (Str) c]
但是,您可以通过分配 Nil
来达到相同的效果:
my Str @letters = <a b c>;
@letters[1] = Nil;
say @letters; # [a (Str) c]
在这种情况下,该元素的容器保持不变,您只需让它恢复到“自然”状态即可。如果您对这种类型的删除感到满意,您也可以在循环中使用它:
my Str @letters = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a (Str) c]
当我说:恢复到自然状态时,这也包括任何默认值:
my Str @letters is default<foo> = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a foo c]
如果你想真正从列表中消除元素而不将现有元素保留在其位置,你当然可以使用grep
:
my @letters = <a b c>;
@letters .= grep: * ne "b";
say @letters; # [a c]
但这似乎不是您想要的。
关于arrays - 如果您不知道数组元素的索引,则删除该元素的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655066/