2010-03-17 12 views
9

In „Perl Best Practices“ die erste Zeile im Abschnitt über die AUTOLOAD ist:Wann sollte ich AUTOLOAD von Perl verwenden?

AUTOLOAD Verwenden Sie keine

jedoch alle Fälle, die er mit OO oder Module handelt beschreibt.

Ich habe ein eigenständiges Skript, in dem einige Befehlszeilenschalter steuern, welche Versionen bestimmter Funktionen definiert werden. Jetzt weiß ich, ich könnte einfach die Bedingungen und die Evals nehmen und sie oben an meiner Datei vor allem anderen kleben, aber ich finde es bequem und sauberer, sie in AUTOLOAD am Ende der Datei zu setzen.

Ist das schlechte Praxis/Stil? Wenn Sie so denken warum, und gibt es einen anderen Weg, es zu tun?

Per Brians Anfrage

Ich verwende diese im Grunde die bedingte Kompilierung zu tun, basierend auf Befehlszeilenschalter.

Ich habe nichts gegen konstruktive Kritik.

+1

Ein Beispiel für das, was Sie tun, würde die Diskussion verbessern. :) –

Antwort

1

Wenn der einzige Grund für die Verwendung AUTOLOAD ist, den Block bis zum Ende zu verschieben, warum nicht am Ende in ein Unterprogramm einfügen und dann aufrufen, sobald seine abhängigen Variablen definiert sind?

sub tcpdump; # declare your subs if you want to call without parens 

# define the parameters 

compile(); 

# code that uses new subs 

sub compile { 
    *tcpdump = $tcpdump ? sub { 
     my $msg = shift; 
     warn gf_time()." Thread ".threads->tid().": $msg\n"; 
    } : sub {}; 
    # ... 
} 
# EOF 

Noch besser ist es, wenn die Globals nicht anderweitig benötigt, geben Sie einfach die Werte zu compile als Argumente.

+0

@Eric Strom: Also fühlst du, das ist besser Stil und sauberer als die 'AUTOLOAD'? Es scheint praktisch identisch mit dem zu sein, was ich mit 'AUTOLOAD' mache, außer dass ich' compile' explizit am Anfang des Programms aufrufen muss. Warum ist das besser, als implizit "AUTOLOAD" aufzurufen, wenn eine Funktion zum ersten Mal aufgerufen wird? Sehr interessante Lösung, da ich die '* name = sub {...}' -Syntax vorher noch nicht gesehen hatte. –

+1

@Robert S.Barnes => "AUTOLOAD" bringt ein bisschen Gepäck mit sich: die Komplikationen mit Vererbung, Geschwindigkeit, die es erfordern, dass die Subs als Methoden aufgerufen werden. Das sind alles notwendige Übel, wenn Sie etwas tun, das wirklich "AUTOLOAD" benötigt, aber wenn nicht, könnte es nur eine Fehlerquelle sein. Am besten, die einfachste Lösung zu machen, die funktioniert. Durch die Verwendung der anon-Subsyntax anstelle von string eval kann Perl Fehler zur Kompilierungszeit statt zur Laufzeit erkennen. –

6

Ich denke, für ein eigenständiges Skript ist dieser Ansatz in Ordnung. Sie können Subroutinen on the fly erstellen nachfolgende Aufrufe zu beschleunigen, z.B .:

sub AUTOLOAD { 
    (my $name = our $AUTOLOAD) =~ s/.*:://; 
    no strict 'refs'; # allow symbolic references 

    *$AUTOLOAD = sub { print "$name subroutine called\n" };  
    goto &$AUTOLOAD; # jump to the new sub 
} 

Autoloading heikel ist, wenn Vererbung Bäume produzieren.

7

Eine alternative Strategie wäre, das Skript als ein App :: * Modul zu schreiben und die Befehlszeilenoption auszuwählen, welche Klasse geladen werden soll, um die Funktionalität bereitzustellen, die abhängig von der Option steckbar ist. Sie würden require diese Klasse Just-in-Time sobald Sie wissen, was es ist. Es ist ein bisschen mehr Arbeit im Voraus, aber wenn Sie vorhaben, das Skript für eine lange Zeit zu behalten, wette ich, es würde sich auszahlen. In den letzten paar Jahren wurden einige besonders nützliche Tools zum Erstellen von Skripts entwickelt, deren Funktionalität wirklich in Modulen lebt, einschließlich , MooseX::Getopt und the bastard offspring of both.

+0

Klingt interessant und lohnt sich auschecken, obwohl ich denke, dass es für das, was ich tue, Overkill sein könnte. Es handelt sich nur um ein Skript mit 500 Zeilen. –

+0

500 ist wohl etwa 450 zu viel. :) – hobbs

Verwandte Themen