Re: [問題] 欲以字串$XXXX作搜尋的條件怎麼寫?

看板Perl作者 (神奇的雄)時間15年前 (2009/12/10 01:45), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《nemay (may)》之銘言: : 有個問題, 想請PERL版的前輩們給點指教... : 我寫了一個程式, 期望它功能如下所述: : 首先讀取檔案內容, 取得每一個開頭為TREND_DEF的字串, : [0] [1] [2] [3] : TREND_DEF XXXXXXX XXXXXX : TREND_DEF XXX XXXXXX XXXXXX XXXXXXX : TREND_DEF XXXXX XXXXXX XXXXXX : . : . : . : XXXXXXX 99999 : XXX 88888 : XXXXX 7777 : 將每個字串split後,第[1]項都丟進陣列當作字串比對的key word : 再使用每個key word去搜尋開頭為"key word"的字串 : 但是遇到一個問題!! (如下面程式紅色標記部分) : 正規表示式中, 如果欲以字串作為搜尋的條件要怎麼寫呢?? : : ======================================================= : #!/usr/bin/perl; : use strict; : use warnings; : open INPUT,"<XXX.log" || warn "OPEN FAIL:$!"; : open OUTPUT,">XXX.txt" || warn "Can't creat file :$!"; : while(<INPUT>) : { : my @return = &searchitem($_); : my $search = $return[1]; : if ($_ =~ m/{^$search}/) : { : my $data = $_ ; : print OUTPUT "data\n"; : } : } : close INPUT; : close OUTPUT; : sub searchitem : { : my $search = shift; : if ($search =~ /(^TREND_DEF)/) : { : my @item = split (/\s+/, $search); : return @item; : } : } 1.subroutine部分 你把整行split後回傳 這樣@return裡面並不都是你要的keyword 2.紅字部分 那樣寫 只會就subroutine回傳的值做比對 這樣永遠不會有比對成功的時候 (因為你一直拿同一行的[0][1]做比對) 以下我是依照你的想法寫的 你參考看看 . . . while (my $line = <INPUT>) { my @return = &searchitem($line); foreach my $KEYWORD (@return) { if ($line =~ /^$KEYWORD/) { my $data = $line; print OUTPUT "$data\n"; } } } . . . sub searchitem() { my $search = shift; if ($search =~ /^TREND_DEF\s(.+)\s/) { my $keyword = $1; return $keyword; } } 但就你的想法 可能會發生一個問題 有可能keyword為開頭的字串在前面出現 但keyword在之後才取得 這樣你要的那行字串就不會被找到 所以建議你先把所有keyword找出來 再去比對keyword為開頭的字串 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.215.20

12/11 19:11, , 1F
謝謝你的指點跟建議, 我再trytry看...
12/11 19:11, 1F
※ 編輯: jamesbear 來自: 114.43.209.93 (12/12 00:48)
文章代碼(AID): #1B7-9MYt (Perl)
文章代碼(AID): #1B7-9MYt (Perl)