如果您知道其索引,则可以使用Perl 6中的副词:delete删除数组元素:
my @letters = <a b c>; @letters[0]:delete; say @letters
# OUTPUT: «[(Any) b c]?»
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道索引,则无法执行此操作:
my @letters = <a b c>; $_:delete if $elem eq 'a' for @letters
#ERROR! ? Variable '$_:delete' is not declared
Run Code Online (Sandbox Code Playgroud)
如果声明循环变量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
Run Code Online (Sandbox Code Playgroud)
似乎没有其他方法可以删除数组元素.该等效Perl 5的delete点,实际上,该副词.你可以使用,splice但你必须再次知道索引.实现似乎是这个函数,DELETE-POS它实际上需要知道数组索引.
所以问题是,如标题所示,如果你只有元素本身的句柄而不是它的索引,那么有没有办法删除一个数组(或者,就此而言,关联数组)元素?
取决于你所说的delete.在内部,在数组上,做一个DELETE-POS绑定数组中的元素nqp::null,这将丢弃生活在该位置的任何容器.在HLL级别,这由数组的类型表示:
my Str @letters = <a b c>;
@letters[1]:delete;
say @letters; # [a (Str) c]
Run Code Online (Sandbox Code Playgroud)
但是,您可以通过分配Nil以下内容来实现相同的效果
my Str @letters = <a b c>;
@letters[1] = Nil;
say @letters; # [a (Str) c]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,该元素的容器保持不变,只需让它恢复到"自然"状态即可.如果您对这种类型的删除感到满意,您也可以在循环中使用它:
my Str @letters = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a (Str) c]
Run Code Online (Sandbox Code Playgroud)
当我说:恢复到自然状态时,这还包括任何默认值:
my Str @letters is default<foo> = <a b c>;
$_ = Nil if $_ eq "b" for @letters;
say @letters; # [a foo c]
Run Code Online (Sandbox Code Playgroud)
如果您想真正根除列表中的元素而不将现有元素保留在其位置,您当然可以使用grep:
my @letters = <a b c>;
@letters .= grep: * ne "b";
say @letters; # [a c]
Run Code Online (Sandbox Code Playgroud)
但这似乎不像你的意图.
请阅读Lizmat的答案,以便对您的名义问题进行深思熟虑和有用的分析,在该问题中,她会适当注意英文单词"删除"的含糊不清.
这里有一种方法可以按下她的答案中的一个建议,回到使用:delete副词,以便最终@letters保持与第一个元素:delete'd 相同的数组,因此结果与原始([(Any) b c])相同:
my @letters = <a b c>;
.[.grep: 'a', :k]:delete given @letters;
say @letters;
Run Code Online (Sandbox Code Playgroud)
上的:k副词grep告诉你希望结果是索引.