一个送分的题啊,要分的进来吧

bin127 2002-08-20 03:16:58
有二个文件。
test.log
test2.log

test.log文件格式
[perl]
version=2.0
path=/perl
tar=perl.5.6
[samba]
version=1.0
path=/samba
tar=samba.2.2.3a

test2.log文件格式
[perl]
version=2.2
tar=perl.6.0
[samba]
version=1.3
tar=samba.2.2.5a.tar.gz
[wu-ftp]
version=1.3
tar=ftp.1.3.tar.gz

现在要用test.log的内容与test2.log的内容进行比较,要求是同[]段的进行比较。
...全文
52 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bin127 2002-08-22
  • 打赏
  • 举报
回复
$File_1_Info{'perl'}{'version'} = '2.0'这个是什么意思?一个哈希变量还可以这样写吗?
bin127 2002-08-22
  • 打赏
  • 举报
回复
exists这个函数?
tl66 2002-08-22
  • 打赏
  • 举报
回复
这是引用的用法,hash的hash嘛, 其实$File_1_Info{'perl'}的value是个hash的地址,它里面保存有一个信息$hash{'version'} = '2.0';

写的明白点: $File_1_Info{'perl'} = { 'version' => '2.0' ,'path' => '/perl',…… }

{ }表示返回hash ('version' => '2.0' ,'path' => '/perl',…… ) 的地址
tl66 2002-08-20
  • 打赏
  • 举报
回复
自己建数据结构好像有点麻烦嘛 ^_^, 还是像楼上所说的用模块吧
如果不用模块,谁有好的办法吗?我也想知道
#!/usr/bin/perl -w
use strict;
my $File_1 = $ARGV[0];
my $File_2 = $ARGV[1];
my $OutFile = $ARGV[2];
my $File_1_Data = join('',@{ReadFile($File_1)});
my $File_2_Data = join('',@{ReadFile($File_2)});
my %File_1_Info = ();
my %File_2_Info = ();
my $SapLine = '-' x 20;
my @File_1_Order = ();
foreach my $File_1_Part (@{SplitData($File_1_Data)})
{
my $FirstName = '';
while($File_1_Part =~ /^.*?(?:\n|$)/mg){
my $Line = $&;
if($Line =~ /\[(.*?)\]/){
$FirstName = $1;
push(@File_1_Order,$FirstName);
}
elsif($Line =~ /(.+)=(.+)/){
$File_1_Info{$FirstName}{$1} = $2;
}
}
}

foreach my $File_2_Part (@{SplitData($File_2_Data)})
{
my $FirstName = '';
while($File_2_Part =~ /^.*?(?:\n|$)/mg){
my $Line = $&;
if($Line =~ /\[(.*?)\]/){
$FirstName = $1;
}
elsif($Line =~ /(.+)=(.+)/){
$File_2_Info{$FirstName}{$1} = $2;
}
}
}

open(OUT,">$OutFile") || die "Can't open $OutFile!\n";
foreach my $FirstName (@File_1_Order)
{
my $FirstFlag = 1;
if(exists $File_2_Info{$FirstName})
{
foreach my $key (keys %{$File_1_Info{$FirstName}})
{
if(exists $File_2_Info{$FirstName}{$key})
{
if($File_2_Info{$FirstName}{$key} ne $File_1_Info{$FirstName}{$key}) # exists in two files ,but their values are different
{
if($FirstFlag == 1){
$FirstFlag = 0;
print OUT "\n[$FirstName]\n";
}
print OUT "$File_1: $key=$File_1_Info{$FirstName}{$key}\n";
print OUT "$File_2: $key=$File_2_Info{$FirstName}{$key}\n";
print OUT "$SapLine\n";
delete($File_2_Info{$FirstName}{$key});
}
}
else # PriTitle is same but SubTitle is not in File_1
{
if($FirstFlag == 1){
$FirstFlag = 0;
print OUT "\n[$FirstName]\n";
}
print OUT "$File_1: $key=$File_1_Info{$FirstName}{$key}\n";
print OUT "$File_2: No\n";
print OUT "$SapLine\n";
}
}
if(keys %{$File_2_Info{$FirstName}} > 0) # PriTitle is same but SubTitle is not in File_2
{
foreach my $key (keys %{$File_2_Info{$FirstName}})
{
if($FirstFlag == 1){
$FirstFlag = 0;
print OUT "\n[$FirstName]\n";
}
print OUT "$File_1: No\n";
print OUT "$File_2: $key=$File_2_Info{$FirstName}{$key}\n";
print OUT "$SapLine\n";
}
}
delete($File_2_Info{$FirstName});
}
else # exists in File_1 but not in File_2
{
print OUT "\n[$FirstName]\n";
foreach my $key (keys %{$File_1_Info{$FirstName}}){
print OUT "$File_1: $key=$File_1_Info{$FirstName}{$key}\n";
print OUT "$File_2: No\n";
print OUT "$SapLine\n";
}
}
}
if(keys %File_2_Info > 0) # exists in File_2 but not in File_1
{
foreach my $FirstName (keys %File_2_Info)
{
print OUT "\n[$FirstName]\n";
foreach my $key (keys %{$File_2_Info{$FirstName}}){
print OUT "$File_1: No\n";
print OUT "$File_2: $key=$File_2_Info{$FirstName}{$key}\n";
print OUT "$SapLine\n";
}
}
}
close(OUT);

sub ReadFile
{
my $FileName = shift;
open(FILE,$FileName) || die"Can't open $FileName!\n";
my @FileData = <FILE>;
close(FILE);
return \@FileData;
}

sub SplitData
{
my $Data = shift;
my @SplitData;
while($Data =~ /\[(.+?)\].*?(?=(\[(.+?)\]|$))/sg){
push(@SplitData,$&);
}
return(\@SplitData);
}
cawangjun 2002-08-20
  • 打赏
  • 举报
回复
在http://search.cpan.org/src/WADG/Config-IniFiles-2.29/可以找到Config::IniFiles模块。
Linus2000 2002-08-20
  • 打赏
  • 举报
回复
使用Config::IniFiles模块
tl66 2002-08-20
  • 打赏
  • 举报
回复
你可以建立一个数据结构来保存文件的信息,比如可以用hash的hash,比如先读file1,将要的信息保存,比如$File_1_Info{'perl'}{'version'} = '2.0';$File_1_Info{'perl}{'path'} = '/perl';$File_1_Info{'samba'}{'version'} = '1.0';……等 ^_^
再读file2,到相应的字段,用exists函数检测,判断就可以了, 我不知道你要怎样的输出格式 ^_^

2,203

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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