tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Enumerator
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
1376
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    perl-fan perl-fan ist offline Mitglied
    Registriert seit
    Mar 2009
    Ort
    Rostock
    Beiträge
    11
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    #!/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!
     

  2. #2
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    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():
    Code Perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #!/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
    perl-fan bedankt sich. 
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  3. #3
    perl-fan perl-fan ist offline Mitglied
    Registriert seit
    Mar 2009
    Ort
    Rostock
    Beiträge
    11
    Super, Danke!
     

  4. #4
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Erledigt?!
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  5. #5
    perl-fan perl-fan ist offline Mitglied
    Registriert seit
    Mar 2009
    Ort
    Rostock
    Beiträge
    11
    Oh stimmt ja.
     

Ähnliche Themen

  1. LOAD DATA INFILE funktioniert nicht
    Von Kalito im Forum PHP
    Antworten: 4
    Letzter Beitrag: 18.01.11, 11:52
  2. Antworten: 2
    Letzter Beitrag: 08.09.10, 17:32
  3. [Perl]Auslesen von Content-Type multipart/form-data
    Von Nugorra im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 20.08.09, 12:40
  4. Remote connection auf MSSQL Server funktioniert nicht mit Perl
    Von Sylan im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 04.09.07, 19:41
  5. cgi, perl funktioniert nur teilweise****?
    Von robertino im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 3
    Letzter Beitrag: 06.08.03, 21:48