我有一个文本文件temp.txt,其中包含
等条目cinterim=3534
cstart=517
cstop=622
ointerim=47
ostart=19
ostop=20
注意:键值对可以按新行排列,也可以一行排列在一行中。
我正在尝试使用Perl在DB中打印和存储这些值以获得相应的键。但是我收到很多错误和警告。现在我只是想打印这些值。
use strict;
use warnings;
open(FILE,"/root/temp.txt") or die "Unable to open file:$!\n";
while (my $line = <FILE>) {
# optional whitespace, KEY, optional whitespace, required ':',
# optional whitespace, VALUE, required whitespace, required '.'
$line =~ m/^\s*(\S+)\s*:\s*(.*)\s+\./;
my @pairs = split(/\s+/,$line);
my %hash = map { split(/=/, $_, 2) } @pairs;
printf "%s,%s,%s\n", $hash{cinterim}, $hash{cstart}, $hash{cstop};
}
close(FILE);
有人可以提供帮助来改进我的计划。
答案 0 :(得分:9)
use strict;
use warnings;
open my $fh, '<', '/root/temp.txt' or die "Unable to open file:$!\n";
my %hash = map { split /=|\s+/; } <$fh>;
close $fh;
print "$_ => $hash{$_}\n" for keys %hash;
此代码的作用:
<$fh>
从我们的文件中读取一行,或在列表上下文中读取所有行,并将它们作为数组返回。
在map
内,我们使用正则表达式/= | \s+/x
将行拆分为数组。这意味着:当您看到=
或一系列空白字符时拆分。这只是原始代码的浓缩和美化形式。
然后,我们将map
生成的列表转换为hash
类型。我们可以这样做,因为列表的项目数是偶数。 (像key key=value
或key=value=value
这样的输入会在此时抛出错误。)
之后,我们打印出哈希值。在Perl中,我们可以直接在字符串中插入哈希值,除了特殊格式之外,不必使用printf
和朋友。
for
循环迭代所有键(在$_
特殊变量中返回),$hash{$_}
是相应的值。这也可以写成
while (my ($key, $val) = each %hash) {
print "$key => $val\n";
}
其中each
遍历所有键值对。
答案 1 :(得分:5)
试试这个
use warnings;
my %data = ();
open FILE, '<', 'file1.txt' or die $!;
while(<FILE>)
{
chomp;
$data{$1} = $2 while /\s*(\S+)=(\S+)/g;
}
close FILE;
print $_, '-', $data{$_}, $/ for keys %data;
答案 2 :(得分:4)
最简单的方法是将整个文件粘贴到内存中,并使用正则表达式将键/值对分配给哈希。
该程序显示了该技术
use strict;
use warnings;
my %data = do {
open my $fh, '<', '/root/temp.txt' or die $!;
local $/;
<$fh> =~ /(\w+)\s*=\s*(\w+)/g;
};
use Data::Dump;
dd \%data;
<强>输出强>
{
cinterim => 3534,
cstart => 517,
cstop => 622,
ointerim => 47,
ostart => 19,
ostop => 20,
}