Perl多维数组问题

时间:2011-02-12 05:32:44

标签: perl multidimensional-array

我有一个程序可以在

形式的文本段落中打印出逗号的位置

例如,如果段落是

one,two,three
three and a half
four,five
six
seven,eight

程序将打印

0:4
0:8
2:5
4:6

我想使用此输出创建一个数组,其中冒号后面的数字列在冒号前面的索引指定的行中。由上面坐标形成的数组将是

4 8
<blank or character '.'>
5
<blank or character '.'>
6

so array [0,0] = 4,array [0,1] = 8 array [1,0] =空 array [2,0] = 5 等...

我敢打赌这很简单,但我需要帮助才能写出来。

$data_file="file.out"; 
open(DAT, $data_file) || die("Could not open file!"); 
@raw_data=<DAT>; 
close(DAT);

my %array;

my $line = 0;

foreach $newline(@raw_data) {
    chomp;

while ( $newline=~m/(,|;|:|and)/) {
            push @{ $array{$line} }, pos($newline);  # autovivification
}

    $line++; }

1 个答案:

答案 0 :(得分:2)

程序

#!/usr/bin/env perl

use strict;
use warnings;

my %array;

my $line = 0;
while (<DATA>) {
    chomp;

    while ( /(,|;|:|(?:and))/g ) {
        my $position = pos() - length($1) + 1;
        push @{ $array{$line} }, $position;  # autovivification
    }

    $line++;
}

for ( sort { $a <=> $b } keys %array ) {
    my $flattened_value = join ', ', @{ $array{$_} };
    print "$_ -> $flattened_value\n";
}

__DATA__
one,two,three
three and a half
four,five
six
seven,eight

输出

0 -> 4, 8
1 -> 7
2 -> 5
4 -> 6

参阅:chompjoinkeyssortsplit

请参阅以下文档以了解Perl的数据结构,尤其是本示例中使用的 autovivification