在perl中从哈希表打印数据时出现的问题
我试图在单个文件中处理数据。我必须读取该文件并创建一个散列结构,获取fruitname的值,将其附加到fruitCount和fruitValue中,删除行fruitname,并在更改完成后写入整个输出。下面是该文件的内容在perl中从哈希表打印数据时出现的问题,perl,Perl,我试图在单个文件中处理数据。我必须读取该文件并创建一个散列结构,获取fruitname的值,将其附加到fruitCount和fruitValue中,删除行fruitname,并在更改完成后写入整个输出。下面是该文件的内容 # this is a new file { date 14/07/2016 time 11:15 end 11:20 total 30 No "FRUITS" Fruit_class { Name "fruit 1" fruitName
# this is a new file
{
date 14/07/2016
time 11:15
end 11:20
total 30
No "FRUITS"
Fruit_class
{
Name "fruit 1"
fruitName "apple.fru"
fruitId "0"
fruitCount 5
fruitValue 6
}
{
Name "fruit 2"
fruitName "orange.fru"
fruitId "1"
fruitCount 10
fruitValue 20
}
}
我尝试了以下代码:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash_table;
my $name;
my $file = '/tmp/fruitdir/fruit1.txt';
open my $fh, "<", $file or die "Can't open $file: $!";
while (<$fh>) {
chomp;
if (/^\s*fruitName/) {
($name) = /(\".+\")/;
next;
}
s/(fruitCount|fruitValue)/$name\.$1/;
my ($key, $value) = split /\s+/, $_, 2;
$hash_table{$key} = $value;
}
print Dumper(\%hash_table);
应将哈希作为输出:
$VAR1 = {
'Name' => '"fruit 1"',
'fruitId' => '"0" ',
'"apple_fru".fruitValue' => '6 ',
'"apple_fru".fruitCount' => '5'
'Name' => '"fruit 2"',
'fruitId' => '"0" ',
'"orange_fru".fruitValue' => '10 ',
'"orange_fru".fruitCount' => '20'
};
在我继续之前,请给我一个建议: 记录您的代码 在你的代码中有几个逻辑错误,如果你写下你认为每一行应该做的事情,我想你会意识到的。首先,写下您想要实现的算法,然后记录代码中的每个步骤如何实现算法中的一个步骤。最后,您将能够看到您遗漏了什么,或者哪些部分不起作用 以下是我看到的错误
Name
能否排在最后#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash_table;
my $name;
my @fruit;
my $file = '/tmp/fruitdir/fruit1.txt';
open my $fh, "<", $file or die "Can't open $file: $!";
while (<$fh>) {
chomp;
# save hash table if there's a close bracket, but
# only if it has been filled
if ( /^\s*}\s*$/ ) {
next unless keys %hash_table;
# save COPY of hash table
push @fruit, { %hash_table };
# clear it out for the next iteration
%hash_table = ();
}
# only parse lines that start with Name or fruit
next unless
my ( $key, $value ) =
/^
# skip any leading spaces
\s*
# parse a line beginning with Name or fruitXXXXX
(
Name
|
fruit[^\s]+
)
# need space between key and value
\s+
# everything that follows is a value. clean up
# double quotes in post processing
(.*)
/x;
# remove double quotes
$value =~ s/"//g;
if ( $key eq 'Name' ) {
$name = $value;
}
else {
$key = "${name}.${key}";
}
$hash_table{$key} = $value;
}
print Dumper \@fruit;
在我继续之前,请给我一个建议: 记录您的代码 在你的代码中有几个逻辑错误,如果你写下你认为每一行应该做什么,我想你会发现的。首先,写下你想实现的算法,然后记录代码中的每个步骤是如何实现算法中的一个步骤的。最后,你会看到你错过了什么,或者哪一部分不起作用 以下是我看到的错误
Name
能否排在最后#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash_table;
my $name;
my @fruit;
my $file = '/tmp/fruitdir/fruit1.txt';
open my $fh, "<", $file or die "Can't open $file: $!";
while (<$fh>) {
chomp;
# save hash table if there's a close bracket, but
# only if it has been filled
if ( /^\s*}\s*$/ ) {
next unless keys %hash_table;
# save COPY of hash table
push @fruit, { %hash_table };
# clear it out for the next iteration
%hash_table = ();
}
# only parse lines that start with Name or fruit
next unless
my ( $key, $value ) =
/^
# skip any leading spaces
\s*
# parse a line beginning with Name or fruitXXXXX
(
Name
|
fruit[^\s]+
)
# need space between key and value
\s+
# everything that follows is a value. clean up
# double quotes in post processing
(.*)
/x;
# remove double quotes
$value =~ s/"//g;
if ( $key eq 'Name' ) {
$name = $value;
}
else {
$key = "${name}.${key}";
}
$hash_table{$key} = $value;
}
print Dumper \@fruit;
哈希表的用途是什么?如果您只想修改文件中的行,为什么需要它?是的。您的查询是绝对有效的。但我的要求要求我在这里使用哈希表概念。我使用shell脚本实现了输出。但现在需要使用perl和哈希概念来完成。我坚持这一点:(你的问题实际上是关于阅读配置(输入)将文件转换成散列?然后修改散列,然后将散列打印成文件?在这种情况下,我建议使用JSON而不是自定义的输入文件格式。这样修改就容易多了,因为已经存在用于读取和写入JSON的模块。好的。谢谢。我会尝试。但是我可以知道我在哪里出错了吗上面的代码?只是好奇。欢迎您,祝您好运!关于您显示的输出。我认为代码有很多问题。但有一件事是为什么水果信息丢失。我认为这是因为您在空格上拆分,并且带有水果信息的行以至少两个空格开头,所以可能所有这些行都会被删除映射到输出中的行
''=>unde
?哈希表的用途是什么?如果您只想修改文件中的行,为什么需要它?是的。您的查询绝对有效。但我的要求要求我在这里使用哈希表概念。我使用shell脚本实现了输出。但现在需要使用perl和hash con完成当然,我被这个问题困住了:(你的问题实际上是关于阅读配置(输入)将文件转换成散列?然后修改散列,然后将散列打印成文件?在这种情况下,我建议使用JSON而不是自定义的输入文件格式。这样修改就容易多了,因为已经存在用于读取和写入JSON的模块。好的。谢谢。我会尝试。但是我可以知道我在哪里出错了吗上面的代码?只是好奇。欢迎您,祝您好运!关于您显示的输出。我认为代码有很多问题。但有一件事是为什么水果信息丢失。我认为这是因为您在空格上拆分,并且带有水果信息的行以至少两个空格开头,所以可能所有这些行都会被删除映射到输出中的行''=>unde
?
$VAR1 = [
{
'fruit 1.fruitValue' => '6',
'fruit 1.fruitName' => 'apple.fru',
'Name' => 'fruit 1',
'fruit 1.fruitCount' => '5',
'fruit 1.fruitId' => '0'
},
{
'fruit 2.fruitName' => 'orange.fru',
'fruit 2.fruitId' => '1',
'fruit 2.fruitCount' => '10',
'fruit 2.fruitValue' => '20',
'Name' => 'fruit 2'
}
];