Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5915[/thread]

Länge eines Arrays im Hash: herausfinden

Leser: 2


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
pktm
 2003-11-19 22:13
#72192 #72192
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Ich habe ein Array in einem Hash.
Ich hätte jetzt gerne die Länge dieses Arrays.
Mein Versuch:
Code: (dl )
print $navs{1}[scalar( @{ $navs{$_} } ) ]);


geht nicht so ganz.... ich erhalte weder Ausgabe noch Fehler.
Dachte, ich könnte über das Array-Slice (so nennt man doch das @{} ?) das Array ansprechen.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Ronnie
 2003-11-19 22:40
#72193 #72193
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wie sieht den die Struktur aus, wenn du sie mit Data::Dumper ausgibst? Außerdem stimmt da was mit den Klammers nicht. Zeig mal noch ein wenig Kontext.
Ronnie
 2003-11-19 23:28
#72194 #72194
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
vieleicht hilft dir folgendes Beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my @items = qw( Toothbrush Bluetooth Sabretooth Blues Dixie );
my $referer = { 'items' => \@items };

print scalar(@{$referer->{'items'}});
print "\n";


Das ganze nur mit Hash:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my @items = qw( Toothbrush Bluetooth Sabretooth Blues Dixie );
my %referer = ( 'items' => \@items );

print scalar(@{$referer{'items'}});
print "\n";


Hoffe das hilft!
pktm
 2003-11-19 23:34
#72195 #72195
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Also ich benutze das um die Zeilen eines Codesegments in einer Datei festzustellen, damit ich die später überschreiben kann.

Die Werte füge ich so hinzu:
push @{ $navs{$navcnt} }, $cnt;
Ausgabe mit Dumper:
$VAR1 = '1'; $VAR2 = [ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88 ]; $VAR3 = '2'; $VAR4 = [ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135 ];
mfg pktm

PS: wens interssiert:
Ich habe eine html-Datei in der es mehrere Navigationsleisten geben kann.
Diese ist Bestandteil eines CMS und sollte dann entsprechend geändert werden, wenn der Benutzer dem CMS Seiten hinzufügt oder entfernt.
Ich muss also die Navigation auslesen, löschen und die neue Ainfügen.
Dazu muss ich wissen, wo sich die aktuellen Navs befinden (es kann mehrere geben, horizontal & vertikal, z. B. links und unten).
D.h. ich durchlaufe die Seite so:
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
    my $vPattern = '<!-- navigation_vertikal --><!-- diese Kommentare nicht entfernen! -->';
my $hPattern = '<!-- nav_h --><!-- diese Kommentare nicht entfernen! -->';
my $vPatternEnde = '<!-- /navigation_vertikal --><!-- diese Kommentare nicht entfernen! -->';
my $hPatternEnde = '<!-- /nav_h --><!-- diese Kommentare nicht entfernen! -->';

my @template = extractFile( $main_template );
my $flag = 0; # 0 = init, 1 = vfound, 2 = hfound,
my %navs = ();
my $navcnt = 0;
for my $cnt ( 0 .. $#template ) {
if( $template[$cnt] =~ m/$vPattern/ig or $flag == 1) {
print "v-fopund!<br />\n" if $flag == 0;
$navcnt++ if $flag == 0;
$flag = 1;
push @{ $navs{$navcnt} }, $cnt;
if( $template[$cnt] =~ m/$vPatternEnde/ig ) {
$flag = 0;
print "v-found-ende<br />\n";
}
}
if( $template[$cnt] =~ m/$hPattern/ig or $flag == 2) {
print "h-found!<br 7>\n" if $flag == 0;
$navcnt++ if $flag == 0;
$flag = 2;
push @{ $navs{$navcnt} }, $cnt;
if( $template[$cnt] =~ m/$hPatternEnde/ig ) {
$flag = 0;
print "h-found-ende<br />\n";
}
}
} # for my $cnt ( 0 .. $#template ){}
print Dumper( %navs );
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2003-11-19 23:59
#72196 #72196
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
my %data = ( 
key1 => [ 1..5 ],
key2 => [ 6..20 ],
);
print "Laenge key1: ", scalar(@{ $data{key1} }), "\n";
print "Letzer Index: ", $#{ $data{key1} }, "\n";
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pktm
 2003-11-20 18:29
#72197 #72197
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Geht immernochnicht.
Also ich habe einen Hash der als Keys die Anzahl der gefundenen (gesuchten) Textstellen in einer Datei enthält.
Als Value ist ein Array mit allen Zeilen angegeben, wo sich diese Textstelle in der Datei befindet.
z.B.:
Code: (dl )
1
2
3
my $navs = (
1 => qw(1 2 3 4 5),
);


Jetzt muss ich an den letzten Wert des Arrays rankommen.
$navs{$_}[ scalar(@{ $navs{$_} }) ] geht es nicht.
Dabei spreche ich doch
1. den aktuellen Key im Hash an (beim durchlauf): $navs{$_}
2 und den letzten Array-Wert $navs{$_}[ LETZTERARRAYWERT ]
Wobei LETZTERARRAYWERT die Indexnummer scalar(@{ $navs{$_} }) hat.
Und wieso geht das dann nicht?
http://www.intergastro-service.de (mein erstes CMS :) )
Ronnie
 2003-11-20 18:38
#72198 #72198
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wie wäre es, für die Array Größe mit:
Code: (dl )
print scalar(@{$navs->{$_}});


Was den letzten Index betrifft, hat Strat oben was gepostet. Ich setzt mich aber nochmal dran...\n\n

<!--EDIT|Ronnie|1069346490-->
Ronnie
 2003-11-20 18:45
#72199 #72199
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Aber jetzt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my @items = qw( Toothbrush Bluetooth Sabretooth Blues Dixie );
my $referer = { 'items' => \@items };

print "Groesse Array: ", scalar(@{$referer->{'items'}}), "\n";
print "Letztes Element: ", ${ $referer->{'items'} }[$#{ $referer->{'items'} }],"\n";


hilft das weiter? Du hast vergessen noch einmal zu dereferenzieren.

den Schluss noch ein wenig aufgedrösselt:
Code: (dl )
1
2
3
my $position = $referer->{'items'};
my $lastitem = $#{ $position };
print "Letztes Element: ", ${ $position }[ $lastitem ],"\n";
\n\n

<!--EDIT|Ronnie|1069347268-->
pktm
 2003-11-20 21:20
#72200 #72200
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Muss ich denn unbedingt mit Referenzen arbeiten?\n\n

<!--EDIT|pktm|1069356221-->
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2003-11-21 14:05
#72201 #72201
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=pktm,20.11.2003, 20:20]Muss ich denn unbedingt mit Referenzen arbeiten?[/quote]
wenn du ein array in einem hash haben willst, bleibt dir nichts anderes übrig.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2003-11-19 22:13.