0

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

目录文件看起来像

Names FIles
[
name file 1 location

name file 2 location
....
]

Address Files
[
address file1 location

address file2 location
....
]

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

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

谢谢

4

2 回答 2

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
....
]
于 2013-06-17T18:52:34.940 回答
0

我的第一直觉是用 读取文件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

你需要更多的时间来忽略那些空行,但这应该足以让你开始。

于 2013-06-17T17:16:42.933 回答