我有2个输出:-
7: ib1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP>
9: bondib0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP>
使用perl我想要获得substr ib1和bondib0。 目前,如果我设置
substr($line,3,3); this will return ib1
substr($line,3,7); this will return bondib0
我想要上面有一个substr,该怎么做?
类似substr($ line,3,index($ line,“:”));
请让我知道,由于值的长度不同,我如何在上面具有3和7个索引的动态值。
答案 0 :(得分:5)
您使用substr
和index
的方法应该有效。但是,还有其他两种方法可以做到这一点。
比较容易的是使用正则表达式并进行模式匹配。
while (my $line = <DATA>) {
if ($line =~ m/: ([^:]+):/) {
print $1, "\n";
}
}
__DATA__
7: ib1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP>
9: bondib0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP>
这将匹配冒号:
和空格上的字符串,然后捕获不是冒号的所有内容,直到遇到另一个冒号为止。参见regex101.com进行解释,并查看perlretut来对regex进行简要介绍。
一种替代方法是在冒号和空格上使用split
。那里只有两个。
while (my $line = <DATA>) {
( undef, my $interface ) = split /: /, $line;
print $interface;
}
__DATA__
7: ib1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP>
9: bondib0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP>
它将在": "
上将字符串分成多个部分,丢弃第一部分,保存第二部分,然后丢弃其余部分。
但是正则表达式解决方案更好。
答案 1 :(得分:-1)
概括地说,我能想到的一种解决方案如下:-
my $pindex = rindex($line,":");
$str = substr($line,3,$pindex-3);
这通过阅读每个字符来解决目的。