【发布时间】:2019-02-11 07:20:28
【问题描述】:
我编写了这个漂亮的 Perl 脚本来为广播电台的自动化系统生成一个 .cue 文件。它在我写它的第一天有效,一周后它不起作用。
这是它的工作原理的伪代码:
调用脚本并在启动时将以下变量作为参数分配: --要导入数组的CSV文件的名称 --MP3文件名
我声明了将分配逗号分隔值的变量的名称
打开文件
在 while 循环中,我遍历 CSV 的每一行并将每个逗号分隔值分配给一个变量。在进行下一次迭代之前,我在屏幕上打印 .cue 文件的输出
遍历 while 循环,直到处理完 CSV 的所有行
这就是问题所在,在我的 CSV 中,我最后一个字段的值包含一个冒号,Perl 认为它是一个运算符。这是一个示例行:
没有人喜欢你,蝎子,停电,13:38:00
当我运行脚本时,我收到以下错误: part1.csv 第 4 行的语法错误,靠近“13:”
这是我的问题:如何将包含 : 运算符的字符串分配给变量?似乎当 Perl 看到带有冒号的字符串时,它认为它需要对 : 做一些事情,而不是仅仅将它传递给变量。
我在 Windows 10 上运行活动状态 perl。这是我的
#!perl
use strict;
use warnings;
my $file = $ARGV[0] or die "Need to get CSV file on the command line\n";
my $mp3Filename = $ARGV[1] or die "Need the MP3 File Name\n";
my $title;
my $performer;
my $remAlbum;
my $myTrackIndex;
my $line;
my $data;
my @fields;
my $track = 1;
#FILE "show1.mp3" WAVE
print "FILE \"$ARGV[1]\" WAVE\n";
open($data, '<', $file) or die "Could not open '$file' $!\n";
while (my $line = <$data>) {
chomp $line;
my @fields = split "," , $line;
$title = $fields[0];
$performer = $fields[1];
$remAlbum = $fields[2];
$myTrackIndex = $fields[3];
print "TRACK 0$track AUDIO\n";
print "TITLE \"$title\"\n";
print "PERFORMER \"$performer\"\n";
print "REM ALBUM \"$remAlbum\"\n";
print "INDEX 01 $myTrackIndex\n";
$track++;
#TRACK 01 AUDIO
#TITLE "Heavy Metal Halloween - Toccata And Fugue"
#PERFORMER "Heavy Metal Halloween"
#REM ALBUM "Heavy Metal Halloween"
#INDEX 01 00:02:00
}
这是我得到的错误:
Semicolon seems to be missing at part1.csv line 1.
at part1.csv line 1.
Semicolon seems to be missing at part1.csv line 2.
at part1.csv line 2.
Semicolon seems to be missing at part1.csv line 3.
at part1.csv line 3.
Semicolon seems to be missing at part1.csv line 4.
at part1.csv line 4.
Semicolon seems to be missing at part1.csv line 5.
at part1.csv line 5.
syntax error at part1.csv line 1, near "00:"
syntax error at part1.csv line 2, near "05:"
Illegal octal digit '9' at part1.csv line 3, at end of line
syntax error at part1.csv line 3, near "09:"
syntax error at part1.csv line 4, near "13:"
syntax error at part1.csv line 5, near "17:"
syntax error at part1.csv line 6, near "24:"
Execution of part1.csv aborted due to compilation errors.
at part1.csv line 6.
感谢您的耐心等待。好几年没写代码了。
【问题讨论】:
-
提示:您在解析 CSV 文件时有很多错误。您应该使用 Text::CSV。它不再使用,它会正确解析您的 CSV。用法:
my $csv = Text::CSV->new({ auto_diag => 2, binary => 1 }); while (my $fields = $csv->getline($data)) { ... }