我有一个目录txt文件,其中包含分类为地址文件和名称文件的不同文件的文件位置路径
目录FIle看起来像
Names FIles
[
name file 1 location
name file 2 location
....
]
Address Files
[
address file1 location
address file2 location
....
]
我想读取这个目录文件,并将所有名称文件和地址文件存储在名称和地址数组/ hash resp中。
我是perl的新手。所以,任何帮助都将不胜感激
由于
答案 0 :(得分:0)
我的第一直觉是用while
读取文件,并有两个用作标志的变量。遇到行Names 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
你需要多一点来忽略那些空行,但这应该足以让你开始。
答案 1 :(得分:0)
你想做什么似乎是
#!/usr/bin/env perl
my(@names, @addresses);
while( <DATA> ) {
chomp;
next if /^\s*\[*\s*$/;
if( /Names FIles/ ... /]/ ) {
push @names, $_;
next
}
if( /Address Files/ ... /]/ ) {
push @addresses, $_
}
}
use DDP; p @names; p @addresses;
__DATA__
Names FIles
[
name file 1 location
name file 2 location
....
]
Address Files
[
address file1 location
address file2 location
....
]