是否有更好的方法来从某个索引到末尾获取可能为空的数组切片/范围?

时间:2019-01-02 10:18:31

标签: arrays slice fish

在鱼群中,范围是基于1的,并且包括两个极端,unsurprisingly在需要零长度范围时会导致问题。

尤其是在我将第一个参数拆分为自己的消费的情况下,我想转发其余的参数-可能没有! -一些命令。如果这是Python,我可以做类似的事情:

my_arg = sys.argv[1]
other_args = sys.argv[2:]

但是,不幸的是,将其直接翻译成鱼在极端情况下不起作用;考虑

set -l my_arg $argv[1]
set -l other_args $argv[2..-1]

(我的索引与在鱼的索引基于1的索引中相同,$argv不包括sys.argv[0]的索引)

只要有足够的论据,此方法就可以正常工作;例如,如果我使用参数a b c d e调用命令,则会得到$my_arg = a$other_args = b c d e

但是,如果我仅用a调用它,other_args也会令人惊讶地设置为a。这是由于-1实际上已扩展为某种(count $argv)效果的事实,因此上面的语句等效于

set -l other_args $argv[2..1]

,它是从不存在的元素2到存在的元素1( inclusive )的倒置范围,其归结为纯$argv[1]

为避免此问题,当前我正在使用这种可怕的解决方法

set -l other_args $argv[2..(expr (count $argv) + 1)]

可以确保最后一个索引比最后一个索引 ,从而将范围强制为“直的”索引,尽管可能完全超出范围(根据需要返回空列表)。 / p>

但是,我想知道:有没有更好的解决方案?

1 个答案:

答案 0 :(得分:3)

  

但是,我想知道:有没有更好的解决方案?

升级到3.0。这是2.7中修复的错误。

现在的工作方式是,如果范围中的索引中只有一个为负,则它将始终被解释为两个中的较大者,因此如果结果为负,则迭代必须继续进行。 / p>

如果索引实际上并不大,那么将导致不包含任何元素,而这正是您想要的。