如何使用Perl获取值的索引或变量长度(类似于Java的动态列表长度)?

时间:2018-08-08 10:57:23

标签: perl

我有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个索引的动态值。

2 个答案:

答案 0 :(得分:5)

您使用substrindex的方法应该有效。但是,还有其他两种方法可以做到这一点。

比较容易的是使用正则表达式并进行模式匹配。

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);

这通过阅读每个字符来解决目的。