我按照下面的示例填充数据数组并获取额外的空白元素。昨天我和一些正常的表达方式帮助了我,我一直在使用并且一直在使用许多不同的功能。我尝试使用你教给我的相同逻辑但是无法弄清楚为什么我在“>”之间提取数据时会得到额外的空白元素和“<”。
非常感谢! -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;
答案 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'
];
我也建议
strict
和warnings
。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
而不是另一个原因而被绊倒了......