我想为我文件中的数据创建一个哈希表。
该文件包含一堆写为
的命令===|showcommand|
每当我看到这个分隔符时,我想创建一个哈希键并将其下面的数据存储为值中的数组,直到它看到下一个分隔符。
下一个分隔符将执行相同的操作,即使用分隔符名称创建哈希键,并将数据存储在数组后面的下一行作为值。
答案 0 :(得分:0)
my %commands;
my $name;
my $body;
while (<>) {
if (my ($new_name) = /===\|([^|]*)\|/) {
$commands{$name} = $body if defined($name);
$name = $new_name;
$body = '';
} else {
$body .= $_;
}
}
$commands{$name} = $body if defined($name);
假设命令的主体在标题之后的行上开始,并在具有下一个标题的行之前的行上停止。
答案 1 :(得分:0)
你可能已经有了它,但是仍然添加了一个小注释,关于如何从函数返回哈希的问题。
以下是一个例子:
输入-file (使用以下内容,我认为它包含与输入文件类似的结构。
===|showcommand|
cmd1
cmd2
cmd3
cmd4
===|testcommand|
command1
command2
command3
===|anothercommand|
another1
another2
another3
another4
Perl -script:
use strict;
# Calling ReadCommandFile to build hash.
my %commands = ReadCommandFile("./commands.txt");
# ReadCommandFile - reads commands.txt and builds
# a hash.
sub ReadCommandFile()
{
my $file = shift;
my %hash = ();
my $name;
open(FILE, "<$file");
while(<FILE>)
{
if($_ =~ /===\|(.*)\|/)
{
$name = $1;
$hash{$name} = [];
}
else
{
my $line = $_;
$line =~ s/\n$//;
push(@{$hash{$name}}, $line);
}
}
close(FILE);
return %hash;
}
因此,您应该获得以下哈希值(Data :: Dumper的输出):
$VAR1 = 'anothercommand';
$VAR2 = [
'another1',
'another2',
'another3',
'another4'
];
$VAR3 = 'showcommand';
$VAR4 = [
'cmd1',
'cmd2',
'cmd3',
'cmd4'
];
$VAR5 = 'testcommand';
$VAR6 = [
'command1',
'command2',
'command3'
];
然后您可以访问以下各个元素:
print "\nCommand #3: " . $commands{'showcommand'}[2];
输出: cmd3
将文件中的数据复制到散列中,并将命令作为数组添加到相应的关键字下。
谢谢!