如何打印/提取Perl中二维数组中列下列出的信息?

时间:2009-07-15 17:52:07

标签: perl arrays data-structures

我有一个输出文件,它是一个二维数组(这个文件是在运行脚本编写后生成2D数组生成的输出),我必须读取特定列下的信息,比如第1列。换句话说,怎么做我在第1栏下阅读并打印出列出的所有行的信息。

有什么建议吗?

__DATA__
   1  2  3  4  5  6  7  8  9
   A  B  C  D  E  F  G  H  I
  93  48 57 66 52 74 33 22 91

从上面的数据中我想逐列提取信息,如果我想要第1列的信息,我应该只能列出以下输出。 想列出然后我想要

输出:

1
A
93

7 个答案:

答案 0 :(得分:3)

所有更正后的最终版本:

#!/usr/bin/perl

use strict;
use warnings;

my $column_to_show = 0;

while ( <DATA> ) {
    last unless /\S/;
    print +(split)[$column_to_show], "\n";
}

__DATA__
   1  2  3  4  5  6  7  8  9
   A  B  C  D  E  F  G  H  I
  93  48 57 66 52 74 33 22 91

输出:

C:\Temp> u
1
A
93

print +(split)[$column_to_show], "\n";的说明:

perldoc -f split

  

将字符串EXPR拆分为字符串列表并返回该列表。   ...   如果省略EXPR,则拆分$ _字符串。如果PATTERN也被省略,   在空格上拆分(跳过任何前导空格后)。

所以:(split)[3]选择split返回的列表的第四个元素。 +前面的(split)是帮助perl正确解析表达式所必需的。见perldoc -f print

  

另外要注意不要遵循   用左括号打印关键字   除非你想要相应的   右括号终止   印刷品的参数 - 介入+   或括号括起来   参数。

我完全建议每个Perl程序员偶尔浏览一下所有文档perldoc perltoc。它在你的电脑上。

答案 1 :(得分:3)

my $line ;

foreach $line (@DATA)
{
   my @DATA1 = split( / +/, "$line" );
   print "first element of array is $DATA1[0]";        
}


__DATA__

 1  2  3  4  5  6  7  8  9
 A   B  C  D  E  F  G  H  I
 93  48 57 66 52 74 33 22 91

输出: -

 1
 A
 93

答案 2 :(得分:1)

尝试使用此代码。基本上我将数据加载到数组数组

每一行都是对行的引用。

#!/usr/bin/perl

use strict;
use warnings;    

my $TwoDimArray;
while (my $line=<DATA>) {
   push @$TwoDimArray, [split(/,/,$line)];
};

for my $column (0..2) {
   print "[$column,0] : " . $TwoDimArray->[0]->[$column] ."\n";
   print "[$column,1] : " . $TwoDimArray->[1]->[$column] ."\n";
   print "\n";
}

__DATA__
1,2,3,04,05,06
7,8,9,10,11,12

答案 3 :(得分:1)

地图功能是你的朋友:

open FILE, "data.txt";
while ($line = <FILE>) {
   chomp($line);
   push @data, [split /[, ]+/, $line];
}
close FILE;

@column1 = map {$$_[0]} @data;

print "@column1\n";

在data.txt中就像:

1, 2, 3, 4
5, 6, 7, 8
9, 10, 11, 12
13, 14, 15, 16

答案 4 :(得分:1)

perl -lne '@F = split /\s+/ and print $F[1]'

答案 5 :(得分:1)

这可能是你想要的:

use English qw<$OS_ERROR>; # Or just use $! 
use IO::Handle;

my @columns;

open my $fh, '<', 'columns.dat' or die "I'm dead. $OS_ERROR";
while ( my $line = <$fh> ) { 
    my @cols = split /\s+/, $line;
    $columns[$_][$fh->input_line_number()-1] = $cols[$_] foreach 0..$#cols;
}
$fh->close();

答案 6 :(得分:0)

您可以直接按元素访问它们。

$arrays[0][0] = 1;
$arrays[0][1] = 2;
$arrays[1][0] = 3;
$arrays[1][1] = 4;

for (my $i = 0; $i <= $#{$arrays[1]}; $i++) {
    print "row for $i\n";
    print "\tfrom first array: " . $arrays[0][$i] . "\n";
    print "\tfrom second array: " . $arrays[1][$i] . "\n";
}

打印

row for 0
    from first array: 1
    from second array: 3
row for 1
    from first array: 2
    from second array: 4