缺少或清空输入错误

时间:2015-04-18 09:32:52

标签: json perl

我的剧本中有这个问题,但我没有解决这个问题的想法!

当我启动脚本时:

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;
}

3 个答案:

答案 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)周围的括号来强制操作员列出上下文。