Schrift
[thread]9160[/thread]

Array wird immer kleiner: bei der Iteration



<< >> 4 Einträge, 1 Seite
Jaque
 2007-07-06 10:47
#78249 #78249
User since
2007-05-26
8 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich hab als Bsp. zwei Dateien, der Inhalt ist eigentlich unwichtig.:
Datei_1:
svcd

Datei2:
szd

Ich oeffne alle (die Namen stehen in einem Array) und schreibe den Inhalt auf Console.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/local/bin/perl -w
use strict;
our @bundle = ("Datei_1", "Datei2");
for(@bundle){
print "at begining: @bundle\n";
read_my_file($_);
}

sub read_my_file{
open(MODULES, $_) or die "Can't open $_: $!\n";
print "in subroutine: @bundle","\n"x2;
#while(defined(my $line = <MODULES>)){print $line," @bundle\n"; } # geht
while(<MODULES>){print "In file: $_","My files: @bundle\n"; }
close(MODULES);
print "at end of sr: @bundle\n";
}

print "@bundle\n$#bundle\n";


Ausgabe:
at begining: Datei_1 Datei2
in subroutine: Datei_1 Datei2

In file: svcd
My files: svcd
Datei2
at end of sr: Datei2
at begining: Datei2
in subroutine: Datei2

In file: szd
My files: szd

at end of sr:

1
Warum wird mein Array dabei geleert?
Wie kommt die Ausgabe "My files" zustande?\n\n

<!--EDIT|Jaque|1183707028-->
renee
 2007-07-06 11:13
#78250 #78250
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du veränderst $_ in der Subroutine (in der while-Schleife). Dein Array wird nicht geleert, aber die Inhalte der Elemente werden "gelöscht".

Das hat damit zu tun, dass $_ bei while nicht lokalisiert wird. Ich empfehle Dir folgenden Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/local/bin/perl

use strict;
use warnings;

my @bundle = ("Datei_1", "Datei2");
for my $datei (@bundle){
    print "at begining: @bundle\n";
    read_my_file($datei);
}

sub read_my_file{
    my ($file) = @_;
    open(MODULES, '<', $file) or die "Can't open $file: $!\n";
    print "in subroutine: @bundle","\n"x2;    
    while(my $line = <MODULES>){print "In file: $line","My files: @bundle\n"; }
    close(MODULES);
    print "at end of sr: @bundle\n$#bundle\n";
}

print "@bundle\n";
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/
Jaque
 2007-07-06 13:12
#78251 #78251
User since
2007-05-26
8 Artikel
BenutzerIn
[default_avatar]
Also while veraendert $_ und weil das auf den Arrayeintrag zeigt, wird dort der Inhalt jeder Zeile der Datei eingefuegt.
Wahrscheinlich hab ich am Ende eine leere Zeile in den Dateien, deswegen besteht @bundle am Ende aus Leerzeichen (den zuletzt eingelesenen Zeilen).
Lokalisierung in der Subroutine wuerde das globale $_ ueberdecken und alles waere auch i. O.
Hoffe, ich habe das richtig verstanden.
Danke fuer die schnelle Antwort.
renee
 2007-07-06 13:17
#78252 #78252
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Im Grunde genommen hast Du es verstanden, nur hat es nichts mit einer leeren Zeile am Ende der Datei zu tun. Wenn die Datei fertig eingelesen wurde, steht in $_ ein undef - egal ob Leerzeile oder nicht...\n\n

<!--EDIT|renee|1183713749-->
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/
<< >> 4 Einträge, 1 Seite



View all threads created 2007-07-06 10:47.