Schrift
[thread]8705[/thread]

Problem mit Datei einlesen: Perl gibt nur Nummern aus



<< >> 7 Einträge, 1 Seite
TheDHK
 2007-01-31 17:58
#73890 #73890
User since
2007-01-19
37 Artikel
BenutzerIn
[default_avatar]
Hi Leute,
ich möchte eine XML-Datei einlesen. Diese ist so aufgebaut:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE profildtd SYSTEM "newsdtd.dtd">
<news>
<newsservice>
<name>AFP</name>
</newsservice>
<newsservice>
<name>ANSA</name>
</newsservice>
...
</news>


Dieses Skript besteht aus 46 Zeilen. Es ist so aufgebaut, dass die Anzahl der Zeilen - 4 durch drei teilbar ist. Daher habe ich folgendes Skript:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/perl -w
use strict;
use warnings;

our @av_news;

# Profil-Datei einlesen

my $rw = open(FILE,'E:\Eigene Dateien\Programme\Scrutator\news.xml');
our @news = <FILE>;


# Zeilen bestimmen
our $newslength = @news;

# XML-Datei darf nur bestimmte Länge haben

if(($newslength - 4) % 3 == 0) {
  # Zweite Zeile - Profilname  
  for(my $i = 4;$i < $newslength;$i += 3) {
    # Unnötiges abschneiden
    my $langstring = substr($news[$i],10);
    # Name ermitteln
    for(my $j = 0;$j < 8;$j++) {
      chop($langstring);
      }
    my $length = @av_news;
    $av_news[$length] = $langstring;
    }
} else {
  #...
}

close(FILE); 

1;


Wie ihr seht, überprüfe ich mit
Code (perl): (dl )
if(($newslength - 4) % 3 == 0)
, ob die oben genannte Bedingung erfüllt ist. Lasse ich nun @av_news; und @news; mit print() ausgeben, erhalte ich folgende Ausgabe:
14
46

Ich weiß auch woher diese Zahlen kommen: 46 ist die Anzahl der Zeilen. 46 - 4 = 42. 42 : 3 = 14. Allerdings sollte @news; die ganze Datei ausgeben und @av_news die zugeschnittenen einzelnen Zeilen.
Ich hab das vorher schon mit anderen XML-Dateien gemacht und da hatte ich noch keine ähnlichen Probleme.

Weiß jemand, wo hier das Problem liegt? Grüble schon seit Tagen darüber, aber egal was ich gemacht habe, nix hat gefunzt.

Gruß

TheDHK
PerlProfi
 2007-01-31 18:14
#73891 #73891
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Wozu brauchst du $rw?
Wiesos prüfst du nicht ob du die Datei überhaupt öffnen kannst?
An welcher Stelle im code hast du @news und @av_news ausgegeben?

Und ich glaube anstatt
Code: (dl )
1
2
    my $length = @av_news;
$av_news[$length] = $langstring;

meintest du
Code: (dl )
push @av_news, $langstring;
.

Kannst du mal gucken was passiert, wenn du noch ein print "Zeilen:\n@news\n"; nach dem Einlesen schreibst?

MfG PerlProfi
TheDHK
 2007-01-31 18:20
#73892 #73892
User since
2007-01-19
37 Artikel
BenutzerIn
[default_avatar]
Also wenn ich nach dem Einlesen die besagte print-Anweisung hinmache, gibt er mir die gesamte Datei aus...
Und bezüglich
Code (perl): (dl )
1
2
   my $length = @av_news;
   $av_news[$length] = $langstring;

Das ist so gemeint: Er soll überprüfen, wie viele Elemente @av_news hat und dann als neues Element $langstring anfügen. Oder ist das genau das, was push() macht?

Ausgeben tue ich @news und @av_news in einer anderen Datei, in die dich diese Datei als Modul eingebunden habe, also so:
Code (perl): (dl )
1
2
3
4
5
6
7
# ...
use import_news;
use vars qw(@av_news @news);

print @av_news."\n";
print @news."\n";
# ...


Sprich, die oben gepostete Datei heißt import_news.pm.

Gruß

TheDHK
Ronnie
 2007-01-31 18:37
#73893 #73893
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Warum verwendest du kein Modul, wie CPAN:XML::Parser oder CPAN:XML::Simple, um dein XML zu parsen?
PerlProfi
 2007-01-31 19:51
#73894 #73894
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Quote
Das ist so gemeint: Er soll überprüfen, wie viele Elemente @av_news hat und dann als neues Element $langstring anfügen. Oder ist das genau das, was push() macht?

Ja, push() hängt Elemente an das übergebene Array an.

Und bezüglich 46 und 13, schreib mal print @news, "\n"; anstatt von print @news."\n";.

Denn im skalaren Kontext, wird die Länge des arrays zurückgeliefert.
Du gibst also im Moment jeweils aus, wieviele Elemente das array hat.
Du willst aber die Elemente an sich ausgeben.
Also einfach mal . durch , ersetzen, oder das Array mit quoten.

MfG PerlProfi\n\n

<!--EDIT|PerlProfi|1170266103-->
renee
 2007-01-31 20:07
#73895 #73895
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du solltest auch Fehler abfangen:
Code: (dl )
open(FILE,'<','E:\Eigene Dateien\Programme\Scrutator\news.xml') or die $!;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
TheDHK
 2007-02-01 15:12
#73896 #73896
User since
2007-01-19
37 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,31.01.2007, 18:51]
Und bezüglich 46 und 13, schreib mal print @news, "\n"; anstatt von print @news."\n";.

Denn im skalaren Kontext, wird die Länge des arrays zurückgeliefert.
Du gibst also im Moment jeweils aus, wieviele Elemente das array hat.
Du willst aber die Elemente an sich ausgeben.
Also einfach mal . durch , ersetzen, oder das Array mit quoten.

MfG PerlProfi
[/quote]
Vielen Dank, jetzt funktionierts. Werde mir auch alle anderen Tipps von euch näher ansehen und evtl. einbauen.

Gruß

TheDHK
<< >> 7 Einträge, 1 Seite



View all threads created 2007-01-31 17:58.