求助,从表中删除指定的行。发现运行错误,请大家帮忙看一下代码

ygh1989 2013-03-15 09:07:20
小弟是perl菜鸟,写了个程序发现错了,但是找不到问题,请论坛前辈指教。
有两个表,一个表 BIG,一个列表POS。要从BIG表中删除POS中的每一行。
但是运行后,产生的文件还是原来的BIG表,并没有删掉POS的行
另外,这个程序运行很慢,有没有更好的算法呢?
#/usr/bin/perl
use strict;
use warnings;

die "Usage: perl $0 POSTIVE BIG OUT\n" unless (@ARGV == 3);

open (POS, $ARGV[0]) or die "Can not open file $ARGV[0]\n";
open (BIG, $ARGV[1]) or die "Can not open file $ARGV[1]\n";
open (OUT, ">$ARGV[2]") or die "Can not open file $ARGV[2]\n";

my %postag = ();

while(<POS>){
chomp;
my @line = split/\s+/;
my $var = $line[0]."\t".$line[1];
$postag{$var} =1;
}

while(<BIG>){
chomp;
my $flg = 0;
my @line = split/\s+/;
foreach my $tag(keys %postag){
my @var = split(/\t/,$tag);
if((($line[0] eq $var[0])&&($line[1] eq $var[1]))||(($line[0] eq $var[1])&&($line[1] eq $var[0]))){
$flg=1;
last;
}
}
if(!$flg){
print OUT join("\t",@line),"\n";
}

}
...全文
76 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugs2k 2013-03-15
  • 打赏
  • 举报
回复
    foreach my $tag(keys %postag){
        my @var = split(/\t/,$tag);
        if((($line[0] eq $var[0])&&($line[1] eq $var[1]))||(($line[0] eq $var[1])&&($line[1] eq $var[0]))){
            $flg=1;
            last;
        }
    }
    if(!$flg){
        print OUT join("\t",@line),"\n";
    }
貌似可以改为:
my $key = join("\t", @line);
if not exist $postarg{$key) {
    print OUT $key, "\n";
}
ygh1989 2013-03-15
  • 打赏
  • 举报
回复
引用 1 楼 bugs2k 的回复:
Perl code?12345678910 foreach my $tag(keys %postag){ my @var = split(/\t/,$tag); if((($line[0] eq $var[0])&&($line[1] eq $var[1]))||(($line[0] eq $var[1])&&am……
太好了,算出来了,谢谢哈

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧