基于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非常感谢:)我已经按照你的建议使用了一个调度表。