Re: [問題] 欲以字串$XXXX作搜尋的條件怎麼寫?
※ 引述《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
12/11 19:11, 1F
※ 編輯: jamesbear 來自: 114.43.209.93 (12/12 00:48)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章