如何在Perl中从二维数组打印/提取列下列出的信息?
我有一个输出文件,它是一个二维数组(这个文件是在运行脚本生成二维数组后生成的),我必须读取特定列下的信息,比如第1列。换句话说,如何读取和打印列1下与所有行相对应的信息 有什么建议吗如何在Perl中从二维数组打印/提取列下列出的信息?,perl,arrays,data-structures,Perl,Arrays,Data Structures,我有一个输出文件,它是一个二维数组(这个文件是在运行脚本生成二维数组后生成的),我必须读取特定列下的信息,比如第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列获取信息,我应该只能列出以下输出。 我想列出来,然后我想 输出
__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
所有更正后的最终版本:
#!/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
解释print+(拆分)[$column\u to\u show],“\n”代码>:
#!/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
:
将字符串EXPR拆分为字符串列表并返回该列表。
...
如果省略EXPR,则拆分$字符串。如果图案也被省略,
在空格上拆分(跳过任何前导空格后)
因此:(split)[3]
选择由split
返回的列表的第四个元素。(拆分)
前面的+
是帮助perl
正确解析表达式所必需的。见:
另外,请注意不要遵循
用左括号打印关键字
除非你想要相应的
右括号用于终止
打印参数-插入+
或者用括号括起来
争论
我完全建议每个Perl程序员偶尔浏览一下所有文档。它在您的计算机上。尝试使用此代码。基本上,我将数据加载到一个数组中 每一行都是对一行的引用
#!/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
#/usr/bin/perl
严格使用;
使用警告;
我的$TwoDimArray;
while(我的$line=){
推送@$TwoDimArray[split(/,/,$line)];
};
对于我的$列(0..2){
打印“[$column,0]:”$TwoDimArray->[0]->[$column]。“\n”;
打印“[$column,1]:”$TwoDimArray->[1]->[$column]。“\n”;
打印“\n”;
}
__资料__
1,2,3,04,05,06
7,8,9,10,11,12
您可以通过元素直接访问它们
$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";
}
地图功能是您的朋友:
open FILE, "data.txt";
while ($line = <FILE>) {
chomp($line);
push @data, [split /[, ]+/, $line];
}
close FILE;
@column1 = map {$$_[0]} @data;
print "@column1\n";
perl-lne'@F=split/\s+/并打印$F[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();
使用英语qw;#或者干脆用美元!
使用IO::Handle;
我的@columns;
打开我的$fh,'
输出:-
1
A
93
@Sinan:如果我想要一个2D数组,并且想要在列中打印信息,那么你的代码是有效的,但是不,我没有,而是我有一个输出文件。我有一个文件,其中包含二维数组形式的信息(即,它是为打印二维数组而编写的脚本的输出(文件))。我必须阅读此文件并提取信息。我只想提取列在第1列下面的值。希望这是有道理的。@Sinan:你能用一句话来解释“打印+(拆分)[$column\u to\u show];”吗。谢谢。@Sinan Unur:我读了这两份文件。我知道split函数,也用过很多次。我不知道的是“拆分[列印]”。方括号表示什么特别的东西吗?为什么“split()”会出错?@Sinan:我从你的回答中学到了很多。我只是想说声谢谢:)@shubster不客气,但请仔细阅读。。split()和(split)是两个不同的东西。和往常一样,方括号中包含索引。您询问的代码相当于:my@result=split;打印$result[$column\u to\u show],“\n”代码>。请显示文件的外观-至少是其中的一部分。此外,如果2D数组最初是由Perl创建的,那么您可以完全删除中间人。使用类似于Storable
的模块将对数组的引用保存到文件中,然后稍后将其解冻。这很容易,也很快。我偶尔会在太小而不需要适当的数据库解决方案的情况下使用它。@Sinan&Shubster:headers列(c0 c1 c2等)真的在数据文件中吗,还是Shubster写它只是为了弄清楚列的位置?在Shubster的版本中,我不清楚。@Telemachus:数据文件中没有列。我写它是为了弄清楚列在哪里。@Telemachus我也不清楚。然而,如果shubster不明确地格式化他的文章,我将把\uuuu DATA\uu
后面的所有内容解释为数据。然而,他的样本输出显示c0
这一事实让我相信我的假设是正确的。手册@F=…
是基于对问题早期版本输入的解释。有了新的、更好的指定输入,perl-alne'print$F[0]
就足够了。海伦
perl -lne '@F = split /\s+/ and print $F[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();
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