拆分字符串时访问元素

Access an element while splitting a string

我想检索数组的最后一个元素。 Array 是拆分后的字符串检索如下:
my @net_info = split(/\//,'10.0.0.2/8');

我只对数组的最后一个元素感兴趣,即一行中的 CIDR 值。我在想:
my $cidr = ${split(/\//,'10.0.0.2/8')}[-1];

但这导致:
Can't use string ("2") as an ARRAY ref while "strict refs" in use at...

是否可以直接获取最后一个元素?实现它的正确语法是什么?

查看 split() 的文档,我们看到:

Splits the string EXPR into a list of strings and returns the list in list context, or the size of the list in scalar context

所以我们可以得到数组中的列表:

my @net_info = split(/\//,'10.0.0.2/8');

然后获取该数组的最后一个元素:

my $cidr = $net_info[-1];

但是您可以使用 list slice 在一行代码中完成。列表切片的语法是:

( LIST )[ INDEX ]

你有点迷路并使用这个:

${ LIST }[ INDEX ]

所以你的问题的正确语法是:

my $cidr = ( split(/\//,'10.0.0.2/8') )[-1];

此外,如果您对作为 split() 的第一个参数的正则表达式使用不同的定界符,您的代码可能会更容易理解一些 - 从而无需转义斜线。

my $cidr = ( split(m[/],'10.0.0.2/8') )[-1];

更新:鉴于网络掩码只包含一个斜杠,这样写可能更容易:

my ($ip, $cidr) = split(m[/], '10.0.0.2/8');

或者(使用 undef 删除 split() 返回的第一个值:

my (undef, $cidr) = split(m[/], '10.0.0.2/8');

更新 2: 并解释您的原始代码中发生了什么。您无意中使用了这个结构:

${ ARRAYREF }[ INDEX ]

当您只有对数组的引用时,这是获取数组元素值的一种方法的通用版本(当然,更常见的是,您会使用 ARRAYREF->[ INDEX ])。

由于 ${ ... } 中的表达式预期计算为数组引用,并且数组引用始终是标量值,因此 Perl 在标量上下文中计算表达式。正如我们从上面的文档摘录中看到的那样,在标量上下文中,split() returns 列表中的元素数量 - 将为 2。并且“2”不是数组引用,所以你得到你看到的错误。

正确的语法是:

my $cidr = (split(/\//,'10.0.0.2/8'))[-1];