在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
答案 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";