【发布时间】:2015-08-19 22:26:33
【问题描述】:
美好的一天。我有一个要处理的大文本文件,按如下方式组织:
A
B 87368911
C 165368993 165369000 165369007 165369014 165369021 165369028
D 3299941
E 3221521
F 5909327
G 14740025 14740019 14740031 14740037
H 4446477 4640745
我想将它拆分为数组的哈希,以第一列作为键,如果有的话,将值放在一个可迭代的数组中(在 A 的情况下,没有,如您所见) .为此,我制作了以下代码(略有截断,我显然打开了文件并有周围的代码):
my %resolvedreads;
while (my $line = <IN>) {
my @thisline = $line =~ m/(\S+)/g;
$resolvedreads{$thisline[0]} = @thisline[1 .. $#thisline];
print join "\t", @{$resolvedreads{$thisline[0]}}, "\n";
}
我什至没有真正测试这个,因为它看起来很微不足道。显然我应该有,因为它给了我这个:
Use of uninitialized value $thisline[0] in hash element at resolved_reads_purifier.pl line X-1, <IN> line 1.
Use of uninitialized value $thisline[0] in hash element at resolved_reads_purifier.pl line X, <IN> line 1.
Can't use an undefined value as an ARRAY reference at resolved_reads_purifier.pl line X, <IN> line 1.
我发现自己对此感到有些困惑。进一步调查发现,该行确实是分裂的,但每个数组的长度都是 1 或 2。
那是什么?我觉得我在这里错过了一些基本的东西,我已经无能为力了。尽管在我看来几乎完全相同,但我之前的代码实际上已编译。
【问题讨论】:
-
$line =~ m/(\S+)/g通常写成split ' ', $line,前面的chomp两者都不需要 -
相当,我只是忘记删除 chomp - 我在实际代码中使用它。我尝试了各种拆分变体以及正则表达式来拆分行,它们都抛出了相同的奇怪输出。不过,Awk 处理得很好,所以我认为这不是无法识别的空白字符的问题
-
另外,第一行后缺少分号。
-
@user3034187:
split的第一个参数通常作为正则表达式处理,但传递 单个文字空间 是一种特殊情况,其作用与 @987654328 相同@, 与split / /不同,后者只是在所有出现的空格处拆分