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)
这是一个使用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)