Leser: 1
![]() |
|< 1 2 3 >| | ![]() |
23 Einträge, 3 Seiten |
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
#!/usr/bin/perl use strict; use warnings; sub return_as_ref { my ( %A, %B, %C ); $A{1} = "Hugo"; $B{1} = "Schmitt"; $C{1} = "Vorsitzender"; my $Count = 1; return (\%A,\%B,\%C,$Count); } sub get_as_ref { my ($ref_A, $ref_B, $ref_C)=@_; $ref_A->{1} = "Hugo"; $ref_B->{1} = "Schmitt"; $ref_C->{1} = "Vorsitzender"; my $Count = 1; return $Count; } my $Anzahl; my (%A, %B, %C); my ($ref_A,$ref_B,$ref_C); ($rA,$rB,$rC,$Anzahl)=return_as_ref(); print "$ref_A->{1} $ref_B->{1} $ref_C->{1}\n"; # derefernzieren: %A=%{$ref_A}; %B=%{$ref_B}; %C=%{$ref_C}; print "$A{1} $B{1} $C{1}\n"; %A=(); %B=(); %C=(); $Anzahl=get_as_ref(\%A, \%B, \%C); print "$A{1} $B{1} $C{1}\n";
SchaubFD+2008-02-13 13:40:07--Das ist dann aber eine Lösung die nur über Referenzen läuft, nicht über einen Hash oder ? Ich frage mich immer noch, warum muss man diese unterschiedlichen Typen nutzen, um auf einen Hash zugreifen zu können?
( $a, $b, $c ) = ( 1, 2, 3 ) ;# => $a=1, $b=2 usw.
1 2 3 4 5 6 7
@x = ( x1, x2, x3 ); %y=( y1 => "Y1 ); ( $a, $b, $c ) = ( %y, $x, 1, 2, 3 ); # = ( y1, Y1, x1, x2, x3, 1, 2, 3) # => $a == "y1", $b == "Y1", $c == "x1"
1 2 3
($a,$b,@X,$c) = (%y,$x,1,2,3); # => @X = (x1,x2,x3,1,2,3) , $a = "y1", $b = "Y1", # => insbesondere $c = undef
( @X ) = ( @x )
( @X , @Y ) = ( @x , @y )
( $X_ref , $Y_ref ) = ( \@x , \@y )
1 2
@X = @$X_ref ; kopiert die Werte nach @X um *X = $X_ref ; legt ein Alias an, also \@X==\$X_ref
( *X , *Y , $A )=( \@x , \@y , $a)
Data::Alias dafür zusätzlich zu nutzen. ( $a , $b , $c , @X ) = ( @X )
%A = ( %A, %B, %C )
SchaubFD+2008-02-13 13:40:07--Auch wenn meine Fragen nervig sind, sind Übergaben von Hashes nur über Referenzen möglich?
\( %a , %b ) == ( \%a , \%b )
SchaubFD+2008-02-13 13:40:07--Auch wenn meine Fragen nervig sind, sind Übergaben von Hashes nur über Referenzen möglich?
HTML::Template verwendet habe. Was gewöhnungsbedürftig gelöst ist (und sich mit Perl6 ändert) ist die Verwendung von Sigils ($@%) bei der Dereferenzierung. Generell kann man über Sinn und Unsinn von Sigils diskuttieren, aber in Perl-Code erlauben sie recht zügig eine Einschätzung mit was man es gerade zu tun hat, was gerade in einer dynamisch typisierten Sprache manchmal recht hilfreich sein kann. Andere Sprachen wie z.B. Python kennen keine Variablen im klassischen Sinne, sondern ausschließlich Referenz-Typen. Eine Zuweisung bindet ein (meist unveränderbares) Objekt auf der rechten Seite des = an ein Symbol auf der linken Seite. Die Derefernzierung erfolgt aber implizit. Problematisch an dieser Stelle ist, wenn man größere Datenstrukturen zusammensetzt und nicht bedenkt, dass eine Änderung der Inhalte über alle Symbole möglich ist (speziell bei Listen). Fairerweise muss man aber sagen, dass man sich in Perl auf dem selben Wege auch in den Fuss schiessen kann. Um auf deine Ausgangsfrage zurück zu kommen: Meistens ist es sinnvoll, wenn man Funktionen hat die mehrere Hashes etc. verarbeiten/zurückliefern, die eigentliche Problemstellung nochmal zu analysieren und evtl. auf Objekte umzusteigen. Objektorientierte Programmierung hilft einem Dinge die zusammengehören auch zusammenzubehalten, sowohl Daten als auch Funktionen (die dann aber Methoden genannt werden).1 2 3 4
$A{1} = "Hugo"; $B{1} = "Schmitt"; $C{1} = "Vorsitzender"; my $Count = 1;
1 2 3 4 5 6 7
sub init_personen{ my @personen; $personen[0]{ vorname } = "Hugo"; $personen[0]{ nachname } = "Schmitt"; $personen[0]{ stellung } = "Vorsitzender"; return @personen; }
@copy_personen=init_personen();
1 2 3 4 5 6 7 8 9 10
sub init_personen{ my $p_ref=shift; $p_ref->[0]{ vorname } = "Hugo"; $p_ref->[0]{ nachname } = "Schmitt"; $p_ref->[0]{ stellung } = "Vorsitzender"; } my @alias; init_personen ( \@alias ); print $alias[0]{ nachname }
$$p_ref[0]{ vorname } = "Hugo";
1 2 3 4 5 6 7 8
sub init_personen ( \@ ) { my $p_ref=shift; $p_ref->[0]{ vorname } = "Hugo"; $p_ref->[0]{ nachname } = "Schmitt"; $p_ref->[0]{ stellung } = "Vorsitzender"; } init_personen( my @alias ) ;# Aufruf mit unsichtbarer impliziter Referenzierung
SchaubFD+2008-02-14 07:43:50--Wobei gerade diese für Anfänger eine enorme Erleichterung darstellen. Wenn man Referenzen vermeiden möchte bedeutet das bei komplexen Datenstrukturen (die offensichtlich vorliegen), dass du viele Verrenkungen machen musst, damit die Daten in einer vermeintlich einfachen Form vorliegen. Wie du ja selber und an den langen Erläuterungen gemerkt hast.Ich brauche den Index um später über die Hashes verschiedene Sortierungen durchführen zu können. Mehrdimensionale Hashes oder Kombinationen mit Listen wollte ich als Perl Anfänger vermeiden.
renee+2008-02-14 11:47:12--Ich habe perlreftut mal übersetzt: perlreftut
KurtZ+2008-02-14 11:48:01--Ich stell es mir schwer vor Hashes zu sortieren, verwechselst du da was mit Arrays?
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
sub lese_email
{
my @email;
my $satz;
my $datei="email.csv";
my $buf;
open(femail, "< $datei") or die "Kann Datei <$datei> nicht lesen!";
$satz=0;
$buf=<femail>; # Kopfzeile ignorieren - auslassen
while (<femail>) {
(
$email[$satz]{kostenstelle},
$email[$satz]{kostenstellenname},
$email[$satz]{kostentraeger},
$email[$satz]{kostentraegername},
$email[$satz]{konto},
$email[$satz]{kontoname},
$email[$satz]{email},
$email[$satz]{name}
)=split(';');
chomp($email[$satz]{name});
$satz++;
}
close femail;
return @email;
}
![]() |
|< 1 2 3 >| | ![]() |
23 Einträge, 3 Seiten |