我是Perl的初学者,我想合并两个文本文件的内容。 我在这个论坛上已经阅读了一些类似的问题和答案,但我仍然无法解决我的问题 第一个文件具有原始ID和每个人的重新编码ID(在第一和第四列中) 第二个文件具有重新编码的ID和一些个人的一些信息(在第一和第二列中)。 我想创建一个输出文件,其中包含这些人的原始,重新编码和信息。 这是我到目前为止创建的perl脚本,它不起作用。 如果有人能提供帮助,我将非常感激。
use warnings;
use strict;
use diagnostics;
use vars qw( @fields1 $recoded $original $IDF @fields2);
my %columns1;
open (FILE1, "<file1.txt") || die "$!\n Couldn't open file1.txt\n";
while ($_ = <FILE1>)
{
chomp;
@fields1=split /\s+/, $_;
my $recoded = $fields1[0];
my $original = $fields1[3];
my %columns1 = (
$recoded => $original
);
};
open (FILE2, "<file2.txt") || die "$!\n Couldnt open file2.txt \n";
for ($_ = <FILE2>)
{
chomp;
@fields2=split /\s+/, $_;
my $IDF= $fields2[0];
my $F=$fields2[1];
my %columns2 = (
$F => $IDF
);
};
close FILE1;
close FILE2;
open (FILE3, ">output.txt") ||die "output problem\n";
for (keys %columns1) {
if (exists ($columns2{$_}){
print FILE3 "$_ $columns1{$_}\n"
};
}
close FILE3;
答案 0 :(得分:1)
一个问题是范围界定。在第一个循环中,my
前面有一个$column1
,这使得它在循环中是局部的,并且当你接下来循环时它不在范围内。所以%columns1
(在循环之外)没有设置任何值(这是我怀疑你想要设置的)。对于赋值,将$columns1{$recorded} = $original;
分配给哈希键的值似乎更容易。
在第二个循环中,您需要在循环外声明%columns2
并可能使用上面的赋值。
对于第三个循环,在打印中您只需要在要打印的字符串的前部添加$columns2{$_}
以获取要在记录的ID之前打印的原始ID。
答案 1 :(得分:1)
问题在于您定义的哈希变量的范围。变量的范围仅限于已定义变量的循环。
在您的代码中,因为%columns1和%columns2在while循环之外使用。因此,它们应该在循环之外定义。
此外,在&#34;如果存在&#34;部分,开闭的牙箍对称性受到影响。
以下是您所需更正的代码:
use warnings;
use strict;
use diagnostics;
use vars qw( @fields1 $recoded $original $IDF @fields2);
my (%columns1, %columns2);
open (FILE1, "<file1.txt") || die "$!\n Couldn't open CFC_recoded.txt\n";
while ($_ = <FILE1>)
{
chomp;
@fields1=split /\s+/, $_;
my $recoded = $fields1[0];
my $original = $fields1[3];
%columns1 = (
$recoded => $original
);
}
open (FILE2, "<file2.txt") || die "$!\n Couldnt open CFC_F.xlsx \n";
for ($_ = <FILE2>)
{
chomp;
@fields2=split /\s+/, $_;
my $IDF= $fields2[0];
my $F=$fields2[1];
%columns2 = (
$F => $IDF
);
}
close FILE1;
close FILE2;
open (FILE3, ">output.txt") ||die "output problem\n";
for (keys %columns1) {
print FILE3 "$_ $columns1{$_} \n" if exists $columns2{$_};
}
close FILE3;