Schrift
[thread]6237[/thread]

Hashwerte vergleichen: wahr oder nicht?

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
mordur
 2004-05-07 11:05
#82068 #82068
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

in einem Hash steht:

%hash=(a=>1,b=>2,x=>1);

Ich will das Hash durchsuchen und wenn ein Hashwert mehr als einmal vorkommt, wie oben, soll eine 1 oder true ausgegeben werden, sonst passiert nix.

wie kann ich das anstellen?
ronald
 2004-05-07 11:18
#82069 #82069
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
my %hash=(a=>1,b=>2,x=>1);
my %hsah;
while (my ($key, $val) = each %hash) {
$hsah{$val}++;
}
while (my ($key, $val) = each %hsah) {
next if $val == 1;
print "$val mal: $key\n";
}
renee
 2004-05-07 11:37
#82070 #82070
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
die erste while-Schleife würde ich ersetzen durch:
Code: (dl )
1
2
3
foreach my $val(values(%hash)){
$hsah{$val}++;
}
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/
mordur
 2004-05-07 11:40
#82071 #82071
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
danke
Taulmarill
 2004-05-07 12:20
#82072 #82072
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
just my two cents...

Code: (dl )
1
2
3
4
5
6
7
8
9
sub test_hash {
my $hashref = shift;
my %hash;
foreach ( values %{$hashref} ) {
$hash{$_}++;
return 1 if $hash{$_} > 1;
}
return 0;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-05-07 16:57
#82073 #82073
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
sub test_hash {
    my $hr = shift;
    my %h;
    return 1 if ++$h{$_} > 1 for values %$hr;
    return 0;
}


ungetestet...

Edit: Mist, funktioniert nicht... aber 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
#!/usr/bin/perl
use strict;
use warnings;

my %Hash = ( a => 1,
            b => 2,
            c => 3,
          );
my %HasH = ( a => 1,
            b => 2,
            c => 1,
          );

print test_hash(\%Hash), "\n";
print test_hash(\%HasH), "\n";

sub test_hash {
   my $hr = shift;
   my %h;
   for (values %$hr) {return 1 if ++$h{$_} > 1}
   return 0;
}


Gibt aus:

Code: (dl )
1
2
0
1


Naja, keine Überrauschung ;)


Edit2: Dies hier

Code: (dl )
    ++$h{$_} > 1 ? return 1 : print "" for values %$hr;


schluckt er und es funktioniert auch, aber das ist häßlich (und lahm). Warum wag er die

### if ### for ###;

Form nicht? *grmbl* ;-)\n\n

<!--EDIT|Crian|1083935230-->
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
betterworld
 2004-05-07 19:00
#82074 #82074
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
return scalar(@{[%hash]}) == scalar(@{[%{{reverse %hash}}]}) ? 0 : 1;\n\n

<!--EDIT|betterworld|1083942476-->
Ishka
 2004-05-07 19:02
#82075 #82075
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@betterworld: Ich glaube, daß diese Lösung nicht ganz funktionieren dürfte..
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Ishka
 2004-05-07 19:12
#82076 #82076
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
ok, jetzt schon - aber wenn schon so ein rungehacke, dann ein kurzes mit weniger Sonderzeichen:

return keys %hash == keys %{{reverse %hash}} ? 0 : 1;
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Crian
 2004-05-07 20:13
#82077 #82077
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
meinst Du values vorn?
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
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2004-05-07 11:05.