我想按时间顺序更新一个包含3个其他xml文件的150mo数据库xml文件,有人给我一个关于如何执行此操作的perl脚本的快速示例,但我不知道如何打开脚本基本文件和3更新。使用@args或直接打开带有open函数的文件。 他告诉我,我不需要解析xml文件,因为更新由数据库条目组成,只需要将这些junks的行放入一个哈希,条目id为哈希键,然后按顺序读取所有文件,以便条目更新或者创建一个新的,然后按键的数字顺序写出哈希值。
#! /usr/bin/perl -CIOE
use strict;
my %h = ();
my $head = '';
my $has_data = 0;
while (<>) {
/<db_entry db_id="(\d+)">/ and do {
my $entry = $_;
my $id = $1;
while (<>) {
$entry .= $_;
/<\/db_entry>/ and last;
}
$h{$id} = $entry;
$has_data = 1;
next;
};
if (! $has_data) {
$head .= $_;
next;
}
/\s*<timestamp/ and do {
$head .= $_;
next;
};
}
my $count = scalar keys %h;
print $head;
foreach (sort { $a <=> $b } keys %h) {
print $h{$_};
}
print qq| <db_entry_count count="$count" />
</databank_export>
|;
我不知道这个脚本应该如何通过命令行或打开函数顺序读取文件。这样做比使用xml :: twig或其他东西解析更简单。
最好的问候。
答案 0 :(得分:0)
我试图添加一些信息(评论),让您更好地理解。注意perl中的注释是使用&#34;#&#34;编写的。
除了第一行,只要您看到带有#
符号的内容,就会发表评论。
示例,如果您看到以下代码包含# Hash initialization
,则表示您的理解评论。我强烈建议您使用Notepad++
编辑器编写perl代码或理解下面的代码。您将获得清晰的视图,因为在记事本中++注释以绿色可见。希望这有用!
#! /usr/bin/perl -CIOE
use strict;
my %h = (); # Hash initialization
my $head = ''; # Variable initialization
my $has_data = 0; # Variable initialization (Numeric)
# Perl's diamond <> operator to read from files.
# It acts like a readline() command
while (<>) {
# "\d" matches all numbers; it is the same as [0-9]
# "+" sign for many expressions (1 or more)
/<db_entry db_id="(\d+)">/ and do {
my $entry = $_; # "$_" is a default operator
my $id = $1; # $1 is match operator (successful match)
while (<>) { # Again read from file
$entry .= $_; # Updating "$entry" variable everytime
/<\/db_entry>/ and last;
}
$h{$id} = $entry; # Preparing variable formed here will be value with index
# "$h{$id}" is equivalent to some value like "007XBCF(2)"
$has_data = 1; # assign value 1 to variable "has_data" which was 0
next; # iteration
};
if (! $has_data) { # If "$has_data" not exist then if loop runs
$head .= $_;
next;
}
/\s*<timestamp/ and do {
$head .= $_;
next;
};
}
my $count = scalar keys %h; # "scalar" will give you count for arrays or hashes
print $head;
# <=> compare operator of perl and rest syntax is of perl sort
foreach (sort { $a <=> $b } keys %h) {
print $h{$_};
}
print qq| <db_entry_count count="$count" />
</databank_export>
|;