如何使用Perl删除重复信息?

时间:2011-11-24 17:41:08

标签: perl

很抱歉一次又一次地问,因为在perl中缺乏知识,而且我是编程语言的新手。 我的实际问题是我从几个文件中提取一些节点并存储在一个字符串中,并且在该字符串中我有一些重复的字符串,所以我需要删除重复的字符串。所以我尝试了这样的建议。

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
use Carp;
  use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;

my @ARGV ="c:/main/work";die "Need directories\n" unless @ARGV;
my $all="<DTCSpecification xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
  find(
       sub {
    return unless ( /(_tr\.xml)$/ and -f );
    extract_information();
    return;
    },
  @ARGV
  );
 my $elem;
 sub extract_information {
    my $path = $_;

  if ( my $reader = XML::LibXML::Reader->new( location => $path )) {

         while ( $reader->nextElement( 'university' )) {
                  $elem = $reader->readOuterXml();
         $all=$all.$elem;
        }
   }
    return;
    }
  my $so="</DTCSpecification>";
  $all= $all.$so;

  my $doc = XML::LibXML->load_xml( string=>$all);
  my %seen;
    foreach my $uni ( $doc->findnodes('//university') ) 

     my $name = $uni->find('Code');

    print "'$name' duplicated\n",
    $uni->unbindNode() if $seen{$name}++;  # Remove if seen before
     }
   $all = $all.$doc->toString;
    print $all;

第一次打印两次,重复信息,第二次打印,不重复。我尝试了这么多,但我无法理解为什么它打印两次。如何消除重复信息的打印。它也是根据元素“代码”删除节点所以当代码元素第二次出现时它的删除节点,但有时我在第二次出现时没有有用的信息。我该怎样克服这一点。你可以帮帮我吗。我非常抱歉一次又一次地要求并浪费你宝贵的时间。我的谦卑请求。

1 个答案:

答案 0 :(得分:6)

目前尚不清楚为何需要XML::LibXML::Reader。或许在这方面可以提供更多信息。

这是我如何做到的:

use strict;
use warnings;
use XML::LibXML;

my $file = 'universities.xml';
my $doc = XML::LibXML->load_xml( location => $file );

my %seen;
foreach my $uni ( $doc->findnodes('//university') ) {  # 'university' nodes only

    my $name = $uni->find('name');

    print "'$name' duplicated\n",
      $uni->unbindNode() if $seen{$name}++;  # Remove if seen before
}

$doc->toFile('universities.xml'); # Print to file