Schrift
[thread]7548[/thread]

Hash als Option missbrauchen (Seite 3)

Leser: 1


<< |< 1 2 3 4 5 6 ... 12 >| >> 119 Einträge, 12 Seiten
esskar
 2005-12-19 15:01
#60979 #60979
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
dann bleibt dir eigentlich nur dies
Code: (dl )
1
2
3
sub Statistics {   
my %param = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
}


wenn @_ nicht wie ein Hash aussieht, dann stirbt das script eh mit einem fehler, dass die zuweisung nicht hinhaut!
bloonix
 2005-12-19 17:25
#60980 #60980
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
ok, das scheint nicht so einfach zu sein, dass @_ Array auf seine Werte zu
prüfen ... ich hatte vorher nicht so ganz verstanden, wie Perl die Argumente
an eine Funktion übergibt und gerade gelesen, dass => als Kommaersatz
dient.

Wenn ich also - angenommen - prüfen möchte, dass mir auf jeden Fall ein
Hash und keine Referenz übergeben wird, dann könnte ich doch wie folgt
vorgehen:

Code: (dl )
1
2
3
4
5
6
7
sub Statistics {
  for (@_) {
     warn "Bad argument $_" if ref $_;
  }
}

Statistics( 'Key','Value',{ 'Key1' => 'Value1','Key2' => 'Value2' },[ 'Value1','Value2' ] );


aber dann bleibt noch folgendes Problem offen:

Code: (dl )
1
2
3
4
5
6
7
8
9
sub Statistics {
  for (@_) {
     die "Bad argument $_" if ref $_;
  }

  my %param = @_; # line 10
}

Statistics( 'Key1','Value2','Key2' );


"Odd number of elements in hash assignment at ./testsub line 10."

Kann ich diese Warnung irgendwie abfangen, so dass das Skript stirbt?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Taulmarill
 2005-12-19 17:31
#60981 #60981
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
du kannst mit dem modulo-operator (%) prüfen, ob die anzahl der elemente von @_ gerade oder ungerade ist.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
esskar
 2005-12-19 17:41
#60982 #60982
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Taulmarill,19.12.2005, 16:31]du kannst mit dem modulo-operator (%) prüfen, ob die anzahl der elemente von @_ gerade oder ungerade ist.[/quote]
modulo und 2 ... na na na ... wie wäre es mit & 1 ?
bloonix
 2005-12-19 18:05
#60983 #60983
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,19.12.2005, 16:41][quote=Taulmarill,19.12.2005, 16:31]du kannst mit dem modulo-operator (%) prüfen, ob die anzahl der elemente von @_ gerade oder ungerade ist.[/quote]
modulo und 2 ... na na na ... wie wäre es mit & 1 ?[/quote]
was wäre gegen modulo einzuwenden und was meinst du mit & 1 ?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2005-12-19 18:15
#60984 #60984
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
wäre was gegen

Code: (dl )
die "Not enough arguments" if (@_ / 2) =~ /\./;


einzuwenden?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
esskar
 2005-12-19 18:18
#60985 #60985
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ganz einfach

modulo rechnung kostet geld.
es ist aber schön zu wissen, dass der computer zahlen als bit zahlen abspeichert.

also
0 => 0
1 => 1
2 => 10
3 => 11
4 => 100
5 => 101
6 => 110
7 => 111

man sieht also, dass eine ungerade zahl immer das erste (bzw. letzte - je nach dem von wo man schaut) bit gesetzt hat. ob dieses bit gesetzt ist kann man mit & 1 testen ( was wesentlich schneller als modulo rechnung ist)

also
Code: (dl )
1
2
3
4
for (1 .. 10) {
my $var = int(rand(100000)) + 1;
print "$var ist ", (($var & 1) ? "ungerade" : "gerade"), "\n";
}
Crian
 2005-12-19 18:34
#60986 #60986
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Ja, und für dich und mich ist & 1 genauso lesbar wie ein Test auf modulo 2. Oder besser ;) Aber nicht für jeden, deshalb würd ich es - außer bei Flaschenhälsen - nicht für schlimm halten, modulo zu verwenden.
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
bloonix
 2005-12-19 18:59
#60987 #60987
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
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
#!/usr/bin/perl -w

use strict;
use Data::Dumper;

sub Statistics {

  my %param;

  if (ref $_[0] eq 'HASH') {
     %param = %{$_[0]};
  }
  elsif (@_ & 1) {
     die 'Not enough arguments';
  }
  else {
     %param = @_;
  }

  print Dumper(%param);
}

Statistics( 'Key1','Value1','Key2','Value2' );

my $hashref = {
  'Key1' => 'Value1',
  'Key2' => 'Value2',
};

Statistics( $hashref );


Jo, ich habs. Klappt beides, obwohl man sich eventuell noch über die
Syntax streiten könnte :-)

Danke für die Hilfe.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
esskar
 2005-12-19 19:09
#60988 #60988
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
klar klappt beides.
hab ja nicht behauptet, dass modulo nicht funktionieren würde.

@pq: poste mal deine benchmarks :p
<< |< 1 2 3 4 5 6 ... 12 >| >> 119 Einträge, 12 Seiten



View all threads created 2005-12-19 02:24.