【发布时间】:2018-09-19 07:47:19
【问题描述】:
我正在尝试处理单个文件中的数据。我必须读取文件并创建一个哈希结构,获取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 "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);
这行不通。我需要附加fruitname 的值并将整个文件内容打印为输出。任何帮助将不胜感激。下面是我得到的输出。
$VAR1 = {
'' => undef,
'time' => '11:15 ',
'date' => '14/07/2016',
'{' => undef,
'#' => 'this is a new file',
'total' => '30 ',
'end' => '11:20 ',
'No' => '"FRUITS"',
'Fruit_class' => undef,
'}' => undef
};
预期的哈希作为输出:
$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'
};
【问题讨论】:
-
哈希表的用途是什么?如果你只想修改文件中的行,为什么需要它?
-
是的。您的查询绝对有效。但我的要求要求我在这里使用哈希表概念。我已经使用 shell 脚本实现了输出。但是现在它是用 perl 和哈希概念来完成的。我被这个困住了:(
-
那么你的问题真的是关于将配置(输入)文件读入哈希吗?然后修改散列,然后将散列打印到文件中?在这种情况下,我建议使用 JSON 而不是自定义的输入文件格式。通过这种方式修改变得容易得多,因为已经存在用于读取和写入 JSON 的模块。
-
好的。谢谢。我会尝试。但是我可以知道我在上面的代码中哪里出错了吗?只是想知道。
-
不客气,祝你好运!关于您显示的输出。我认为代码有很多问题。但有一件事是为什么缺少水果信息。我认为这是因为您在空白处拆分,并且带有水果信息的行以至少两个空格开头,所以也许所有这些行都映射到输出中的
'' => undef行?
标签: perl