使用perl中的正则表达式匹配数据

时间:2015-06-02 05:20:41

标签: regex perl file

在perl文件中有一些文本,我想进行模式匹配。但它不起作用?

示例:

    open( FH, "perll.txt" );
    while (<FH>) {  $Return .= $_; }
    close(FH);
    if($Return =~ /Session Id.*\:\s.*\-\w+/)
    {
       print "data si$1";
        push(@se,$1);
        next;
        print "yyyyyy@se";
    }

perll.txt

    Session Id             : fffffa800d461010-1
          this is a good language
    Session Id             : fffffa800d461010-0990wew

我需要的输出是:

    fffffa800d461010-1,fffffa800d461010-0990wew   in an array

3 个答案:

答案 0 :(得分:1)

好的,首先关闭 - perl故障排除规则1。开启use strict;use warnings;

第二:while (<FH>) { $Return .= $_; } - 您正在将整个文件读入$Return。好吧,如果这就是你的意思。但我认为你不需要。它可能也更好地写成local $/; $return = <FH>

第三:请使用带有词法文件句柄的3参数。 2 Arg已经被弃用了很长一段时间,FH的样式是一个全局变量,这只是一个糟糕的形式。

第四:你的正则表达式没有捕获匹配中的任何内容 - 因此$1将始终为空。

第五:你的正则表达式没有g标志,所以它只对你的整个文件块匹配一次。

这应该做你想要的:

#!/usr/bin/perl

use strict;
use warnings;

open( my $input, "<", "perll.txt" ) or die $!;

my @session_ids;
while ( <$input> ) {
    my ( $session_id )= m/Session Id\s+:\s*(\S+)/;
    push ( @session_ids, $session_id ) if $session_id; 
}
close ( $input );
print join ( ",", @session_ids );
  • 我们以$input打开您的文件。
  • 迭代它,匹配Session Id并将(\S+)(一个或多个非空格)的ID捕获到$session_id。 (注意 - 需要成为列表上下文才能使其正常工作。
  • 如果存在$session_id,我们会将其插入@session_ids

请注意,这样做无需将整个文件读入内存,除非必要,否则通常是一件好事。 (它似乎不适合你的情况)。

答案 1 :(得分:1)

它不起作用,因为,

1)你试图将文件中的整个文本复制到标量 $Return,然后尝试解析标量变量(这不是正确的事情)

更好的方法是逐行解析文件,当匹配时,它应该被推送到数组。

2)并且,在模式匹配中没有捕捉模式(你没有指定需要匹配的模式,换句话说,什么是$ 1?)。这需要纠正。

#!/usr/bin/perl

my $Return;
my @se;
open( FH, "hello.txt" );
while (<FH>) {
  $Return = $_;

    if($Return =~ /Session Id\s+:\s+(.*)/)
    {

       push(@se,$1);
    }
}
my $output = join(",",@se);
print $output;
close(FH);

答案 2 :(得分:-1)

试试这个

undef $/;
open (FH,"1.txt");
my $string = <FH>;
close(FH);

@arr = $string =~ /Session Id\s+?:\s+?(.*?)\n/isg;

print "@arr\n";