我正在尝试从文本文件中解析出特定值,并将它们输出到不同的文件中.
我正在使用存储在散列中的正则表达式(与其描述性名称匹配)来搜索字符串(标量),然后将发现的值存储在数组中,然后将其写入文件.
除搜索/提取部分外,我已经完成了所有工作.(我刚刚在过去的几天里学过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";
Run Code Online (Sandbox Code Playgroud)
数组填充字段名称("Date:"),但不填写我正在寻找的值("20110131").
知道我做错了什么吗?
做一个小改动:
%myregexhash = ( Date => qr/([12][09][0-9][0-9][0-1][0-2][0-9][0-9])/ );
Run Code Online (Sandbox Code Playgroud)
注意使用qr//,编译正则表达式.
你是新人,所以我建议你做一些其他的改变.
任何非平凡的程序都应该从以下前面的事情开始:
#! /usr/bin/env perl
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
该strict编译指示具有很好的好处,例如在编译时捕获拼写错误的变量名称以及检查您对引用的使用.该warningspragma启用了额外的警告诊断功能,可以提醒您代码中的可疑案例.
现在必须预先声明:
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=();
Run Code Online (Sandbox Code Playgroud)
该= ()隐含在数组或哈希声明,所以你看不到它惯用的Perl.
你不想使用它,$&如果你可以帮助它,因为它会减慢你的整个程序.
警告:一旦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";
Run Code Online (Sandbox Code Playgroud)
输出:
Date: 20110131
| 归档时间: |
|
| 查看次数: |
2509 次 |
| 最近记录: |