Regexp代码将不需要的空白元素推送到数组中

时间:2015-10-21 16:03:51

标签: regex perl

我按照下面的示例填充数据数组并获取额外的空白元素。昨天我和一些正常的表达方式帮助了我,我一直在使用并且一直在使用许多不同的功能。我尝试使用你教给我的相同逻辑但是无法弄清楚为什么我在“>”之间提取数据时会得到额外的空白元素和“<”。

非常感谢! -Matt

inputFile.txt中的数据:

<record>SWCR000178</record><state>Approved</state><title>Something is broken</title>

Perl代码:

open $inFile, $inputFile or die $!;

while ($inFileLine = <$inFile>) {   
@fieldNames = $inFileLine =~ m(<\/(.*?)>)g;
**@fieldValues = $inFileLine =~ m(>(.*?)<)g; #This packs array with blank elements**
$recordNumber = @fieldValues[0];

print "Field Names: @fieldNames\n";
    $fieldNamesArraySize = @fieldNames;
    print "Field Names Array Size: $fieldNamesArraySize\n";
print "Field Values: @fieldValues\n";
    $fieldValuesArraySize = @fieldValues;
    print "Field Values Array Size: $fieldValuesArraySize\n";
print "Record Number: $recordNumber";

}

close $inFile;

1 个答案:

答案 0 :(得分:2)

(注意:通常的建议是&#39;使用解析器&#39;但因为这几乎肯定是参考:Populate array from XML end tags这样的地方不可用)

您遇到的问题是,您是否正在捕获&#34;零或更多&#34; ><之间的字符。

所以你在这里得到一个匹配:

</record><state>

它是空的。这可能会成功:

my @fieldvalues =  $inFileLine =~ m(>([^<]+)<)g;
print @fieldvalues;

因为它捕获了一个或多个&#39;任何其他而不是<的字符。

$VAR1 = [
          'SWCR000178',
          'Approved',
          'Something is broken'
        ];

我也建议

  • 启用strictwarnings
  • 使用3个arg打开词法文件句柄:open ( my $input, '<', "filename_here") or die $!;

这实际上是使用哈希的一个相当方便的地方:

#!c:\Strawberry\perl\bin
use strict;
use warnings;
use Data::Dumper;

my @records; 

while ( <DATA> ) {
   my %record = m/(\w+)        #capture one or more words 
                    \>         #literal
                    ([^<]+)    #capture one or more 'something that isn't a <'
                 /gx;          #repeat capture; ignore whitespace so I can format.
   push ( @records, \%record ); 
}

print Dumper \@records;

__DATA__
<record>SWCR000178</record><state>Approved</state><title>Something is broken</title>

这为我们提供了包含数据的哈希数组。

$VAR1 = [
          {
            'state' => 'Approved',
            'title' => 'Something is broken',
            'record' => 'SWCR000178'
          }
        ];

更严重的是 - 你还因为使用正则表达式解析XML而不是另一个原因而被绊倒了......