【问题标题】:Extracting string with regex stored in hash使用存储在哈希中的正则表达式提取字符串
【发布时间】:2011-09-27 20:17:50
【问题描述】:

我正在尝试从文本文件中解析出特定值,并将其输出到不同的文件中。

我正在使用存储在哈希中的正则表达式(与其描述性名称匹配)来搜索字符串(标量),然后将发现的值存储在数组中,然后将其写入文件。

除了搜索/提取部分之外,我已经完成了所有工作。 (我在过去几天才刚刚学习 Perl,所以如果我犯了一些非常简单的错误,我不会感到惊讶。)

$inputstring = 'Lorem ipsum dolor Date: 20110131 quis semper egestas.';

%myregexhash = ( Date => '/([12][09][0-9][0-9][0-1][0-2][0-9][0-9])/' );

@foundvaluesarray=();

while ( ($thefieldname, $theregex) = each (%myregexhash))
{
    if ($inputstring =~ $theregex) 
    {
        push(@foundvaluesarray, "$thefieldname: $&\n");
        $inputstring = $';
    }
}

print "@foundvaluesarray";

该数组填充了字段名称(“日期:”),但不是我要查找的值(“20110131”)。

知道我做错了什么吗?

【问题讨论】:

    标签: regex perl hash


    【解决方案1】:

    做一个小改动:

    %myregexhash = ( Date => qr/([12][09][0-9][0-9][0-1][0-2][0-9][0-9])/ );
    

    注意qr// 的使用,它编译一个正则表达式。

    您是新手,所以我建议您进行一些其他更改。

    任何重要的程序都应该以以下开头:

    #! /usr/bin/env perl
    
    use strict;
    use warnings;
    

    strict pragma 有很多好处,例如在编译时捕获拼写错误的变量名并检查您对引用的使用。 warnings pragma 会开启额外的警告诊断功能,可以提醒您代码中存在问题的情况。

    现在必须预先声明:

    my $inputstring = 'Lorem ipsum dolor Date: 20110131 quis semper egestas.';
    
    my %myregexhash = ( Date => qr/([12][09][0-9][0-9][0-1][0-2][0-9][0-9])/ );
    
    my @foundvaluesarray=();
    

    = () 隐含在数组或哈希声明中,因此在惯用的 Perl 中看不到它。

    如果可以提供帮助,您不想使用$&,因为它是slows down your entire program

    警告:一旦 Perl 发现您在程序中的任何位置需要$&$`$' 之一,它就必须为每个模式匹配提供它们。这可能会大大减慢您的程序。 Perl 使用相同的机制来生成$1$2 等,因此您还要为每个包含捕获括号的模式付出代价。 (为了在保留分组行为的同时避免这种成本,请改用扩展的正则表达式(?: ... )。)但是如果您从不使用$&$`$',那么没有捕获括号的模式将不会受到惩罚。所以尽量避免$&$'$`,但如果你不能(有些算法真的很欣赏它们),一旦你用过一次,就随意使用它们,因为你已经已经付出了代价。从 5.005 开始,$& 不像其他两个那样昂贵。

    因为你用括号包围你的模式,匹配的子字符串被捕获在$1,所以从那里抓住它。

    另外,你在 $inputstring 前面切掉的方式在 Perl 中用 s/// 表达要自然得多。

    while (my ($thefieldname, $theregex) = each (%myregexhash))
    {
        if ($inputstring =~ s/$theregex//) 
        {
            push(@foundvaluesarray, "$thefieldname: $1\n");
        }
    }
    
    print "@foundvaluesarray";
    

    输出:

    日期:20110131

    【讨论】:

    • 哇——完全解决了!非常感谢!!其他很棒的提示;我已经全部修好了,而且效果很好。 :)
    • 嗯,它应该在没有 qr 的情况下工作。哦,我明白了,/ 不属于字符串。
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2014-10-17
    • 2021-11-28
    • 1970-01-01
    相关资源
    最近更新 更多