一个微型数据库

| 暂无评论 | 暂无引用通告

-->

原文参见:http://www.stonehenge.com/merlyn/UnixReview/col04.html

网页上的数据为:

        Name: Randal L. Schwartz
Company: Stonehenge Consulting Services
Street: 4470 SW Hall Suite 107
City: Beaverton
State: Oregon
Zip: 97005
Phone: 503-777-0095

Name: John Big-booty
City: San Angeles
State: California
Zip: 93021
Phone: 291-555-2213

Company: Lips, Inc.
Street: 4221 Wayback Lane
City: Springfield
State: Kansas
Zip: 65554
我们将其复制下来使用命令
[root@supersun unixreview]# perl -ne '$_ =~ s/^\s+(\S)/$1/g;print $_' tinydatabase
选项-n是逐行执行的意思。
生成的数据如下,这样就和作者使用的原始数据一样了。

Name: Randal L. Schwartz

Company: Stonehenge Consulting Services

Street: 4470 SW Hall Suite 107

City: Beaverton

State: Oregon

Zip: 97005

Phone: 503-777-0095

Name: John Big-booty

City: San Angeles

State: California

Zip: 93021

Phone: 291-555-2213

Company: Lips, Inc.

Street: 4221 Wayback Lane

City: Springfield

State: Kansas

Zip: 65554


我们需要的结果:打印包含姓名公司及电话号码记录,并以电话号码排序。

具体步骤如下:

1、将每一段作为一个主体,解析数据生成关联数组;

2、将关联数组的引用$ref_entry传给数组@entries;

3、对数组以电话号码方式进行排序;

4、打印符合条件的行。

脚本如下

#!/usr/bin/perl -w

use strict;


$/='';

my @entries=();

while(<>){

my $ref_entry={}; #生成一个关联数组引用

foreach(split /\n/){

$$ref_entry{$1}=$2 if /^(.*):(.*)$/;

}

push @entries,$ref_entry;

}

@entries=sort {

$$a{"Phone"} cmp $$b{"Phone"}

} @entries;

foreach my $ref (@entries){

my $phone=$$ref{"Phone"};

next unless defined $phone;

my $name=$$ref{"Name"};

next unless defined $name;

my $company=$$ref{"Company"};

next unless defined $company;

print "$name ($company) $phone\n";

}

运行脚本:

[root@supersun unixreview]# perl tinydata.pl tinydatabase

John Big-booty ( Lips, Inc.) 291-555-2213

暂无引用通告

发送引用通告网址: http://supersun.info/mt/mt-tb.cgi/726
如果您想引用这篇日记到您的Blog,请复制上面的链接,放置到您发表文章时的相应界面中。

发表评论

最新资源

  • IMG_1437.JPG
  • line.png
  • bar.png
  • perl_calander.jpg

关于此日记

此日记由 supersun 发表于 2007年8月24日 11:10

此Blog上的上一篇日记记录内网mac地址更新情况

此Blog上的下一篇日记把mysql中的表输出到一个文件

首页归档页可以看到最新的日记和所有日记。