如何使用Perl中的关键字将字符串解析为哈希?

Jea*_*uys 2 perl parsing keyword

我有一个字符串,不同的预定义关键字引入不同的数据 有没有办法通过巧妙地使用正则表达式或其他东西来做到这一点?这是一个例子:

关键字可以是"first name: ""last name: ".现在我要解析:

"character first name: Han last name: Solo"
Run Code Online (Sandbox Code Playgroud)

{ "first name: " => "Han ", "last name: " => "Solo" }
Run Code Online (Sandbox Code Playgroud)

当然,输入字符串中关键字的顺序不固定.这应该也适用于:

"character last name: Solo first name: Han"
Run Code Online (Sandbox Code Playgroud)

我理解有空格等问题.我会在这里忽略它们.

我知道如何解决这个问题循环不同的关键字,但我发现这不是很漂亮.

拆分几乎符合要求.它唯一的问题是它返回一个数组而不是一个哈希,所以我不知道哪个是名字或姓.

我的例子有点误导.这是另一个:

my @keywords = ("marker 1", "marker 2", "marker 3");
my $rawString = "beginning marker 1 one un marker 2 two deux marker 3 three trois and the rest";
my %result;
# <grind result>
print Dumper(\%result);
Run Code Online (Sandbox Code Playgroud)

将打印:

$VAR1 = {
      'marker 2' => ' two deux ',
      'marker 3' => ' three trois and the rest',
      'marker 1' => ' one un '
    };
Run Code Online (Sandbox Code Playgroud)

Eri*_*rom 7

这是一个使用split(带分隔符保留模式)的解决方案,可以使用其他键进行扩展:

use warnings;
use strict;

my $str = "character first name: Han last name: Solo";

my @keys = ('first name:', 'last name:');

my $regex = join '|' => @keys;

my ($prefix, %hash) = split /($regex)\s*/ => $str;

print "$_ $hash{$_}\n" for keys %hash;
Run Code Online (Sandbox Code Playgroud)

打印:

last name: Solo
first name: Han 
Run Code Online (Sandbox Code Playgroud)

要处理包含正则表达式元字符的键,请将该my $regex = ...行替换为:

 my $regex = join '|' => map {quotemeta} @keys;
Run Code Online (Sandbox Code Playgroud)

  • 拆分不只是返回列表,而是使用分隔符保留模式. (3认同)
  • @ Jean-Denis Muys:在构建正则表达式之前通过`quotemeta`过滤键. (2认同)