使用perl脚本

时间:2017-07-24 00:33:51

标签: xml perl xml-parsing

我想按时间顺序更新一个包含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或其他东西解析更简单。

最好的问候。

1 个答案:

答案 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>
|;