删除文本行的问题(如何实现匹配每个Reg,就删除)

删除文本行的问题(如何实现匹配每个Reg,就删除)

参考了http://bbs.chinaunix.net/viewthr ... =%C9%BE%B3%FD%D0%D0,但目前有点晕

但是如果
txt1    这么三行
111
222
333

txt2

ai1114
959950
222435
jjll9442
44333
79777

如果要用txt1作为条件来匹配,只要txt2匹配上txt1任一条件的行就删除。  perl怎么实现? 循环有点晕了。
我的要求也就是显示不包含txt1任一条件的txt2中的行

#多想想

open(TXT1, '<', 'txt1.txt') || die "$!\n";
open(TXT2, '<', 'txt2.txt') || die "$!\n";

my @rules = <TXT1>;
chomp @rules;
my @results = ();

while (my $line = <TXT2>) {
    if (0 == map {$line =~ /\Q$_\E/} @rules) {
        push @results, $line;
    }
}

print @results;


非常感谢您的帮助

这是参考的另外一种实现方法。我原来写的脚本问题出现在循环那里。
下面这种方法也可以提供给有我同样需求的人

#!/usr/bin/perl

open(F1,"oldnewid");
open(F2,"tt");
open(F3,">txt3.txt");
@a = <F2>;;
close(F2);
@b=<F1>;;
close(F1);

foreach $b1 (@b){

#chomp($b1);

  foreach $a1 (@a)
  {
  
    chomp($a1);
     if($b1 =~ /$a1/){
         $flag =0;
         last;
     }else{
         $flag =1;
     }
  }
  if($flag ==1)
  {
       print F3 "$b1";
  }
}




QUOTE:
原帖由 Lonki 于 2007-11-15 00:20 发表
#多想想

open(TXT1, '

Lonki兄最近也喜欢加上/\Q...\E/了啊,呵呵
最后用数组存储代替文件读写,是个小计巧啊,学习了
Could you tell me what's the meaning \Q , \E although I know the following has the same function?  where can I find docs for it?  
  
if(0 == grep {$line =~ !/\Q$_\E/} @a)

Thanks!
你去正则表达式那一部分就能找到了,简单说就是 不转义
中间包含部分被看作纯字符串
谢谢! 如此粗心


QUOTE:
原帖由 perljoker 于 2007-11-15 10:14 发表

Lonki兄最近也喜欢加上/\Q...\E/了啊,呵呵
最后用数组存储代替文件读写,是个小计巧啊,学习了

哎, 白天在公司只能看帖, 无法回复啊....


用\Q\E完全是情非得已, index会让代码增加好几行, 普通情况下还是建议用index


QUOTE:
原帖由 biginner 于 2007-11-15 10:54 发表
Could you tell me what's the meaning \Q , \E although I know the following has the same function?  where can I find docs for it?  
  
if(0 == grep {$line =~ !/\Q$_\E/} @a)

Thanks!

上面perljoker已经解释了\Q\E

你的这个if, 和LZ那一段并不是相同的作用.
grep是用同一条规则, 作于一个数组, 返回成功与否, 或匹配到的数组
而上面需要的是用一组规则, 作用于一个数组的每一个变量.
Thanks for your patience!  

I took a mistake for I got the same result with " if(0 == grep {$line =~ !/\Q$_\E/} @a)  "