Thread Uninitialised Value - Problem (8 answers)
Opened by Corni_Cornflake at 2017-08-30 14:46

Linuxer
 2017-08-30 17:55
#187313 #187313
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Soweit ich mich erinnere:

foreach( <$handle> ) bildet eine temporäre Liste, die dann durchwandert wird. Es wird also der Filehandle im Listenkontext ausgelesen und damit steckt die gesamte Datei dann im Arbeitsspeicher. Bei großen Dateien kann das problematisch werden.

while( <$handle> ) liest jeweils einmal aus dem Handle, bis beim Lesen irgendwann das Ende der Datei erreicht ist. Du hast also immer nur eine Zeile, bzw. Datensatz, im Arbeitsspeicher vorliegen.

Daher die Empfehlung, while() zu benutzen, um Dateien "zeilenweise" einzulesen.


Den split zum Tag-Abtrennen habe ich in der Tat nicht korrekt gelesen und interpretiert.


Ich meinte nicht, dass Dateien überschrieben werden, sondern die Arrays. Kleines Beispiel:
more (2.9kb):

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
#! /usr/bin/perl
use strict;
use warnings;
use 5.010;

my @arr;

# lese Daten zeilenweise aus DATA Sektion unten
while ( <DATA> ) { # oder auch mit foreach()
    # fuer jede Zeile wird @arr nun neu gefuellt, bzw. ueberschrieben 
    @arr = split m/\s+/, $_ ;
}

# Kontrolle
say "what is in \@arr: @arr";


__DATA__
a a a
b b b
c c c
d d d



Wenn die "Datei" hinter DATA nur eine Zeile hat, ist das nicht schlimm; die wird gelesen und gut ist.
Hier im Beispiel hat sie aber vier Zeilen und nur die letzte Zeile ist am Ende im Array dauerhaft gelandet, weil die Werte des Array @arr immer mit den Werten der jeweils gelesenen Zeile wieder überschrieben worden ist.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Uninitialised Value - Problem