使用Perl处理名称和详细信息列表

时间:2019-05-09 09:00:46

标签: regex file perl

有两个文件。一个文件是名称列表。另一个文件是名称和详细信息列表。我想创建第3个文件,其中包含第1个文件的名称和第2个文件的详细信息(该名称)。你能建议一下吗?

第二个文件的详细信息由模式“ list [i]”(第一个文件的名称)和“ ”

定界
#!/usr/intel/bin/perl


use warnings;
use strict;
use Data::Dumper;



my $handle;
unless (open $handle, "<:encoding(utf8)", "/nfs/fm/disks/fm_nvm_7138/WLRD_LOGIC_users/cgoudarx/willard_b02/chiplevel/verif/testsuites/upf/pss_ret_regs.txt") {
   print STDERR "Could not open file '/nfs/fm/disks/fm_nvm_7138/WLRD_LOGIC_users/cgoudarx/willard_b02/chiplevel/verif/testsuites/upf/pss_ret_regs.txt': $!\n";
   # we return 'undefined', we could also 'die' or 'croak'
   return undef
}
chomp(my @list = <$handle>);
unless (close $handle) {
   # what does it mean if close yields an error and you are just reading?
   print STDERR "Don't care error while closing '/nfs/fm/disks/fm_nvm_7138/WLRD_LOGIC_users/cgoudarx/willard_b02/chiplevel/verif/testsuites/upf/pss_ret_regs.txt': $!\n";
} 

open ( INPUT, "/nfs/fm/disks/fm_nvm_7138/WLRD_LOGIC_users/cgoudarx/willard_b02/chiplevel/verif/testsuites/upf/tet.xml" ) or die("Could not open xml file.");

my $outffile ="newlist.xml";
open(FILEOUT2, ">$outffile") || die "ERROR: Can't open the output file $outffile: $!";

my $size = @list;

for (my $i=0; $i < $size; $i++) {
    while( my $line = <INPUT> )
    {

        if ( $line =~ m/$list[$i]/) {
            print FILEOUT2 $line;
            while( $line = <INPUT>) # print till empty line
            {
                last if ( $line =~ m/<\/reg>/);
                print FILEOUT2 $line;
            }
            print FILEOUT2 $line;
        };
    };
};

close(INPUT);

1 个答案:

答案 0 :(得分:0)

您的输入文件之一是XML文档。您不应该使用正则表达式来解析XML文档。使用适当的XML解析器是一个更好的主意(我建议使用XML::LibXML)。

如果您坚持使用正则表达式来解析XML,那么您将无法一次处理输入文件,因为XML元素通常(通常是?)跨越多行。

另外,请更新您的文件处理代码以使用open()和词汇文件句柄的3参数版本。

open ( my $in_fh, '<', "...") or die("Could not open xml file.");

open( my $out_fh, '>', $outffile) || die "ERROR: Can't open the output file $outffile: $!";

哦,在这些命令中标准化使用or||是个好主意。