拆分字符串时访问元素

时间:2019-05-29 10:23:15

标签: arrays perl variable-assignment

我想检索数组的最后一个元素。数组是按以下方式检索的拆分字符串:
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...

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

2 个答案:

答案 0 :(得分:4)

在查看split()的文档时,我们看到以下内容:

  

将字符串EXPR拆分为字符串列表,并在列表上下文中返回列表,或者在标量上下文中返回列表的大小

因此我们可以将列表放入数组中

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

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

my $cidr = $net_info[-1];

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

( 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()返回列表中的元素数量-将为2。而“ 2”不是数组引用,因此您将得到以下错误:你已经看到了。

答案 1 :(得分:1)

正确的语法是:

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