Perl:读取列并转换为数组

Perl:读取列并转换为数组,perl,Perl,我是perl新手,尝试读取包含列的文件并创建数组。 我有一个以下列的文件 file.txt A 15 A 20 A 33 B 20 B 45 C 32 C 78 我想为中存在的每个唯一项创建一个数组,其值从第二列分配。 例如: 尝试了以下代码,仅用于打印2列 use strict; use warnings; my $filename = $ARGV[0]; open(FILE, $filename) or die "Could not open

我是perl新手,尝试读取包含列的文件并创建数组。 我有一个以下列的文件

file.txt
A    15
A    20
A    33 
B    20 
B    45
C    32
C    78
我想为中存在的每个唯一项创建一个数组,其值从第二列分配。 例如:

尝试了以下代码,仅用于打印2列

use strict;
use warnings;
my $filename = $ARGV[0];
open(FILE, $filename) or die "Could not open file '$filename' $!";
my %seen;
while (<FILE>)
{
    chomp;
    my $line = $_;
    my @elements = split (" ", $line);
    my $row_name = join "\t", @elements[0,1];
    print $row_name . "\n" if ! $seen{$row_name}++;

}
close FILE;
使用严格;
使用警告;
我的$filename=$ARGV[0];
打开(文件,$filename)或死亡“无法打开文件“$filename”$!”;
我看到的百分比;
而()
{
咀嚼;
我的$line=$\ux;
my@elements=split(“,$line);
我的$row_name=join“\t”,@elements[0,1];
打印$row_name。“\n”if!$seen{$row_name}++;
}
关闭文件;

谢谢

将循环更改为类似以下内容:

while (my $line = <FILE>)
{
    chomp($line);
    my @elements = split (" ", $line);
    push(@{$seen{$elements[0]}}, $elements[1]);
}
while(我的$line=)
{
chomp($line);
my@elements=split(“,$line);
push(@{$seen{$elements[0]},$elements[1]);
}

这将创建/追加找到的每个项目的列表,并生成一个散列,其中键是左侧项目,值是右侧项目的列表。然后,您可以根据需要处理或重新分配值。

将循环更改为类似以下内容:

while (my $line = <FILE>)
{
    chomp($line);
    my @elements = split (" ", $line);
    push(@{$seen{$elements[0]}}, $elements[1]);
}
while(我的$line=)
{
chomp($line);
my@elements=split(“,$line);
push(@{$seen{$elements[0]},$elements[1]);
}

这将创建/追加找到的每个项目的列表,并生成一个散列,其中键是左侧项目,值是右侧项目的列表。然后,您可以根据需要处理或重新分配值。

首先是一些一般的Perl建议。现在,我们喜欢使用词汇变量作为文件句柄,并将三个参数传递给
open()

第二条建议-不要将此数据存储在单个数组中。最好将其存储在更复杂的数据结构中。我建议使用散列,其中键是字母,值是一个数组,包含与该字母匹配的所有数字。这非常容易构建:

use strict;
use warnings;
use feature 'say';

my %data; # I'd give this a better name if I knew what your data was

while (<>) {
  chomp;
  my ($letter, $number) = split; # splits $_ on whitespace by default
  push @{ $data{$letter} }, $number;
}

# Walk the hash to see what we've got
for (sort keys %data) {
  say "$_ : @{ $data{$_ } }";
}
使用严格;
使用警告;
使用特征“说”;
我的%data;#如果我知道你的数据是什么,我会给这个起个更好的名字
而(){
咀嚼;
my($letter,$number)=split;#默认情况下在空白处拆分$
按@{$data{$letter}},$number;
}
#随便走走,看看我们有什么
对于(排序键%数据){
说“$\:@{$data{$}”;
}

首先是一些一般的Perl建议。现在,我们喜欢使用词汇变量作为文件句柄,并将三个参数传递给
open()

第二条建议-不要将此数据存储在单个数组中。最好将其存储在更复杂的数据结构中。我建议使用散列,其中键是字母,值是一个数组,包含与该字母匹配的所有数字。这非常容易构建:

use strict;
use warnings;
use feature 'say';

my %data; # I'd give this a better name if I knew what your data was

while (<>) {
  chomp;
  my ($letter, $number) = split; # splits $_ on whitespace by default
  push @{ $data{$letter} }, $number;
}

# Walk the hash to see what we've got
for (sort keys %data) {
  say "$_ : @{ $data{$_ } }";
}
使用严格;
使用警告;
使用特征“说”;
我的%data;#如果我知道你的数据是什么,我会给这个起个更好的名字
而(){
咀嚼;
my($letter,$number)=split;#默认情况下在空白处拆分$
按@{$data{$letter}},$number;
}
#随便走走,看看我们有什么
对于(排序键%数据){
说“$\:@{$data{$}”;
}

谢谢Nick,我如何存储或打印此散列值以验证它是否只从第1列获取唯一值和从第2列获取相应值。@Danishheikh是典型的方法,它使用引用,因此类似于
打印转储程序\%
谢谢Nick,我如何存储或打印此哈希值以验证它是否只从第1列获取唯一值,并从第2列获取相应值。@DanishSheikh是典型的方法,它使用了类似于
print Dumper\%的引用在数据中按名称存储数据称为符号引用,以防需要对其进行研究。这是不好的,因为数据中的错误名称可能会破坏Perl变量。使用带有名称的散列作为键要好得多。在数据中按名称存储数据称为符号引用,以防您想要研究它。这是不好的,因为数据中的错误名称可能会破坏Perl变量。使用名为的哈希作为键要好得多。
while (<>) { ... }
use strict;
use warnings;
use feature 'say';

my %data; # I'd give this a better name if I knew what your data was

while (<>) {
  chomp;
  my ($letter, $number) = split; # splits $_ on whitespace by default
  push @{ $data{$letter} }, $number;
}

# Walk the hash to see what we've got
for (sort keys %data) {
  say "$_ : @{ $data{$_ } }";
}