所以,我正在努力,现在我被卡住了。
while (<KOERGEBNIS>){
my $counter = 0;
my $curline = $_;
for (my $run = 0; $run < $arrayvalue; $run++){
if ($curline =~ m/@tidgef[$counter]/){
my $row = substr($curline, 0, 140);
push @array$counter, $row;
print "Row $. was saved in ID: @filtered[$counter]\n";
}
$counter++;
}
}
背景是我想在同一个数组中保存以相同的8个字符开头的所有行,这样我就可以计算这些行并开始使用这些数组。我现在唯一能想到的就是开关和外壳,但我想在将这些代码扔进垃圾之前我先问一下。
实施例: 如果.txt中的一行是这样的:
50004000_xxxxxxxxxxxxxx31
50004000_xxxxxxxxxxxxxx33
60004001_xxxxxxxxxxxxxx11
60004001_xxxxxxxxxxxxxx45
我拿了每行的前8个字符并使用uniq过滤重复项并将它们保存在数组@tidgef中,现在我想将@ 1和Line2保存在@ array1中,甚至更好@ array50004000和Line4和Line4保存到@ array2或@ array60004001。
我希望我能很好地解释我的问题!谢谢你们
答案 0 :(得分:6)
你悄悄地徘徊在一个名为&#34;象征性引用&#34; (也称为&#34;使用变量来获取变量&#34;&#34;)。对all的sorts reasons来说,这是一个非常糟糕的主意。
使用此作为了解complex data structures in Perl的借口是一个更好的主意。我们不清楚你想对这些数据做什么,但是这个例子应该让你开始:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my %lines;
while (<DATA>) {
chomp;
my $key = substr($_, 0, 8);
push @{$lines{$key}}, $_;
}
say Dumper \%lines;
__DATA__
50004000_xxxxxxxxxxxxxx31
50004000_xxxxxxxxxxxxxx33
60004001_xxxxxxxxxxxxxx11
60004001_xxxxxxxxxxxxxx45
答案 1 :(得分:4)
您应该仔细考虑为什么需要名为@array50004000
@array60004001
的数组。您的程序可以创建它们,但您无法知道这些名称是什么。在代码运行时,除非您使用调试器逐步执行代码,否则可能会将它们称为@x
和@y
。您甚至无法转储其内容,因为您不知道要转储的内容
您正在寻找的是哈希,特别是哈希的数组。与符号表不同,有keys
,values
和each
等运算符可以让您查询散列中存储的值
您的代码看起来像这样。我使用了您问题中的示例数据并将其放入myfile
use strict;
use warnings 'all';
my %data;
open KOERGEBNIS, '<', 'myfile' or die $!;
while ( <KOERGEBNIS> ) {
chomp;
my ($key) = split /_/;
push @{ $data{$key} }, $_;
}
for my $key ( sort keys %data ) {
my $val = $data{$key};
print $key, "\n";
print " $_\n" for @$val;
print "\n";
}
50004000
50004000_xxxxxxxxxxxxxx31
50004000_xxxxxxxxxxxxxx33
60004001
60004001_xxxxxxxxxxxxxx11
60004001_xxxxxxxxxxxxxx45