perl 如何逐行读取具有模式匹配的给定输出并将其存储在两个不同的阵列中

t3psigkw  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(196)

从下图中调出我想进行模式匹配的“thread id:从第一和第二组行输出中。把模式存储在两个不同的阵列中并且想要比较相同。

(in)*  : 2000:0:0:0:0:0:0:1/2026 -> 4000:0:0:0:0:0:0:1/2026;17, Conn Tag: 0x0, VRF GRP ID: 0(0), If: vms-2/0/0.16392 (4045), CP session Id: 0, CP sess SPU Id: 0, flag: 600023:c0, wsf: 0, diff: 0, FCB: 0
            npbit: 0x0 thread id:23, classifier cos: 0, dp: 0, is cos ready: No, sw_nh: 0x0, nh: 0x0, tunnel_info: 0x0, pkts: 36935, bytes: 2807060
            usf flags: 0x10, fabric endpoint: 16
            pmtu : 9192,  tunnel pmtu: 0
   (out)  : 2000:0:0:0:0:0:0:1/2026 <- 4000:0:0:0:0:0:0:1/2026;17, Conn Tag: 0x0, VRF GRP ID: 0(0), If: vms-2/0/0.0 (20429), CP session Id: 0, CP sess SPU Id: 0, flag: 600022:c0, wsf: 0, diff: 0, FCB: 0
            npbit: 0x0 thread id:255, classifier cos: 0, dp: 0, is cos ready: No, sw_nh: 0x0, nh: 0x0, tunnel_info: 0x0, pkts: 0, bytes: 0
            usf flags: 0x0, fabric endpoint: 16
            pmtu : 9192,  tunnel pmtu: 0

我编写了如下代码,并在$1中获得了输出。但无法将数字从$1输出中分离出来进行比较

my $file = '/homes/rageshp/PDT/SPC3/vsp_flow_output1.txt';
    open(FH, $file) or die("File $file not found");
    
    while(my $String = <FH>)
    {
        if($String =~ /thread id:(\d+)/)
        {
            print "$1 \n";
        }
    }
    close(FH);
    my @thrid = $1;
    print "$thrid[0]";
7ivaypg9

7ivaypg91#

变量$1在文件中迭代时会有不同的值。如果你在循环后尝试将其值存储在数组中,那么你只能得到最终值。你需要在循环中对它做些什么。

my @thrids;

while(my $String = <FH>)
{
    if($String =~ /thread id:(\d+)/)
    {
        print "$1 \n";
        push @thrids, $1;
    }
}

print "@thrids\n";

再给你几个建议。

  • 在现代Perl中,我们喜欢使用词法变量作为文件句柄,以及open()的三参数版本。
open(my $fh, '<', $file) or die("File $file not found");

while(my $String = <$fh>)
{
     ...
}
  • 大多数Perl程序员会在这里使用隐式变量$_
while (<$fh>)
{
    if (/thread id:(\d+)/)
    {
        ...
    }
}
  • 如果一次性读取所有文件(通过将$/设置为undef),则可以同时获取所有ID。
my $file_contents = do { local $/; <$fh> };

my @thrids = $file_contents =~ /thread id:(\d+)/g;
h4cxqtbf

h4cxqtbf2#

Perl为这种情况提供了一种方便的方法--从diamond操作符中读取,不需要打开和关闭文件。
读取文件后,将与正则表达式进行匹配,并将感兴趣的数据存储在数组中。
一旦从一个文件中读取了所有数据,就以一种方便的方式输出结果以供目视检查。

use strict;
use warnings;
use feature 'say';

my @thead_ids;
my $re = qr/thread id:(\d+)/;

/$re/ && push @thead_ids, $1 while <>;

say for sort @thead_ids;

script.pl input_file身份运行
提供的输入数据的输出示例

23
255

相关问题