我试图将下面的行拆分为<br />
,<br>
和逗号以将其推送到数组中。我需要获得LUN-JUE,VIE,SAB和DOM的日子,以及与它们对应的小时数。我昨天开始学习perl并且坚持这个并且需要帮助。
这些是我必须做的指示,因此我不确定是否可以使用拆分。
- 创建一个使用正则表达式的Perl脚本或程序来读取测试文件,提取电影名称和放映时间,并创建一个html 文件显示提取的数据。
醇>
这就是我所尝试过的,我知道我甚至没有接近。
@hours = $row.split(/[<br \/><br>]+/);
&安培;
elsif($row =~ qr{(.+)<br />(.+),(.+),(.+)<br>(.+)<br />}){
@hours = $1;
print "@hours\n";
}
这是我尝试拆分的路线。
LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>
答案 0 :(得分:1)
首先,@hours = $row.split(/[<br \/><br>]+/);
语法无效perl
。
其次,[<br \/><br>]
对你不起作用,因为它会独立地考虑每个角色,而不是作为一个群体。
因此,您应该在regex
中使用分组。但是在split
中,当你在分组中保留分隔符时,该组也会在结果集中被捕获,因此要删除它,保留(?:)
,即非捕获组。
这对你有用:
my $string='LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>';
my @array=split(/(?:<\s*br\s*\/\s*>|<\s*br\s*>)+/i,$string);
保留\s*
将处理br
标记内有多个空格的所有情况。
答案 1 :(得分:-1)
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $sample = 'LUN - JUE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM<br>VIE <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>SAB <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM, 11:10 PM<br>DOM <br /> 10:30 AM, 1:40 PM, 4:50 PM, 8:00 PM <br/>';
my $line_re = qr/\s*\Q<br\E\s*\/?\Q>\E\s*/i;
my $day;
my %lookup;
for my $line ( split($line_re, $sample) ) {
$line =~ s/^\s+|\s*$//g;
$day = $line if(!defined $line || $line =~ m/^[a-z]/i);
if ( $line =~ m/^\d/ ) {
my @times = split(/,/, $line);
$lookup{$day} = [@times];
}
}
print Dumper \%lookup;
$VAR1 = {
'VIE' => [
'10:30AM',
'1:40PM',
'4:50PM',
'8:00PM',
'11:10PM'
],
'SAB' => [
'10:30AM',
'1:40PM',
'4:50PM',
'8:00PM',
'11:10PM'
],
'LUN-JUE' => [
'10:30AM',
'1:40PM',
'4:50PM',
'8:00PM'
],
'DOM' => [
'10:30AM',
'1:40PM',
'4:50PM',
'8:00PM'
]
};