Perl 如何打印看起来像散列的数组
我是Perl新手,必须编写一段代码,将文件内容放入数组并打印输出,使其看起来像一个散列。下面是一个示例条目:Perl 如何打印看起来像散列的数组,perl,Perl,我是Perl新手,必须编写一段代码,将文件内容放入数组并打印输出,使其看起来像一个散列。下面是一个示例条目: my %amino_acids = (F => ["Phenylalanine", "Phe", ["TTT", "TTC"]]) 输出应完全符合上述格式 文件行是这样的 "Methionine":"Met":"M":"AUG":"ATG" "Phenylalanine":"Phe":"F":"UUU, UUC":"TTT, TTC" "Proline":"Pro":"P":"C
my %amino_acids = (F => ["Phenylalanine", "Phe", ["TTT", "TTC"]])
输出应完全符合上述格式
文件行是这样的
"Methionine":"Met":"M":"AUG":"ATG"
"Phenylalanine":"Phe":"F":"UUU, UUC":"TTT, TTC"
"Proline":"Pro":"P":"CCU, CCC, CCA, CCG":"CCT, CCC, CCA, CCG"
我必须取分号后的最后一个密码子,忽略第一组密码。Perl没有打印哈希的特殊方法。您可能应该在读取文件时创建哈希:
while (<FILE>) {
my @line = split ':'; # split the line into an array
$amino_acids{$line[0]} = \@line[1..-1]; # take elements 1..end
}
请注意,我没有编译此文件,因此可能需要少量的工作才能完成。假设您确实希望使用有效的perl作为输出,则可以:
open(my $IN, "<input.txt") or die $!;
while(<$IN>){
chomp;
my @tmp = split(':',$_);
if(@tmp != 5){
# error on this line
next;
}
my $group = join('","',split(/,\s*/,$tmp[4]));
print "\$amino_acids{$tmp[2]} = [$tmp[0],$tmp[1],[$group]];\n";
}
close $IN;
您是否打算构建等价的散列?或者你真的想要字符串格式?此程序使用从文件构建哈希,然后使用转储它,以便您也具有字符串格式
use strict;
use warnings;
use Text::CSV;
use Data::Dump 'dump';
my $csv = Text::CSV->new({ sep_char => ':' });
open my $fh, '<', 'amino.txt' or die $!;
my %amino_acids;
while (my $data= $csv->getline($fh)) {
$amino_acids{$data->[2]} = [
$data->[0],
$data->[1],
[ $data->[4] =~ /[A-Z]+/g ]
];
}
print '$amino_acids = ', dump \%amino_acids;
更新
如果您真的不想安装模块(这是一个非常简单的过程,使代码更加简洁和可靠),那么这就是您所需要的
use strict;
use warnings;
open my $fh, '<', 'amino.txt' or die $!;
print "my %amino_acids = (\n";
while (<$fh>) {
chomp;
my @data = /[^:"]+/g;
my @codons = $data[4] =~ /[A-Z]+/g;
printf qq{ %s => ["%s", "%s", [%s]],\n},
@data[2,0,1],
join ', ', map qq{"$_"}, @codons;
}
print ")\n";
@Borodin非常感谢您的回答,实际上我不必使用Text::csv或Data::dump。我必须打开一个文件并从该文件中构建等效的哈希。我正在尝试不使用这两种方法,希望这会有所帮助。再次感谢 那么,我们要假设冒号分隔列表中的第三个字符串是散列键吗?此外,有关所需输出的更多详细信息也会有所帮助。您的“示例条目”不是有效的代码。。。
use strict;
use warnings;
use Text::CSV;
use Data::Dump 'dump';
my $csv = Text::CSV->new({ sep_char => ':' });
open my $fh, '<', 'amino.txt' or die $!;
my %amino_acids;
while (my $data= $csv->getline($fh)) {
$amino_acids{$data->[2]} = [
$data->[0],
$data->[1],
[ $data->[4] =~ /[A-Z]+/g ]
];
}
print '$amino_acids = ', dump \%amino_acids;
$amino_acids = {
F => ["Phenylalanine", "Phe", ["TTT", "TTC"]],
M => ["Methionine", "Met", ["ATG"]],
P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]],
}
use strict;
use warnings;
open my $fh, '<', 'amino.txt' or die $!;
print "my %amino_acids = (\n";
while (<$fh>) {
chomp;
my @data = /[^:"]+/g;
my @codons = $data[4] =~ /[A-Z]+/g;
printf qq{ %s => ["%s", "%s", [%s]],\n},
@data[2,0,1],
join ', ', map qq{"$_"}, @codons;
}
print ")\n";
my %amino_acids = (
M => ["Methionine", "Met", ["ATG"]],
F => ["Phenylalanine", "Phe", ["TTT", "TTC"]],
P => ["Proline", "Pro", ["CCT", "CCC", "CCA", "CCG"]],
)