作者jamesbear (神奇的雄)
看板Perl
标题Re: [问题] 欲以字串$XXXX作搜寻的条件怎麽写?
时间Thu Dec 10 01:45:56 2009
※ 引述《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
1F:→ nemay:谢谢你的指点跟建议, 我再trytry看... 12/11 19:11
※ 编辑: jamesbear 来自: 114.43.209.93 (12/12 00:48)