我想检索数组的最后一个元素。数组是按以下方式检索的拆分字符串:
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...
是否可以直接获取最后一个元素?实现它的正确语法是什么?
答案 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];