2013-01-16 48 views
0

我有以下代碼:的Perl:我怎麼能一個變量匹配另一個變量

$st2 = quotemeta($st); 
if ($line =~ m/$st2\z/) { 
    print "GOOD\n"; 
} 
else { 
    print "BAAAAAAD\n"; 
} 

的$行我得到它從一個文件中。我讀了整個文件,然後做一個:

foreach $line in @file {...} 

對我來說,它只打印BAAAAAAD。另外,$ line可以包含「清晰」,「更清晰」,「最清晰」或其他一些詞,但我想匹配所有「清晰」實例,後綴要匹配所有「更清晰」的實例等等。 注意:「清除」不應該與「更清晰」或「最清晰」匹配。它應該只匹配「清除」

回答

0

這裏是什麼在起作用:

my $var1 = "clear"; 
my $var2 = "clear"; 
if ($var2 eq $var1) { 
    print "match\n"; 
} 
else { 
    print "no match\n"; 
} 

這也適用(顯示 「不匹配」)時, $ var1是「更清晰」的。

謝謝大家的幫助。

2

首先,如果您檢查文件進行搜索,請不要完全讀取它,而是逐行搜索。您也不需要使用quotemeta,除非您只想搜索純字符串。如果您想在行中的任何位置找到「清除」一詞,請在搜索模式中忽略\z。最後,你的字符串包含最終換行符,這可以防止\z看到字符串的結尾。使用chomp只在字符串

末刪除尾部換行符

my $st = 'clear'; 
while (<>) { 
    chomp; 
    if (m/$st\z/) { 
     print "GOOD\n"; 
    } else { 
     print "BAAAAAAD\n"; 
    } 
} 

perlre爲Perl的正則表達式

的\ž匹配的解釋如果你要搜索平原字符串只在行中的任何地方,你可以使用index

my $st = 'clear'; 
while (<>) { 
    if (index($_, $st) != -1/) { 
     print "GOOD\n"; 
    } else { 
     print "BAAAAAAD\n"; 
    } 
} 
+0

實際上,我曾用索引做過索引,但索引在「更清晰」上也匹配「清除」,我需要它匹配「清除」。 – user1984646

+0

@ user1984646從你的問題,我想你想找到任何包含「清除」的東西? –

+0

你說得對,我還不夠清楚 – user1984646

1

如果要匹配一個確切的單詞,請使用\b作爲單詞邊界。例如。 /\bclear\b/匹配clear但它不匹配clearer。當你正在查找的單詞不是字符串中唯一的單詞時,這很有用。

+0

是的,你的回答也有效。我在另一個網站上找到了帶有「eq」的解決方案,雖然在這裏也有很好的解決方案,但是您的解決方案也可以工作,而且它可以更好地處理我的代碼,但現在我已經修改了所有內容。謝謝:) – user1984646

0

你可以使用單詞boundries,下面的片段將匹配匹配「清晰」,「更清晰」或「最清楚」,清楚地告訴你它匹配

my @matches = qw/clear clearer clearest/; 

for $line (@lines) { 
    for (@matches) { 
    print "GOOD: Matches $_" if $line =~ /\b$_\b/; 
    } 
} 

所有行,當我運行這對一個輸入像這樣:

my @lines = ( 'clear', 'clearer', 'clearest', 'clear', 'clearer' );

的輸出是:

GOOD: Matches clear 
GOOD: Matches clearer 
GOOD: Matches clearest 
GOOD: Matches clear 
GOOD: Matches clearer 

如果clear是該行中較大句子的一部分,這也可以工作

+0

謝謝,但我希望它只匹配清晰,而不是其他。我最終找出瞭解決方案。 – user1984646

相關問題