我的剧本中有这个问题,但我没有解决这个问题的想法!
当我启动脚本时:
boak@boak-LX:~/Documents$ perl dl-sound.pl --url http://soundcloud.com/alexorion/bigger-room-radio-015
Missing or empty input at dl-sound.pl line 100.
脚本:
sub fetch_music_info {
my ($self, $music_url) = @_;
$music_url ||= $self->{url};
my $page = $self->_get_content($music_url);
my $jsmusic = $1 if ($page =~ m{window.SC.bufferTracks.push\((.*)}i);
$jsmusic =~ s/;//g if defined($jsmusic);
$jsmusic =~ s/\)//g if defined($jsmusic);
my $music_info = JSON::Tiny::decode_json($jsmusic);
return $music_info;
}
答案 0 :(得分:2)
它不太可能是您的问题的原因,但您不应该使声明有条件。行为未定义,可能导致各种废话。
所以这个
my $jsmusic = $1 if $page =~ m{window.SC.bufferTracks.push\((.*)}i;
应该是
my $jsmusic;
$jsmusic = $1 if $page =~ /window\.SC\.bufferTracks\.push\(([^)]*)/i;
另请注意,我已更改正则表达式以逃避点,并且仅捕获直到下一个右括号的字符。这意味着如果我正确理解您的数据,则不需要进行以下替换
<强>更新强>
事实上,再看一遍,如果模式不匹配,子程序的整个目的都会失效,所以你应该写得更像
sub fetch_music_info {
my ($self, $music_url) = @_;
$music_url ||= $self->{url};
my $page = $self->_get_content($music_url);
if ($page =~ /window\.SC\.bufferTracks\.push\(([^)]*)/i) {
return JSON::Tiny::decode_json($1);
}
else {
die "Music Info not found";
}
}
答案 1 :(得分:1)
我想这里没有定义$jsmusic
:
my $music_info = JSON::Tiny::decode_json($jsmusic);
更改为:
my $music_info;
$music_info = JSON::Tiny::decode_json($jsmusic) if defined $jsmusic;
return $music_info;
答案 2 :(得分:0)
我同意鲍罗丁的观点,但是有更多的Perlish方式来写这个:
my ($jsmusic) = ($page =~ m{window.SC.bufferTracks.push\((.*)}i);
这是因为=~
运算符会返回匹配变量列表($1
,$2
等)。
在这种情况下,$jsmusic
将始终声明但如果正则表达式不匹配则将不确定。您需要($jsmusic)
周围的括号来强制操作员列出上下文。