读取多个文件位置并将它们存储在perl中的不同数组/散列中

时间:2013-06-17 17:10:19

标签: arrays perl hash

我有一个目录txt文件,其中包含分类为地址文件和名称文件的不同文件的文件位置路径

目录FIle看起来像

Names FIles
[
name file 1 location

name file 2 location
....
]

Address Files
[
address file1 location

address file2 location
....
]

我想读取这个目录文件,并将所有名称文件和地址文件存储在名称和地址数组/ hash resp中。

我是perl的新手。所以,任何帮助都将不胜感激

由于

2 个答案:

答案 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
....
]