Perl 如何构建动态多级哈希查找

2024-01-19

我有一个代码块,我使用了很多次,但有一些细微的变化,我试图将其制作成子例程。 此代码块完成配置模板(路由器接口、VRF、其他网络内容)

它通过在哈希数据结构(称为 %config_hash)中查找数据来实现这一点,该数据结构是通过摄取 excel 文件构建的:P。查找的数据位于不同模板的哈希的不同区域中。

当前工作代码的示例如下:

my @temp_source_template = @{ clone ($source_template{$switch_int_template}) };

            my %regex_replacements=();                                                  ## hash for holding regex search and replace values, keys are !name! (look in template files) values taken from DCAP
            my @regex_key =();                                                          ## temp array used for whe more then one !name! on a line
            my $find_string='';
            foreach my $line (@temp_source_template){
                my (@regex_key) = ( $line =~ /(\!.*?\!)/g );                        ## match needs to be non greedy thus .*? not .*
                foreach my $hash_refs (@regex_key){
                    my $lookup = $hash_refs =~ s/!//gri;                            ## remove ! from !name! so lookup can be done in DCAP file hash
                    my $excel_lookup = $lookup =~ s/_/ /gri;
                    $regex_replacements{$hash_refs} = $config_hash{'Vlan'}{$inner}{$excel_lookup};          ## lookup DCAP file hash a write value to regex hash
                    if (undef eq $regex_replacements{$hash_refs}){
                        $regex_replacements{$hash_refs} = $config_hash{'Switch'}{$outer}{$excel_lookup};
                    }
                    if (undef eq $regex_replacements{$hash_refs}){
                        $regex_replacements{$hash_refs} = $config_hash{'VRF'}{$middle}{$excel_lookup};
                    }
                    $find_string= $find_string . $hash_refs . '|' ;

                }

            }

因此,这将创建一个哈希 (regex_replacements),其中包含要查找的值(regex_replacements 中的哈希键)和要替换的值(regex_replacements 中的值)。它还构建一个在正则表达式中使用的字符串($find_string)。不同的模板将具有不同的哈希查找“路径”(例如 $config_hash{'Switch'}{$outer}{$excel_lookup} )或不同的顺序(实际上是最具体的匹配)

为了完整起见,这里是执行正则表达式替换的代码块:

foreach my $line (@temp_source_template){
    my (@line_array) = split /(![A-Za-z_]*!)/, $line;
    foreach my $chunk (@line_array){
        my $temp_chunk = $chunk;
        $chunk =~ s/($find_string)/$regex_replacements{$1}/gi;
        if (!($chunk)){
            $chunk = $temp_chunk;
        }
    }
    $line = join ("", @line_array);

    if ($line =~ /\!.*\!/){
        print {$log} " ERROR line has unmatched variables deleting line \"$line\"\n";
        $line ="";
    }
}

所以我做了一些搜索,发现了这个:Perl:如何将数组转换为嵌套哈希键 https://stackoverflow.com/questions/11505100/perl-how-to-turn-array-into-nested-hash-keys这几乎正​​是我想要的,但我无法让它工作,因为我的变量引用是一个哈希,它的哈希变量引用只是“REF”,所以我在尝试使用哈希作为引用时遇到错误。

所以我不会发布我尝试过的内容,因为我并不真正理解该链接的魔力。

但我正在做的是将以下内容传递给子组件

            my @temp_source_template = @{ clone ($source_template{$test}) };
        my @search_array = ( ['VRF' ,$middle] , ['Switch' ,$outer]);
        my $find_string, $completed_template = dynamic_regex_replace_fine_string_gen(\%source_config,\@temp_source_template, \@search_array);

我想返回 $find_string 和 regex_replacements 哈希引用。应该注意的是,在 sub 中,我需要将 $excel_lookup 的值附加到 @search 数组元素的末尾。

我不明白如何做的是构建变量级别哈希查找。


你可以尝试使用Data::Diver https://metacpan.org/pod/Data::Diver它提供了对深层嵌套结构元素的简单访问。

例如:

use feature qw(say);
use strict;
use warnings;
use Data::Diver qw(Dive);

my $hash = { a => { b => 1, c => { d => 2 }}};
my $keys = [[ 'a', 'b'], ['a','c','d']];
lookup_keys( $hash, $keys );

sub lookup_keys {
    my ( $hash, $keys ) = @_;

    for my $key ( @$keys ) {
        my $value = Dive( $hash, @$key );
        say $value;
    }
}

Output:

1
2

See Also:

  • 在perl中动态创建散列的散列 https://stackoverflow.com/q/36033603/2173773
  • 将类似配置散列的数据读入 perl 散列 https://stackoverflow.com/q/24396250/2173773
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 如何构建动态多级哈希查找 的相关文章

随机推荐

  • Pandas 的部分总和和小计

    I m trying to achieve a table with subtotals as shown here http pandas pydata org pandas docs stable cookbook html pivot
  • pandas 行值到列标题

    我有一个像这样的数据框 df pd DataFrame id1 1 1 1 1 2 2 2 id2 1 1 1 1 2 2 2 value a b c d a b c id1 id2 value 0 1 1 a 1 1 1 b 2 1 1
  • 使用 Google Maps API 绘制地图路径/航点并播放路线

    我试图在播放映射路线时绘制访问的路径 如下例所示 加载地图时 我希望绘制的点 A B C D E 然后 F 依次连接 我已成功绘制了这些点 但无法将这些点逐个动态链接 这是我的代码
  • UICollectionView 单元格视图重叠

    我的单元格重叠 如下所示 my cellForItemAtIndexPath是这样的 func collectionView collectionView UICollectionView cellForItemAtIndexPath in
  • 如何在 Windows 窗体应用程序中构建启动屏幕?

    我需要在应用程序启动时显示启动画面几秒钟 有人知道如何实施吗 将非常感谢您的帮助 首先 将启动屏幕创建为无边框 不可移动的形式 并在其上显示图像 设置为最初显示在屏幕中央 并按您想要的方式着色 所有这些都可以在设计器内部设置 具体来说 您想
  • PHP Amazon S3 上传和标签

    我正在编写一个视频共享网站 我正在使用 S3 来存储和提供视频 我已经在 MySQL 数据库中为视频编写了标签 但我发现 S3 支持上传文件上的设置标签 这是我用来上传文件的代码 try Create a S3Client s3Client
  • 返回Json,但其中包含反斜杠“\”,这是我不想要的

    我使用 MVC4 web api c 并且想要返回 Json使用 Json net 问题是它带有 反斜杠 我还将此代码添加到 Global asax 中 GlobalConfiguration Configuration Formatter
  • WPF 根据条件隐藏数据网格中的行

    我需要根据数据网格中的参数和值隐藏数据网格中的行 我想做这样的事情 foreach System Data DataRowView dr in myDataGrid ItemsSource Logic to determine if Row
  • opengl中使用哪种图像类型

    当使用 OpenGL 为 Android 编程时 我似乎可以为图像使用 BMP JPG 和 PNG 文件类型 哪一个 如果有的话 最好 非常感谢 这不是 OpenGL 的问题 因为一旦你有了Graphics Bitmap对象来源很大程度上无
  • yarn-client模式和yarn-cluster模式的区别

    我在纱线客户端模式和纱线集群模式上运行类似的代码时遇到了一些问题 当我在客户端模式下运行我的代码时 它可以完美执行 但在纱线集群节点上运行时会失败 它抛出文件非文件异常 指出找不到 pyspark zip 文件 对此的任何见解都会有所帮助
  • Python 中与语法、标记、词干和词义消歧有关的一些 NLP 内容

    背景 TLDR 为了完成而提供 寻求有关奇怪需求的最佳解决方案的建议 我是一名大学四年级的 文学 学生 只有我自己的编程指导 我对Python有足够的能力 所以我不会在实现我找到的解决方案 大多数时候 并在它们的基础上进行开发时遇到麻烦 但
  • 如何提供具有不同数据库模式的多个版本的 API?

    在 Kevin Goldsmith 2015 年的演讲中Spotify 的微服务 https youtu be 7LGPeBgNFuU t 925 从 15 25 17 43 他提到 当他们创建新版本的 API 时 他们只是创建一个新服务器
  • 使用 Python 查找最相似的行

    我有两个数据框 df1 和 df2 在 df1 中 我存储一行包含一组值 我想在 df2 中找到最相似的行 import pandas as pd import numpy as np Df1 has only one row and fo
  • Codeigniter 当我单击“删除”时,如果单击“是”或“否”,我想要弹出通知

    Model function delete exchange ExchangeRateId this gt db gt where ExchangeRateId ExchangeRateId this gt db gt delete exc
  • 在 WPF 中,如何更改代码中 DataTemplate 的 Textblock 的文本绑定?

    我有一个 ListBox 其 ItemsSource 绑定到对象列表 列表框有一个 ItemTemplate 和一个包含 TextBlock 的 DataTemplate 文本块的 Text 绑定到对象的 Name 属性 即 Text Bi
  • 更改 OpenShift JBoss AS 7 中的 URIEncoding

    我正在使用 OpenId 模块使用 Spring Security 构建一个测试应用程序 我也用jQuery OpenId 插件 http jvance com pages JQueryOpenIDPlugin xhtml支持一些提供商 我
  • date-fns 2 - 无法让树摇动工作

    我不知道如何date fns https github com date fns date fnsv 2 树摇动功能有效 为了帮助我 我使用以下方法制作了一个非常简单的项目 date fns 2 1 0 webpack 4 39 3 typ
  • 如何信任具有交叉签名根的 SSL 证书,在 android <= 5 上已过期

    我在一家使用 Comodo Sectigo SSL 证书的公司工作 但是突然间 我们的应用程序在使用 Okhttp 客户端将 POST 发送到服务器时开始抛出此错误 在 Android 4 和 5 版本中 HTTP FAILED javax
  • 如何设置 Emacs 服务器使用的端口?

    我使用 Emacs 完成大部分开发工作 我希望能够从家里连接到在我的办公室工作站上运行的 Emacs 服务器 我通过 VPN 连接到我的办公室网络 我认为这基本上是安全的 不管怎样 我有一个脚本可以复制服务器身份验证文件 但看起来端口每次都
  • Perl 如何构建动态多级哈希查找

    我有一个代码块 我使用了很多次 但有一些细微的变化 我试图将其制作成子例程 此代码块完成配置模板 路由器接口 VRF 其他网络内容 它通过在哈希数据结构 称为 config hash 中查找数据来实现这一点 该数据结构是通过摄取 excel