如何从正则表达式匹配的结果中创建$标量?
有没有办法,一旦脚本匹配正则表达式,它可以分配给一个变量,以便以后可以在块之外使用它。
IE浏览器。如果$regex_result = blah blah
然后做某事。
我明白我应该让正则表达式尽可能不贪婪。
#!/usr/bin/perl
use strict;
use warnings;
# use diagnostics;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
my @Qmail;
my $regex = "^\\s\*owner \#";
my $sentence = $regex =~ "/^\\s\*owner \#/";
my $outlook = Win32::OLE->new('Outlook.Application')
or warn "Failed Opening Outlook.";
my $namespace = $outlook->GetNamespace("MAPI");
my $folder = $namespace->Folders("test")->Folders("Inbox");
my $items = $folder->Items;
foreach my $msg ( $items->in ) {
if ( $msg->{Subject} =~ m/^(.*test alert) / ) {
my $name = $1;
print " processing Email for $name \n";
push @Qmail, $msg->{Body};
}
}
for(@Qmail) {
next unless /$regex|^\s*description/i;
print; # prints what i want ie lines that start with owner and description
}
print $sentence; # prints ^\\s\*offense \ # not lines that start with owner.
答案 0 :(得分:2)
一种方法是验证匹配是否发生。
use strict;
use warnings;
my $str = "hello what world";
my $match = 'no match found';
my $what = 'no what found';
if ( $str =~ /hello (what) world/ )
{
$match = $&;
$what = $1;
}
print '$match = ', $match, "\n";
print '$what = ', $what, "\n";
答案 1 :(得分:0)
正则表达式的匹配存储在特殊变量中(如果指定正则表达式并使用/p
标志,则存储在一些更易读的变量中。)
对于整个最后一场比赛,您正在查看$MATCH
(或简称为$&
)变量。这包含在手册页perlvar
中。
所以说你想把你最后一个for循环的匹配存储在一个名为@matches
的数组中,你可以编写循环(由于某种原因,我认为你的意思是它是一个foreach循环):
my @matches = ();
foreach (@Qmail) {
next unless /$regex|^\s*description/i;
push @matches_in_qmail $MATCH
print;
}
我认为您的代码存在问题。我不确定最初的意图,但看看这些内容:
my $regex = "^\\s\*owner \#";
my $sentence = $regex =~ "/^\s*owner #/";
我将逐步完成:
$regex
分配给字符串^\s*owner #
。$sentence
分配给使用正则表达式$regex
在/^s*owner $/
内运行匹配的值(如果$sentence
1
将Fragment
,则不匹配但是因为它不是假的。)我想。我实际上并不完全确定该行会做什么或者意图做什么。
答案 2 :(得分:0)
我不太确定你想要的比赛的哪一部分:捕捉或其他东西。我写了Regexp::Result,您可以使用它来获取成功匹配的所有捕获等,并Regexp::Flow获取多个结果(包括成功状态)。如果您只想要编号捕获,也可以使用Data::Munge
答案 3 :(得分:0)
您可以执行以下操作:
my $str ="hello world";
my ($hello, $world) = $str =~ /(hello)|(what)/;
say "[$_]" for($hello,$world);
如您所见,$ hello包含“hello”。
答案 4 :(得分:0)
使用Perl变量以满足您的要求 -
$`=前一个模式匹配所匹配的字符串之前的字符串,不计算已经退出的嵌套块中匹配的模式。
$&安培; =包含与最后一次模式匹配匹配的字符串
$' =跟随最后一个模式匹配的字符串后面的字符串,不计算已经退出的嵌套块中匹配的模式。例如:
$_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # prints abc:def:ghi
答案 5 :(得分:0)
如果您的系统上有较旧的perl,例如我,perl 5.18或更早版本,而您使用$ $& $'
上面的codequestor答案,则会降低您的程序速度。
相反,您可以将正则表达式模式与修饰符/p
一起使用,然后检查这3个变量:${^PREMATCH}
,${^MATCH}
和${^POSTMATCH}
以获得匹配结果。