基于config的Perl哈希遍历
我需要能够从我从不同的第三方收到的数据中提取特定值。根据第三方的不同,数据可以采用不同的结构。例如:基于config的Perl哈希遍历,perl,Perl,我需要能够从我从不同的第三方收到的数据中提取特定值。根据第三方的不同,数据可以采用不同的结构。例如: my $first = { email => "joe\@example.com", firstname => "Joe", lastname => "Regular", }; my $second = { user => { e-mail => "joe\@example.com",
my $first =
{
email => "joe\@example.com",
firstname => "Joe",
lastname => "Regular",
};
my $second =
{
user => {
e-mail => "joe\@example.com",
firstName => "Joe",
lastName => "Regular",
}
};
我知道每个第三方的数据结构,所以我可以将其定义为配置。我想要的结果是
my $email = _magic($first_config,$first);
my $other_email = _magic($second_config,$second);
非常感谢任何想法。建立一个查找表。您可以使用一个分派表,散列值作为代码引用,这样当一方标识用作密钥时,该方的代码就会执行
my %get_value = ( first => \&fetch_first, second => \&fetch_second );
my $party = 'first'; # input via command-line options, STDIN ...
my $email = $get_value{$party}->();
其中\&fetch\u first
是对子例程fetch\u first
的引用。您也可以直接输入它,first=>sub{…}
,适用于简单代码。看,还有
有许多方法可以在程序中携带数据,因此可以实现查找本身
这是一个内置步骤的示例。它使用(已确认的)事实,即数据位于有效的Perl数据结构中,为简单起见,它在每个子结构中指定了数据权限
sub fetch_first {
my $data = {
email => '...',
firstName => '...',
};
return $data->{email};
}
这只提供电子邮件地址,但我们可以做得更好
取消引用代码引用后,还可以传递参数
my $first_name = $get_value{$party}->('firstName');
现在写入sub以使用此输入返回所需字段
sub fetch_first {
my ($query) = @_;
my $data = {
email => '...',
firstName => '...',
};
return $data->{$query};
}
上面提到的一个很大的缺点是调用代码必须使用有效的键名,因此它需要知道它所使用的实现的细节
例如,可以通过为调用选择一个接口来改进这一点,然后在subs中将该接口转换为键名(或者通过另一个查找结构)。然后你打电话,比如
my $email = $get_value{$party}->('email'); # or: 'first', 'last'
在某个地方,你可以找到subs可以查找的关联first=>“firstName”
(等等)
以一致的方式设置数据极大地提高了灵活性。如果代码经过深思熟虑的组织,那么整个过程也可以很好地维护
如果这变得更复杂,那么解决方案就是编写一个类。然后你可以建立一个非常好的系统。建立一个查找表。您可以使用一个分派表,散列值作为代码引用,这样当一方标识用作密钥时,该方的代码就会执行
my %get_value = ( first => \&fetch_first, second => \&fetch_second );
my $party = 'first'; # input via command-line options, STDIN ...
my $email = $get_value{$party}->();
其中\&fetch\u first
是对子例程fetch\u first
的引用。您也可以直接输入它,first=>sub{…}
,适用于简单代码。看,还有
有许多方法可以在程序中携带数据,因此可以实现查找本身
这是一个内置步骤的示例。它使用(已确认的)事实,即数据位于有效的Perl数据结构中,为简单起见,它在每个子结构中指定了数据权限
sub fetch_first {
my $data = {
email => '...',
firstName => '...',
};
return $data->{email};
}
这只提供电子邮件地址,但我们可以做得更好
取消引用代码引用后,还可以传递参数
my $first_name = $get_value{$party}->('firstName');
现在写入sub以使用此输入返回所需字段
sub fetch_first {
my ($query) = @_;
my $data = {
email => '...',
firstName => '...',
};
return $data->{$query};
}
上面提到的一个很大的缺点是调用代码必须使用有效的键名,因此它需要知道它所使用的实现的细节
例如,可以通过为调用选择一个接口来改进这一点,然后在subs中将该接口转换为键名(或者通过另一个查找结构)。然后你打电话,比如
my $email = $get_value{$party}->('email'); # or: 'first', 'last'
在某个地方,你可以找到subs可以查找的关联first=>“firstName”
(等等)
以一致的方式设置数据极大地提高了灵活性。如果代码经过深思熟虑的组织,那么整个过程也可以很好地维护
如果这变得更复杂,那么解决方案就是编写一个类。然后你可以构建一个非常好的系统。构建一个查找表,party\u description=>code\u to\u run。您可以使用分派表,哈希值为CODEREF。(顺便说一句,您展示了Perl数据结构——您如何“接收”来自第三方的数据?)构建一个查找表,party_description=>code_to_run。您可以使用分派表,哈希值为CODEREF。(顺便说一句,您展示了Perl数据结构——您如何从第三方“接收”到它?)这些是有效的Perl数据结构,我使用.LOL从解码的JWT令牌中获得这些数据结构!如果几天前我自己没有使用过这样的调度表,我就不会注意到。@BetterDeal好的——如果它们没有“进化”(随着时间的推移或类似的事情而不经通知地改变),这会有所帮助。如果最低级别的“标识符”——示例中的键——是一致的,那么您就可以构建一个非常好的系统。我建议首先考虑一下如何存储数据。它不需要在每一个子里都写出来。@BetterDeal我在那里有一个打字错误(
\%…
,而不是\&…
),这会使它失败得很惨。请注意,以防您没有注意到错误(已修复)。感谢堆,@zdim非常感谢:)正如您所建议的,我使用了一个调度表。这些是有效的Perl数据结构,我使用.LOL从解码的JWT令牌中获得!如果几天前我自己没有使用过这样的调度表,我就不会注意到。@BetterDeal好的——如果它们没有“进化”(随着时间的推移或类似的事情而不经通知地改变),这会有所帮助。如果最低级别的“标识符”——示例中的键——是一致的,那么您就可以构建一个非常好的系统。我建议首先考虑一下如何存储数据。它不需要在每一个子里都写出来。@BetterDeal我在那里有一个打字错误(\%…
,而不是\&…
),这会使它失败得很惨。只是一个便条,以防你没有注意到错误(已修复)。谢谢堆,@zdim非常感谢:)我已经按照你的建议使用了一个调度表。