Schrift
[thread]7100[/thread]

Bestimmte Keys in anderen Hash kopieren



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Damokles
 2005-07-04 17:08
#55959 #55959
User since
2005-06-28
7 Artikel
BenutzerIn
[default_avatar]
Hallo ich habe da mal ne Frage.

In meinem Programm muss ich öfter eine Reihe von keys von einem Hash in den anderen kopieren. Ich habe schon eine Funktion geschrieben, die so etwas macht, wollte aber fragen, ob es auch einfacher geht. Man sollte die keys nur einmal angeben müssen.

Meine Funktion wird so benutzt.

hashCopyByKey(\%target,\%source,qw(some keys);
Code: (dl )
1
2
3
4
5
6
7
8
sub hashCopyByKey {
 my $target = shift;
 my $source = shift;
 my @keys = @_;
 foreach (@keys){
   $target->{$_} = $source->{$_} if $source->{$_};
 }
}


Ich weiß, das auch
Code: (dl )
@{%Target}{qw(some keys)} = @{%Source}{qw(some keys)};
geht aber, mir währe das verhalten meiner Funktion lieber.
Irgendeine Idee?
Strat
 2005-07-04 17:21
#55960 #55960
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
mit exists $hash{$key} ueberpruefst du, ob ein key vorhanden ist
Code: (dl )
$target->{$_} = $source->{$_}  if exists $source->{$_};

mit deinem code wuerden z.B. values von "" oder 0 oder undef nicht kopiert...
Code: (dl )
1
2
3
my $target = shift;
my $source = shift;
my @keys = @_;

kannst du zusammenfassen zu:
Code: (dl )
my ($target, $source, @keys) = @_;

(wobei ich da eher source vor target verwenden wuerde, weil es IMHO intuitiver ist, kopiere von nach zu sagen als kopiere nach von:
Code: (dl )
1
2
copy source target
hashCopyByKey(\%source, \%target, qw(...));

eine einfachere loesung faellt mir jetzt nicht ein\n\n

<!--EDIT|Strat|1120483447-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2005-07-04 17:37
#55961 #55961
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
in c ist es umgekehrt
Code: (dl )
char *strcpy( char *strDestination, const char *strSource );


man weißt ja auch immer der linken seite, den wert der rechten seite zu...

aber dachdecker machen es sowieso wieder ganz anders
ptk
 2005-07-04 21:08
#55962 #55962
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Genuegt flaches Kopieren oder musst du Datenstrukturen duplizieren? Im letzteren Fall solltest du noch zusaetzlich Storable::dclone() o.ae. verwenden.
Strat
 2005-07-04 22:43
#55963 #55963
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=esskar,04.07.2005, 15:37]in c ist es umgekehrt
Code: (dl )
char *strcpy( char *strDestination, const char *strSource );
[/quote]
da sieht man wieder mal, wie wenig intuitiv C ist :)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2005-07-05 01:07
#55964 #55964
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ja aber es ist ja auch

Code: (dl )
$dest = $source;


und selbst bei bäumen
Code: (dl )
= ($dest, $source)
Ronnie
 2005-07-05 02:24
#55965 #55965
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Das ist ein uraltes Problem bei Assembler-Programmen, worüber ich mir schon vor Jahren die Haare gerauft habe. Motorola hat bei MOV-Befehlen die Reihenfolge Quelle -> Ziel verwendet, Intel verwendete Ziel <- Quelle. Jedesmal wenn man z.B. von 68HC11 zu 8085 wechselte hat man eine handvoll Fehler gebaut, aufgrund dessen das man die Richtung durcheinander gebracht hat.
Strat
 2005-07-05 12:45
#55966 #55966
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@esskar: das sind ja auch funktionsaufrufe, und lassen sich imho nicht mit $ziel = $quelle vergleichen...
zuweisungen liest man von rechts nach links, und einen funktionsaufruf von links nach rechts, von daher finde ich den c-weg nicht intuitiv.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-07-05 13:13
#55967 #55967
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Find ich auch. Das musste ich sogar öfter zur Vergewisserung nachsehen, als ich intensiv C programmiert habe, weil es einfach unintuitiv ist.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Damokles
 2005-07-05 15:28
#55968 #55968
User since
2005-06-28
7 Artikel
BenutzerIn
[default_avatar]
Hm wie ich sehe hat niemand eine wirklich andere idee.

@strat danke für die Hinweise
@ptk es reicht flaches kopieren, aber donake für den Hinweis

So noch was zu allgemeinen diskussion.

Wie wärs mit push() und co. da wird das Ziel auch zuerst angegeben.
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-07-04 17:08.