【问题标题】:Reference a variable within variable - hashes?引用变量中的变量 - 哈希?
【发布时间】:2013-03-21 04:53:50
【问题描述】:

我一直在寻找解决我的问题的方法,在阅读了几篇文章后,哈希似乎是答案,但我不确定如何根据我的要求实现这个,有人可以建议如何甚至更好的选择吗?

在我的代码中,变量$host 是根据数据库中的值设置的。我循环遍历这些值,每次都会更改 $host 的值。

我想丢弃某些类型的主机名,并确定要丢弃哪些主机,我在一个用户可配置文件中读取,该文件包含该排除的 Perl 正则表达式。即配置文件有一行

 EXCLUDE=\d+DAT\d+,\d+INF\d+

然后我想建立 Perl 正则表达式匹配(逻辑 OR),即

if ( $host =~ m/\d+DAT\d+/ || $host =~ m/\d+INF\d+/ ) {
  # do something
}

目前我的代码与上面的示例一样是硬连接的,但是如何在读取配置文件后动态构建 Perl 正则表达式?

我已将配置文件读入一个数组,并将从那里开始。上面的代码需要这样结束:

if ($exclude clause) {
  # do something
}

这就是我着手实现从数组中读取的方式:

for ($i = 1; $i < @conf; $i++) {
  $exclude_clause .= "$host =~/" . @conf[$i] . "/ || "; 
}
$exclude_clause =~ s/ \|\| $//;

问题是在$exclude_clause 中引用$host。除了$host,我的正则表达式字符串构建良好。

【问题讨论】:

  • 到底是什么问题?这是您尝试运行的实际代码吗?

标签: perl variables hash reference


【解决方案1】:

我会建议一种不同的方法,它不需要您构建一个大的正则表达式字符串然后对其进行评估。相反,如何使用List::MoreUtils 模块的any 函数,该函数接受一个代码块,为列表的每个成员评估它,并在该块为列表中的至少一个条目返回true 时返回true。例如:

use List::MoreUtils qw{ any };

if ( any { $host =~ $_ } @conf ) {
    # do something
}

在传递给any 的代码块中,临时变量$_ 包含列表中的当前条目。这样一来,您就可以避免构建正则表达式。

【讨论】:

  • 这听起来是一个很好的解决方案,只是为了确认 - 如果我的 @conf 数组值是 \d+DAT\d+ (位置 1) 和 \d+INF\d+ (pos2) 等等,那么每个将针对 $host 进行正则表达式匹配测试,如果任何匹配则 #do something。
  • 我刚刚尝试运行上述建议,但出现错误“无法在没有包或对象引用的情况下调用方法“任何”.........第 193 行”-第 193 行如下:- if ( any { $host =~ m/$_/ } @conf){ #do something } 我已经安装了 List::MoreUtils 它在我的代码“Use List::MoreUtils” Any请问有什么建议吗?标记
  • 我应该写use List::MoreUtils qw{ any };。更新了我上面的答案。
【解决方案2】:

我认为您应该将完整的正则表达式存储在配置文件中,但如果需要,它可以是一组逗号分隔的替代方案。

您将使用qr// 构造来构建正则表达式:

my $exc1 = "\d+DAT\d+";  # Read from configuration file
my $ecc2 = "\d+INF\d+";

my $rex1 = qr/$exc1/;
my $rex2 = qr/$exc2/;

...populate $host...

if ($host =~ $rex1 || $host =~ $rex2)
{
    ...exclude $host...
}
else
{
    ...include $host...
}

或者,您可以构建单个正则表达式:

my $exc1 = "\d+DAT\d+";  # Read from configuration file
my $ecc2 = "\d+INF\d+";

my $rex = qr/$exc1|$exc2/;

...populate $host...

if ($host =~ $rex)
{
    ...exclude $host...
}
else
{
    ...include $host...
}

单个正则表达式可以由任意数量的替代排他性正则表达式片段构建而成。当然,如果文件中的值为:

EXCLUDE=\d+DAT\d+|\d+INF\d+

然后你的代码再次简化,假设正则表达式字符串被读入$exc:

my $exc = "\d+DAT\d+|\d+INF\d+";  # Read from file
my $rex = qr/$exc/;

...populate $host...

if ($host =~ $rex)
{
    ...exclude $host...
}
else
{
    ...include $host...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2013-08-29
    • 2014-12-28
    • 2013-04-18
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多