【发布时间】:2016-10-24 22:16:39
【问题描述】:
我不确定如何正确初始化哈希 - 我正在尝试为输入文件中耦合线中的值创建键/值对。
例如,我的输入如下所示:
@cluster t.18
46421 ../../../output###.txt/
@cluster t.34
41554 ../../../output###.txt/
我从第 1 行(@cluster 行)中提取 t 编号,并将其与第二行(以 46421 开头的行)中的 output###.txt 匹配。但是,我似乎无法使用我编写的脚本将这些值放入我的哈希中。
#!/usr/bin/perl
use warnings;
use strict;
my $key;
my $value;
my %hash;
my $filename = 'input.txt';
open my $fh, '<', $filename or die "Can't open $filename: $!";
while (my $line = <$fh>) {
chomp $line;
if ($line =~ m/^\@cluster/) {
my @fields = split /(\d+)/, $line;
my $key = $fields[1];
}
elsif ($line =~ m/^(\d+)/) {
my @output = split /\//, $line;
my $value = $output[5];
}
$hash{$key} = $value;
}
【问题讨论】:
-
在
if/elsif块中从my $key和my $value中删除my,因为这将创建新 变量并隐藏全局变量。但预期的结果是什么?{1 => 'output###.txt', 2 => 'output###.txt'}? -
@PerlDog 感谢您的反馈。是的,我想要的哈希值是
{1 => 'output###.txt', 2 => 'output###.txt'}- 我只想添加一个计数器,但输入文件中的数字不按顺序排列。 -
好的,第 1 行中的
1与第 2 行中的1111有什么关系?它们为什么匹配?因为第 2 行以第 1 行数字的 4 倍开头,还是因为它是number + 1110?还是仅仅因为它是下一行?请显示一些不那么模棱两可的输入。 -
@PerlDog,我试图简化我在问题中发布的输入,但这里是实际输入的前几行
@cluster t.10 has 4319 elements, 0 subclusters 37652 ../../../../clust/output43888.txt 1.397428基本上第二行中的数字是一个任意标识符,那么它就是输出文件(output###.txt),最后是距离测量。 -
@EA00 不客气。你正在研究你提出的东西,吸收新事物,很高兴能提供一点帮助。正则表达式有点具体,我同意。 (而且他们也可以非常投入,变成一种单独的小语言。)我建议你把基础知识写下来,因为这是你每天都会使用的东西,只要你觉得舒服。这是您工具箱中应该包含的东西之一。