有两个文件。一个文件是名称列表。另一个文件是名称和详细信息列表。我想创建第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);
答案 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
或||
是个好主意。