我的正则表达不如它应该的那样好,我提前道歉。
代码:
#!/usr/bin/perl -wT
use strict;
use warnings;
use Text::ParseWords;
my @AoH;
my $filename = 'metadata.txt';
open(my $fh, '<', $filename) or die "Could not open file '$filename' $!";
while (<$fh>) {
my $rec = {};
for my $field ( split ) {
(my $key, my $value) = quotewords('=', 0, $field);
$rec->{$key} = $value;
print "$key -> $value;\n";
}
push @AoH, $rec;
}
我想解析以下字符串(位于metadata.txt中):
video_info =“这是视频说明”video_name =“avideoname.mp4”video_thumb =“avideothumbnail.jpg”
本质上,我想拆分前面提到的字符串,以便引号中的任何内容都是一个值(包括空格),而在=是键之前的任何内容。
我想要的输出:
video_info -> This is a video description;
video_name -> avidenoname.mp4;
video_thumb -> avideothumbnail.jpg;
我正在使用它作为参考来创建我的哈希数组:http://docstore.mik.ua/orelly/perl/prog3/ch09_03.htm,稍微修改代码(例如使用引号而不是分割)。我觉得这主要是一个正则表达式问题,但如果有任何问题或使用不推荐的代码,请随时纠正/解释任何不一致。
任何帮助将不胜感激。提前致谢。
答案 0 :(得分:8)
split
不适合将由空格分隔的字符串拆分为两个也包含空格的子字符串。
例如,在您的情况下,split
用于此行:
video_info="This is a video description" video_name="avideoname.mp4"
将给出如下数组:
qw(video_info="This, is, a, video, description", video_name="avideoname.mp4")
绝对不是想要的输出。
相反,您可以使用quotewords
分割此行:
quotewords('\s+', 0, $_)
会给:
qw(video_info="This is a video description", video_name="avideoname.mp4")
此外,在处理一行以消除chomp
的影响之前,最好\n
。
#!/usr/bin/perl -w
use strict;
use warnings;
use Text::ParseWords;
my @AoH;
my $filename = 'metadata.txt';
open(my $fh, '<', $filename) or die "Could not open file '$filename' $!";
while (<$fh>) {
chomp;
my $rec = {};
for my $field ( quotewords('\s+', 0, $_) ) {
(my $key, my $value) = quotewords('=', 0, $field);
$rec->{$key} = $value;
print "$key -> $value;\n";
}
push @AoH, $rec;
}