Schrift
[thread]8474[/thread]

Hash von arrays



<< >> 6 Einträge, 1 Seite
Noisebreath
 2006-11-05 18:50
#71440 #71440
User since
2006-04-14
72 Artikel
BenutzerIn
[default_avatar]
Habe mitbekommen dass man in perl kein hash von arrays erzeugen kann, sondern nur von arrayreferenzen.
Ich weiss daher nicht wie ich mein PRoblem lösen kann immer wieder ein neues array zu erzeugen dessen referenz ich in jedem weiteren durchlauf meiner schleife an den hash übergeben kann

Code: (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
37
38
39
40
41
42
43
44
sub Doc_type_header{
open(DATEI, "<./Konfigurationsdaten/20060310.DOCFIELD") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);

my $doc_type_header = shift;
my $dokuart;
my $zahl2;
my $old_doc;
my @headerarr;
#Gehe Zeilen der Docfielddatei durch

foreach (@Zeilen){

if (/([\w\$]+)\;(\d+)\;(\d+)\;/){
$dokuart = $1;
$zahl2 = $3;

if(!defined $old_doc){
$old_doc = $dokuart;
}

#wenn dokuart nicht mehr die gleiche wie im letzten durchlauf der froeach-
#schleife speichere eine kopie des hashs in hash2 mit key alte dokuart und
#leere danach wieder den hash um ihn für die nächste dokuart neu füllen zu können.
if($dokuart ne $old_doc){
$doc_type_header->{$old_doc}= \@headerarr;
my @headerarr =();
}

#gehe Zeilen der Repository durch und speichere zahl und header in hash
open(DATEI, "<./Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
my @Zeilen2 = <DATEI>;
close(DATEI);

foreach(@Zeilen2){
if(/^$zahl2;([^;]+);([^;]+)/){
push(@headerarr.$i,$2);
}
}
}
$old_doc = $dokuart;
}
}



kann mir jemand sagen wie ich das machen kann? im moment habe ich immer nur eine arrayreferenz die ich dauernd ueberschreibe, aber ich möchte natürlich das alle verschiedenen arrayinfos in den hash gespeichert werden und nicht nur die eine referenz.
Relais
 2006-11-05 19:06
#71441 #71441
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit \@headerarr nimmst Du tatsächlich immer wieder eine Referenz auf dasselbe Array.
Mit [ @headerarr ] anstelle dessen nimmst Du immer wieder eine neue Referenz auf ein neues Array mit dem aktuellen Inhalt vom Array @headerarr - das war, was Du suchtest, oder?

(ich bin müde und hab bestimmt wieder was übersehen =))

Mehr Info dazu steht in
perllol
perldsc
perlref
perlreftut
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Relais
 2006-11-05 19:09
#71442 #71442
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei my @headerarr =(); ist mindestens das "my" zuviel, denn es betrifft ein neues @headerarr ...
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Noisebreath
 2006-11-05 19:13
#71443 #71443
User since
2006-04-14
72 Artikel
BenutzerIn
[default_avatar]
lösung zb:
habs jetzt mal so gelöst


Code: (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
37
38
39
40
41
42
43
44
45
46
47
48
sub Doc_type_header{
open(DATEI, "<./Konfigurationsdaten/20060310.DOCFIELD") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);

my $doc_type_header = shift;
my $dokuart;
my $zahl2;
my $old_doc;
my @arr;
my $ref = \@arr;
#Gehe Zeilen der Docfielddatei durch

foreach (@Zeilen){

if (/([\w\$]+)\;(\d+)\;(\d+)\;/){
$dokuart = $1;
$zahl2 = $3;

if(!defined $old_doc){
$old_doc = $dokuart;
}

#wenn dokuart nicht mehr die gleiche wie im letzten durchlauf der froeach-
#schleife speichere eine kopie des hashs in hash2 mit key alte dokuart und
#leere danach wieder den hash um ihn für die nächste dokuart neu füllen zu können.
if($dokuart ne $old_doc){

$doc_type_header->{$old_doc}= $ref;
my @arr2;
$ref = \@arr2;
}

#gehe Zeilen der Repository durch und speichere zahl und header in hash
open(DATEI, "<./Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
my @Zeilen2 = <DATEI>;
close(DATEI);

foreach(@Zeilen2){
if(/^$zahl2;([^;]+);([^;]+)/){
push(@$ref,$2);
}
}
}
$old_doc = $dokuart;
}

}
topeg
 2006-11-05 23:18
#71444 #71444
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
So würde ich das machen:
(wobei ich nicht weiß warum du "$doc_type_header" übergibst, das kannst du doch mit "return $doc_type_header" oder gar "return %doc_type_header" zurückliefern)
Code: (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
sub Doc_type_header
{
my $doc_type_header = shift;
my $conf_docfield='./Konfigurationsdaten/20060310.DOCFIELD';
my $conf_responsitory='./Konfigurationsdaten/20060310.REPOSITORY';

open(DATEI, '<', $conf_docfield) or die "Fehler beim öffnen ($!)";
my @Zeilen = <DATEI>;
close(DATEI);

my $old_doc;
#Gehe Zeilen der Docfielddatei durch
foreach (@Zeilen)
{
if (/([\w\$]+)\;(\d+)\;(\d+)\;/)
{
my $dokuart = $1;
my $zahl2 = $3;

if($dokuart ne $old_doc)
{
open(DATEI, '<', $conf_responsitory) or die "Fehler beim öffnen ($!)";
my @Zeilen2 = <DATEI>;
close(DATEI);

my @tmp=();
foreach(@Zeilen2)
{ push(@tmp,$2) if(/^$zahl2;([^;]+);([^;]+)/); }
$doc_type_header->{$dokuart}=\@tmp;
$old_doc = $dokuart;
}
}
}
}
\n\n

<!--EDIT|topeg|1162761791-->
renee
 2006-11-06 09:23
#71445 #71445
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum erst die Zeilen in ein Array lesen, um dann eine foreach-Schleife zu machen? Da ist es Speicherschonender und übersichtlicher, mit einer while-Schleife zu arbeiten:
Code: (dl )
1
2
3
4
5
6
7
     my @tmp;
open(DATEI, '<', $conf_responsitory) or die "Fehler beim öffnen ($!)";
while(my $line = <DATEI>){
push(@tmp,$2) if(/^$zahl2;([^;]+);([^;]+)/);
}
my @Zeilen2 = <DATEI>;
close(DATEI);
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/
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-05 18:50.