如何在Perl中获取分割后的最后一个元素?

9
$k="1.3.6.1.4.1.1588.2.1.1.1.6.2.1.37.32";
@a=  split('\.',$k);
print @a[-1];                           # WORKS!
print  (split '\.',$k)[-1];             # Fails: not proper syntax.`

我想打印出split的最后一个元素,而不必使用中间变量。有没有办法做到这一点?我正在使用Perl 5.14。


4
你应该开启 use strictuse warnings。它会告诉你 @a[-1] 应该改为 $a[-1] - simbabque
3个回答

22

Perl将开括号(归因于print函数。语法错误来自于print()后面不能跟着[-1],哪怕在print()之间有空格也一样。如果您不想添加括号到print中,您需要在括号前加上+号以强制列表上下文。

print  +(split'\.', $k)[-1];

如果您未将语法用作期望具有圆括号的某些参数,则它也可以按照您尝试的方式工作。

my $foo = (split '\.', $k)[-1];
print $foo;

其实我自己每次都会掉进那个陷阱。 :P - simbabque
10
或者最明显的解决方案是,在会导致问题的情况下不要省略 print 的括号!print( (split'\.', $k)[-1] ); - ikegami
3
最简单的解决方案往往最难想到。@ikegami - simbabque

10

使用正则表达式捕获,而不是创建完整列表并对其进行切片以获取最后一个元素:

use strict;
use warnings;

my $k = "1.3.6.1.4.1.1588.2.1.1.1.6.2.1.37.32";
my ($last) = $k =~ /(\d+)$/;
print $last;

输出:

32

1

rindex() 函数从最后一个位置开始分割,而 index() 函数从第一个位置开始分割。

print substr( $k, rindex($k, '.')+1 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接