2015-07-11 34 views
1

如何從正則表達式匹配的結果創建$標量? 有沒有什麼辦法,一旦腳本匹配正則表達式,它可以被分配給一個變量,所以它可以在以後使用,在塊之外。 IE。如果$regex_result = blah blah然後做一些事情。 我明白我應該使正則表達式儘可能不貪婪。Perl如何將虛擬分配給正則表達式匹配結果

#!/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

哪條線你有問題,你想從正則表達式得到什麼結果? –

+0

嗨腳本的作品,例如$正則表達式返回字符串中的'owner is blah blah'。但是,當我打印$正則表達式出塊時,它只是打印正則表達式,即^ \\ s \ *進攻\# – user3360439

+0

裏面塊$正則表達式返回「所有者是等等等等」,當你打印$正則表達式塊嗎?根本不清楚。 –

回答

0

使用下面的Perl變量來滿足您的需求 -

$`=前無論是由過去的模式匹配匹配,這還不包括在已退出已經嵌套塊匹配的模式的字符串。

$ & =包含由過去的模式匹配

$」匹配的字符串=以下任何由過去的模式匹配匹配,這還不包括在已退出已經嵌套blockes匹配的模式的字符串。例如:

$_ = 'abcdefghi'; 
/def/; 
print "$`:$&:$'\n"; # prints abc:def:ghi 
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用正則表達式/^s*owner $/$regex運行的匹配值(這將不匹配,如果它確實$sentence1但因爲它沒有爲false)。

我想。實際上,我並不確切知道該行會做什麼或準備做什麼。

0

我不太清楚你想要什麼比賽的部分:捕捉或其他。我寫了Regexp::Result,你可以用它來抓取成功比賽中的所有捕獲物,以及Regexp::Flow來抓取多個結果(包括成功狀態)。如果您只想要編號捕捉,則還可以使用Data::Munge

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"; 
0

你可以做到以下幾點:

my $str ="hello world"; 
my ($hello, $world) = $str =~ /(hello)|(what)/; 

say "[$_]" for($hello,$world); 

正如你看到的$你好包含 「你好」。

0

如果你有你的系統和我一樣,perl的5.18或更早版本在舊的Perl和你在上面使用$ $& $'像codequestor的答案,它會減慢你的程序。

相反,你可以用改性/p使用正則表達式,然後檢查這些3個變量:${^PREMATCH}${^MATCH},並${^POSTMATCH}您的匹配結果。