[Perl]: DATA und JSON funktioniert nicht


perl-fan

Grünschnabel
Hallo,
ich versuche gerade ein Object mittels decode_json aus dem __DATA__ Teil vom Skript zu instanzieren. Da das später mehrmals geschehen soll mit verschiedenen Objecten stelle ich mit seek() die Position immer wieder zurück. Nur leider bekomme ich immer eine Fehlermeldung sobald ich versuche die Daten zu decoden. Wenn ich seek() weglasse funktioniert es.
Hier ein Beispiel:
Code:
#!/usr/bin/perl

use JSON;

sub retrieve {
    seek(DATA, 0, 0);
    return decode_json(join("", <DATA>));
}

my $data = retrieve();

__DATA__
{"a":"ALPHA","b":[1,2,3,4,5]}
Vielen Dank schonmal!
 

Enumerator

Mitglied Kamel
Hi!

Hast Du die Fehlermeldung mal genau studiert? Da dürfte so etwas wie "#!/usr/bin/perl sieht nicht nach JSON aus" 'drin stehen... Die Ursache liegt darin, dass DATA kein Handle auf den Bereich nach __DATA__ ist, sondern auf die gesamte Datei:
Du übernimmst das Handle direkt vom Parser, welcher stoppt sobald er __DATA__ "gesehen" hat. Deswegen brauchst Du seek() auch nicht aufzurufen wenn Du die Daten nur einmal einliest. Weil Du aber DATA mit seek() auf Position 0 setzt, behandelt Dein Code die gesamte Datei als JSON-String und meckert.

Abhilfe schafft hier tell():
Perl:
#!/usr/bin/perl

use strict;
use warnings;

use JSON::XS qw(decode_json);
use Data::Dumper();

my $TOLD = tell(DATA);

sub retrieve {
    seek(DATA, $TOLD, 0);
    return decode_json(join("", <DATA>));
}

my $data = retrieve();
print Data::Dumper->Dump([$data]);

__DATA__
{"a":"ALPHA","b":[1,2,3,4,5]}
Gruß
Enum
 

Neue Beiträge