Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7548[/thread]

Hash als Option missbrauchen (Seite 5)

Leser: 1


<< |< 1 2 3 4 5 6 7 8 ... 12 >| >> 119 Einträge, 12 Seiten
esskar
 2005-12-20 21:33
#60999 #60999
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=opi,20.12.2005, 20:25]Ich habe mich gegen die Schleife entschieden.
...
nicht in
jedem Fall ist eine Schleife von Nutzem.[/quote]
warum?
hast du das gefühl, dass eine schleife das ganze langsam macht?
wenn ja, dann ist es in diesem Fall unbegründet/vernachlässigbar
bloonix
 2005-12-20 21:52
#61000 #61000
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=steffenw,20.12.2005, 12:54]Wenn man die 1 nicht will, reicht auch undef. Dann wird nicht extra Speicher allociert, nur um da eine 1 hineinzupacken.[/quote]

[quote=esskar,20.12.2005, 20:33]
warum?
hast du das gefühl, dass eine schleife das ganze langsam macht?
wenn ja, dann ist es in diesem Fall unbegründet/vernachlässigbar[/quote]

Nun, ich dachte einfach, dass sich eine _extra_ Schleife für 6/11 Optionen,
die sowieso abgefragt werden müssen, nicht unbedingt lohnt. Aber ich
werde mir das nochmal durch den Kopf gehen lassen :-)
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-20 21:56
#61001 #61001
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=opi,20.12.2005, 20:52]Nun, ich dachte einfach, dass sich eine _extra_ Schleife für 6/11 Optionen,
die sowieso abgefragt werden müssen, nicht unbedingt lohnt. Aber ich
werde mir das nochmal durch den Kopf gehen lassen :-)[/quote]
es reduziert die codemenge, aber laufzeit und functionsaufrufe werden dadurch nicht wirklich beeinträchtigt!
bloonix
 2005-12-20 22:04
#61002 #61002
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=steffenw,20.12.2005, 12:54]
Code: (dl )
my $stats = Statistics(qw/ProcStats MemStats NetStats DiskStats DiskUsage/);
[/quote]

Das ist eine gute Idee. Nur was ist, wenn ich die Optionen doch irgendwann
mal auswerten möchte? Zum Beispiel ...

$stats = Statistics( Processes => root ); # zeige alle root-Prozesse

oder

$stats = Statistics( ProcStats => ProcCount ); # zeige nur die Anzahl aller Prozesse

Im Moment wäre deine Idee optimal, aber weiß nicht was die Zukunft
bringt, aber ich werde es mir durch den Kopf gehen lassen :)
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-20 22:09
#61003 #61003
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=esskar,20.12.2005, 20:56]es reduziert die codemenge, aber laufzeit und functionsaufrufe werden dadurch nicht wirklich beeinträchtigt![/quote]

Ihr habt ja recht :)

Das Einzige, was mich ein wenig stört, ist strict abzuschalten. Als ich mit
Perl angefangen hatte, wurde mir eingetrichtert, niemals auf strict und warnings zu verzichten und deshalb sträubt sich mein Gefühl bei dem
Gedanken, genau dies jetzt zu tun.

Wie verhält sich denn no strict 'refs' ? Bezieht es sich nur auf den
Namensraum der Schleife oder auf das gesamte Skript?
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.
steffenw
 2005-12-20 23:02
#61004 #61004
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
use warnings und use strict ist Pflicht!!! Daran rüttelt hier keiner.

Das sorgt schon mal dafür, daß Perl dann verlangt, daß Du Deinen Code verstehst und er nicht nur einfach funktioniert. Das könnte nach der nächsten Erweiterung ja schon ganz anders aussehen. Es ist auch so, daß man den Block { no strict '???'; spezielleAnweisung; } so kurz wie möglich halten sollte. Aber wenn man genau weiß, was man tun will, ist das auch in Ordnung. Strict soll einem helfen, aber niemals ein Hindernis sein. Sonst gäbe es die no ...-Anweisungen nicht.

Schreibst Du ähnlichen Code, der sehr gleichartige Konstrukte enthält, so wie Du das gerade gemacht hast, dann schreit das regelrecht nach einer Schleife/Aliasing. Blöd war nur die sub, stimmt schon, nur weil auch da der Name auf's Auge paßte, ging das gut mit symbolischen Referenzen. Man hätte auch einen helfenden Hash einsetzen können, um "no strict" zu verhindern, siehe:
Code: (dl )
1
2
3
4
5
6
7
8
my %hilfshash = (
name1 => sub{gleich_hingeschmierter_code},
name2 => \eine_vorhandene_sub,
);

for (qw/name1 name2/) {
 print "Der Name ist $_ und die Sub macht das: ", $hilfshash{$_}->('parameter_an_die_sub');
}


Arbeite erst dann mit Referenzen, wenn sie nötig sind, nicht gleich mal so. Verkompliziere Dein Programm nicht unnötig.

Ja die Listenübergabe mit den Namen schränkt natürlich ein. Aber sie verhindert nichts, denn Du kannst sie aufbohren. Wenn ein Scalar nicht reicht, baue da später an die Stelle eine Array- oder Hash-Referenz ein und schon kannst Du mehr als einen Wert einbauen, "ref $????" hilft dann bei der Erkennung, was da angeflattert kommt. Also ist so schon mal nichts verbaut.

Wenn vorher schon feststeht, daß viele Parameter mehrere Werte brauchen, dann ist es auch sonnvoll, erst einmal mit einer 1 als Hash-value anzufangen, um da später mal eine Referenz einzubauen. So wachsen Programme mit den Anforderungen. Hast Du einmal zu viel Flexibilität eingebaut, mußt Du sie immer mitschleppen. Fehlt sie Dir, kann man sie schnell nachrüsten, wir reden hier ja nicht über Java.

Das mit dem nicht lohnen einer Schleife hat 2 Gesichter. Klar, man muß sich erst einmal mehr Gedanken machen. Nur jedes Stück Code kann im Fehlerfall der Verursacher sein. Es ist recht einfach, später Fehler in kurzen Codestücken zu suchen. Man muß einfach weniger durchgehen. Wird der Code zu komplex, dann muß man abwägen ob man ihn schreibt oder ob man ihn incl. "fehlerunanfällige" Kommentare schreibt. Kann sein, daß es dann incl. Kommentar genau so viel Text ist, aber eben noch lange nicht so viel Code. Dann kommt noch eins dazu, komplexer Code muß nicht unperformant sein, meist ist es genau anders herum.

Ich sage das immer so:
Eine Hochsprache (Vergleich zum Maschinencode) sollte aus wenigen Hochsprachanweisungen immer viel Maschinencode erzeugen können. Dann kann dieser optimiert sein, weil man Freiheiten läßt. Schreibt man a=a+1, dann muß ein Register mit a geladen werden, und 1 dazuaddiert werden, danach muß das Ergebnis auf den Platz von a zurückgeschrieben werden. Daß a 2x vorkommt ist nicht typisch für so eine Addition, die also nicht unbedingt zu increment a optimiert werden kann. Das ist ein einfaches Beispiel. Denke da mal an %hash = map "Bild $_", (1..9, 10, 20), das könnte man auch mit for (my $i = 1; $i<=20; ++$i>=10 && $i +=10) programmieren, nur läßt man dann dem Compiler keine Wahl mehr, wie er was optimieren lassen kann. Du hast es dann exakt vorgeschrieben.\n\n

<!--EDIT|steffenw|1135113142-->
$SIG{USER} = sub {love 'Perl' or die};
bloonix
 2005-12-20 23:31
#61005 #61005
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Oh je. Zum Glück habe ich nicht das ganze Modul gepostet. Ich glaube,
ihr würdet es schlicht auseinander nehmen ;)

Da ich noch ein Anfänger bin, werde ich all eure Ratschläge ernst nehmen
und mir das Modul noch mal grundlegend anschauen und verbessern.

Wenn es nicht unverschämt ist, werde ich es irgendwann auch gerne mal
komplett Posten, um mir Verbesserungsvorschläge einzuholen.

Danke für deine ausführliche Beschreibung steffenw.
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.
renee
 2005-12-20 23:57
#61006 #61006
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Keine Angst, Du darfst ruhig Dein Modul hier posten. Wir sind sogar froh, wenn jemand etwas lernen will und "Verbesserungsmöglichkeiten" haben will.
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/
bloonix
 2005-12-21 00:53
#61007 #61007
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Oh Hilfe,

ich habe gerade folgendes versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w

use strict;

my %param = ( SysInfo => 1 );
my $stats = {};

for (qw/SysInfo/) { # nur zum Testen
no strict 'refs';
$stats->{$_} = &$_() if $param{$_};
}

sub SysInfo {
  open(FM,"</proc/meminfo") or die "LinuxStatistics: can't open /proc/meminfo\n";

  while (<FM>) {        # line 16
     # do something
  }

  close FM;
}


und bin auf einen Fehler gestoßen...

"Modification of a read-only value attempted at ./TestHash line 16."
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-21 01:44
#61008 #61008
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Also das ist aber seltsam!

Ist der Angle-Operator eine globale Variable? Nur so könnte ich mir die
Fehlermeldung erklären, da er ja in der Funktion SysInfo durch die while-
Schleife überschrieben wird.

Wenn ich nun entweder

foreach my $opt (qw/SysInfo/) { ...

oder

while (my $line = <FM>) { ...

einsetze, dann erhalte ich diesen Fehler nicht mehr.
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.
<< |< 1 2 3 4 5 6 7 8 ... 12 >| >> 119 Einträge, 12 Seiten



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