我正在尝试从文本文件创建一个hashmap。文本文件的设置方式如下。
(integer)<-- varying white space --> (string value)
. . .
. . .
. . .
(integer)<-- varying white space --> (string value)
例如:
5 this is a test
23 this is another test
123 this is the final test
我想要做的是将键分配给整数,然后将整个字符串分配给值。
我正在尝试一些事情%myHashMap;
while(my $info = <$fh>){
chomp($info);
my ($int, $string) = split/ /,$info;
$myHashMap{$int} = $string;
}
这不起作用,因为我在字符串中有空格。有没有办法清除初始空格,抓取整数,将其分配给$ int,然后清除空格直到你到达字符串,然后取出该行的其余文本并将其放在我的$ string值?
答案 0 :(得分:3)
你可以替换
split / /, $info # Fields are separated by a space.
与
split / +/, $info # Fields are separated by spaces.
或更一般的
split /\s+/, $info # Fields are separated by whitespace.
但你仍然面对领先空间的问题。要忽略这些,请使用
split ' ', $info
这种特殊情况在空格上分裂,忽略前导空格。
别忘了告诉Perl你最多期望两个领域!
$ perl -E'say "[$_]" for split(" ", " 1 abc def ghi", 2)'
[1]
[abc def ghi]
另一种选择是使用以下内容:
$info =~ /^\s*(\S+)\s+(\S.*)/
答案 1 :(得分:2)
您只需将空格上的每一行文本拆分为两个字段
此示例程序假定输入文件作为参数传递到命令行。我仅使用Data::Dump
来显示生成的哈希结构
use strict;
use warnings 'all';
my %data;
while ( <DATA> ) {
s/\s*\z//;
my ($key, $val) = split ' ', $_, 2;
next unless defined $val; # Ensure that there were two fields
$data{$key} = $val;
}
use Data::Dump;
dd \%data;
{
5 => "this is a test",
23 => "this is another test",
123 => "this is the final test",
}
答案 2 :(得分:0)
首先清除初始空白区域
$info =~ s/^\s+//g;
第二,你在整数和字符串之间有两个以上的空格,所以像这样使用split来给2个空格加上
split/ +/,$info;
代码是
use strict;
use warnings;
my %myHashMap;
while(my $info = <$fh>){
chomp($info);
$info =~ s/^\s+//g;
my ($int, $string) = split/ +/,$info;
$myHashMap{$int} = $string;
}