查看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”不是数组引用,因此您会得到错误见过。