-->
原文参见: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

发表评论