Как я могу изящно перебрать хеш-ключ-значение, сгенерированный из JSON, содержащий значения, установленные как 'undef' и 'null'?

Я запрашиваю ответ json третьей стороны, и иногда значения полей буквально равны "undef" или "null". Если я попытаюсь распечатать ключ и значение каждого объекта в этом файле json, то при появлении значения undef он выдаст ошибку неинициализированного значения.

Есть ли что-то, что я могу добавить к начальному декодированию $json->, чтобы изменить эти null/undefs на то, что может обрабатывать perl? Или, может быть, он просто исключает пары значений, которые имеют значение null / undef, из $json_text?

my $json_text = $json->decode($content);

foreach my $article(@{$json_text->{data}->{articles}}){
      while (my($k, $v) = each ($article)){
        print "$k => $v\n";
      }
}

3 ответа

Решение

$_ // "" переведу undef значения в пустую строку,

my $json_text = $json->decode($content);

foreach my $article (@{$json_text->{data}->{articles}}) {
      while (my($k, $v) = map { $_ // "" } each %$article) {
        print "$k => $v\n";
      }
}

Так как вы используете версию Perl, которая позволяет each Для применения к хеш- ссылке вы также можете использовать оператор //,

Выражение как a // b оценивает a если a определяется, в противном случае b,

Вы можете использовать это так.

my $json_text = $json->decode($content);

for my $article (@{$json_text->{data}{articles}}) {
  while (my ($k, $v) = each $article) {
    printf "%s => %s\n", $k, $v // 'null';
  }
}

Пытаться printf "%s => %s\n", $k || "empty", $v || "empty";

или даже

$k ||= "empty";
$v ||= "empty";
print "$k => $v\n";
Другие вопросы по тегам