Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中从二维数组打印/提取列下列出的信息?_Perl_Arrays_Data Structures - Fatal编程技术网

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

如何在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列获取信息,我应该只能列出以下输出。 我想列出来,然后我想 输出

我有一个输出文件,它是一个二维数组(这个文件是在运行脚本生成二维数组后生成的),我必须读取特定列下的信息,比如第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

所有更正后的最终版本:

#!/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