我的第一直觉是用 读取文件while
,并有两个变量作为标志。当您遇到 lineNames Files
时,您将一个标志设置为 1。在上述while
循环中,您有一个if
语句检查标志是否已设置。如果是,则将后续行(名称位置)读入您选择的数组或散列中。当您遇到该Address Files
行时,将第一个标志更改回 0,并设置第二个标志,将这些行发送到您的地址数据结构。
更新:
一般来说,展示你已经尝试过的东西是个好主意——这些东西要牢记在心,以备不时之需。
也就是说,我们都曾在某个时候对此感到陌生。代码可能看起来像这样:
#!/usr/bin/perl
use strict;
use warnings;
my ($nameflag, $addressflag);
my %namehash;
my %addresshash;
while (<>) {
chomp;
# Setting the flags
if ($_ eq 'Names Files') {
$nameflag = 1;
$addressflag = 0;
next;
} elsif ($_ eq 'Address Files') {
$nameflag = 0;
$addressflag = 1;
next;
} elsif (/^(\[|\])$/) {
# Assuming you want to ignore those brackets
next;
}
my @line = split;
# Assuming your fields can be split on whitespace,
# that the first field is the (unique) file name, and the
# second field is the location
if ($nameflag) {
$namehash{$line[0]} = $line[1];
} elsif ($addressflag) {
$addresshash{$line[0]} = $line[1];
}
}
# Then whatever you want to do with those hashes
你需要更多的时间来忽略那些空行,但这应该足以让你开始。