Leser: 25
S Wed Aug 01 2007 10:39:48:577 secinfo accepted: USER=MUSTER, USER-HOST=host1.wdf.sap.corp, HOST=ld8061.wdf.sap.corp, TP=/usr/sap/BIN/SYS/exe/run/tp
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
%Host_Records = { TP_RECORDS => %APP, ERRORS => @ERROR_LIST, }; if(defined $Host_Records{$hostname}) { #aktualisieren print "Aktualisiere...\n"; if(defined $Host_Records{$hostname}->{TP_RECORDS}{$TP}) { print "Existiert bereits...\n"; } }#if else { #Neu Anlegen $Host_Records{$hostname} = $hostname; $Host_Records{$hostname}->{TP_RECORDS}{$TP} = $TP; if($_ =~ /\d\d:\d\d:\d\d:\d\d\d secinfo denied/) { print "Fehler!\n"; push @{(Host_Records{$hostname}->{ERRORS}, $_)}; print $Host_Records{$hostname}->{ERRORS}[0]; }#ERROR #print $Host_Records{$hostname}->{TP_RECORDS}{$TP}; #print "\n"; }#else
push @{(Host_Records{$hostname}->{ERRORS}, $_)};
push @{Host_Records{$hostname}->{ERRORS}}, $_);
push @{ $Host_Records{$hostname}->{ERRORS} }, $_;
1 2 3 4 5 6 7 8
use Data::Dumper; my %hash; my $hostname = "test"; if (defined $hash{ $hostname }) { } print Dumper \%hash; __END__ $VAR1 = {};
2010-02-26T13:26:59 GwenDragonDa ist mein Tipp ja nicht so ganz korrekt, exists verwenden zu müssen.
1
2
3
4
5
6
7
8
9
10
11
12
$ perl -MData::Dumper -wle 'my %a; print defined $a{1}{2}; print Dumper \%a;'
$VAR1 = {
'1' => {}
};
$ perl -MData::Dumper -wle 'my %a; print exists $a{1}{2}; print Dumper \%a;'
$VAR1 = {
'1' => {}
};
2010-02-26T13:51:53 LinuxerHast Du Deine Aussage zuvor mal kontrolliert?
1 2 3 4 5 6 7 8 9
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %hash; if (exists $hash{a} && exists $hash{a}{b}) {} print "Case 1 without autovivication:\n" , Dumper \%hash; if (exists $hash{a}{b}) {} print "Case 2 with autovivication:\n" , Dumper \%hash;
1 2 3 4 5 6 7 8 9 10 11
my %hash = ( key1 => undef, ); if ( exists $hash{key1} ) { print "Key1 existiert\n"; } if ( defined $hash{key1} ) { print "Key1 ist definiert\n"; }
2010-02-26T15:17:26 sid burn"exists" testet ob der key existiert. "defined" prüft ob der value des Keys definiert ist oder nicht, zwei unterschiedliche dinge.
2010-02-26T15:17:26 sid burnLol. Schön, dass auch andere (langjährige) Programmierer über sowas noch staunen.Allerdiengs bin ich auch irgendwie davon ausgegangen das der defined test dann einen key anlegt, und wundere mich warum er das nicht tut.
2010-02-26T15:26:04 GwenDragonJa, weiß ich doch, dass defined den Wert des Keys prüft, während exists schaut, ob der Key existent ist. So ganz dusselig bin ich ja nun nicht. ;)
QuoteHmm. Ich hatte jahrelang im Kopf, dass es sinnvoll ist, zum Testen der Existenz eines Hashelements exists zu verwenden. Falsch gelernt. *grübel*.
QuoteLol. Schön, dass auch andere (langjährige) Programmierer über sowas noch staunen. Ein typischer Fall von perltrap oder ein Bug?
1 2 3 4 5 6
Ich habe noch eine Frage zum Dumper: %Host_Records = ( TP_RECORDS => %APP, ERRORS => @ERROR_LIST, );
print Dumper $Host_Records{$key};
1
2
3
4
5
6
7
8
my %tiere = (); # leerer hash
my %katzen = (
garfield => 'doof', # mit Werten
);
$tiere{katzen} = \%katzen;
print $tiere{katzen}->{garfield}; # man bemerke den Pfeil nach {katzen}
2010-02-26T12:17:14 pktmMehr Infos zu Referenzen: perlreftut
2010-02-26T12:18:59 pktmstimmt. hab nicht mit 2 fehlern gerechnet. :-)Müssten da nicht runde Klammern sein?
2010-02-26T15:47:10 topeg
So sollte das richtiger Weise aussehen.