下面的perl脚本应该将json转换为csv
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $file = 'players.json';
open( my $input, "<", $file ) or die $!;
my $json_data = decode_json(
do { local $/; <$input> }
);
foreach my $player_id ( keys %{$json_data} ) {
foreach my $fixture (
@{ $json_data->{$player_id}->{fixture_history}->{all} } )
{
print join( ",",
$player_id, $json_data->{$player_id}->{web_name},
@{$fixture}, "\n", );
}
}
json文件在/tmp文件夹下- players.json
ls /tmp | grep players.json
players.json
当我在/tmp下运行脚本时,我得到:
./jsonTOcsv.pl
Not a HASH reference at ./uri.pl line 15, <$input> line 1.
请问这里有什么问题吗?
1条答案
按热度按时间fykwrbwg1#
你的错误是:
在./uri.pl第15行,<$input>第1行不是HASH引用。
看起来它抱怨的台词是这样的:
在这一行中,假设
$json_data
是一个哈希的引用,然后尝试用%{$json_data}
解除它的引用。但似乎$json_data
不包含对散列的引用。Perl讨厌你把不是哈希引用的东西当作哈希引用来处理,所以它会抛出你看到的错误并杀死程序。因此,如果
$json_data
不是哈希引用,则需要知道它是什么。有几种方法可以做到这一点。1.您可以查看
players.json
文件的内容。如果该文件中的JSON数据是一个散列,它将以{
字符开始。1.您可以使用类似Data::Dumper的东西在程序中打印
$json_data
的转储。同样,作为哈希引用的数据结构将以{
开始。1.您可以使用
ref()
打印$json_data
是对-print ref $json_data
的引用。根据我的经验,JSON数据要么存储在哈希中,要么存储在数组中。我想你会发现两件事中有一件是真的。
players.json
不包含有效的JSON,因此对decode_json()
的调用失败,并且$json_data
未定义。players.json
包含一个数组,而不是一个散列。