使用perl split函数创建hashmap

时间:2016-05-03 20:36:59

标签: perl io hashmap

我正在尝试从文本文件创建一个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值?

3 个答案:

答案 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;
}