2008-10-03 7 views
13

Die Frage ist nicht, wie man in einem oneliner erzählt. Wenn Sie den Code in einem Einzeiler schreiben, Sie wissen, Sie sind. Aber wie weiß ein Modul, das von -MMy::Module::Name enthalten ist, dass alles von einem oneliner angefangen hat.Was ist der beste Weg zu sagen, ob Ihr Perl auf -e läuft?

Das ist meins. Es ist nicht tragbar, obwohl und stützt sich auf UNIX-Standardbefehle (obwohl, kann es tragbar mehr oder weniger gemacht werden.)

my $process_info = `ps $$ | tail -1`; 
my $is_oneliner 
    = $process_info =~ m/perl.*?\s+-[^\P{IsLower}e]*e[^\P{IsLower}e]*\s+/m 
    ; 

Und wenn Sie eine snazzier regex haben, fühlen Sie sich frei auf meinem zu verbessern.


Ein paar Leute gefragt haben, warum ich dies tun möchte. Brian hat richtig geraten, dass ich das Exportverhalten ändern wollte, je nachdem, ob es sich um ein Skript handelt, von dem wir annehmen können, dass es etwas Design hatte, oder ob es ein Oneliner ist, bei dem der Benutzer so viel wie möglich in einer einzigen Befehlszeile versucht.

Das hört sich schlecht an, weil es dieses Credo gibt, dass Exporteure andere Pakete respektieren sollten - manchmal bekannt als "@EXPORT ist EVIL!" Aber es scheint mir, dass es eine törichte Konsistenz ist, wenn es auf Oneliner angewendet wird. Nachdem alles Perl sich aus dem Weg gemacht hat, die Struktur seiner Sprache zu verletzen und Ihnen einfache Schleifen zu geben, wenn Sie in der Befehlszeile nach ihnen fragen, möchte ich diese Idee einfach für meine operative/geschäftliche Domäne erweitern. Ich möchte sogar Quellfilter anwenden (keuchen!), wenn es hilft.

Aber diese Frage deutet auch darauf hin, dass ich auch ein guter Bürger von Perl sein möchte, weil ich nur in bestimmten Fällen die Gemeinschaftsrichtlinien brechen kann. Es ist ziemlich großartig, in der Lage zu sein, wichtige Geschäftsebenen-Aktionen zu erzeugen, indem einfach die Befehlszeile in einem Stapel-Scheduler geändert wird, anstatt ein ganz neues Modul zu schreiben. Der Testzyklus ist stark komprimiert.

+0

Warum sollte ein Modul jemals darauf achten, ob es auf diese Weise aufgerufen wurde? – moonshadow

Antwort

34

$0 ist auf "-e" eingestellt, wenn Sie von -e ausgeführt werden.

+1

D'oh! Ich habe viele Variablen ausgedruckt, aber das habe ich nicht gemacht! – Axeman

+0

Ich habe das in perlvar nicht gefunden, ist das irgendwo dokumentiert? – Axeman

+4

Es ist wahrscheinlich nur in der Quelle dokumentiert. :) Aber ich denke, dass es für eine sehr lange Zeit wahr ist. –

10

Warum versuchen Sie herauszufinden, ob das Modul von der Befehlszeile enthalten war? Gibt es eine Situation, in der du dich entscheidest? Machen Sie etwas Ungewöhnliches mit Importen? Sagen Sie uns, was Sie versuchen zu tun, und ich kann wahrscheinlich mit einem besseren Weg, um es zu tun :)


Okay, Sie über den Export sind gefragt. Was ist das Problem, das du lösen willst? Welchen Weg willst du es? Extra oder weniger Standardexporte von der Kommandozeile? Wissen Sie, dass Sie eine Importliste mit -M angeben können, einschließlich eines Export-Tags (also etwas von% EXPORT_TAGS)? Wenn Sie eine leere Exportliste wünschen, können Sie stattdessen -m (Kleinbuchstaben m) verwenden. Siehe den Eintrag für -M/-m in perlrun.

Sie könnten auch interessiert sein an dem "Modulino" Trick, wo eine Moduldatei sowohl ein Modul als auch ein Skript sein kann. Sie können es entweder als normales Modul verwenden. In diesem Fall haben Sie Zugriff auf alle Methoden oder nennen es als Skript. In diesem Fall wird es ausgeführt. Ich beschreibe es in meinem "Scripts as Modules" Artikel für Das Perl Journal sowie "How a Script Becomes a Module" auf Perlmonks.

+0

Ja, das ist es im Grunde. -e erhält mehr Exporte als genau definierte Skripte, die zumindest einen entworfenen Bauraum vorgeben. Ich bin nicht ganz so besorgt darüber, die Hauptsache eines Oneliner zu respektieren. – Axeman

+0

Brian: Die in deinem "modulino" Artikel präsentierten Ideen sind/unglaublich/nützlich. Es rät von "Hacky" -Skripten ab und bietet sofortige Wiederverwendbarkeit. Liebe es, und ich werde vorschlagen, es zu oder interne Kodierungsrichtlinien Montag hinzufügen - Eines der Probleme, die wir haben, ist Skripte neigen dazu, ... – Dan

+0

... beginnen klein und leicht hackish, langsam zu einer unhandlichen Größe wachsen , früher oder später wird diese Funktionalität woanders benötigt, so dass das ganze Chaos Refactoring benötigt (was selten reibungslos abläuft). Dies sollte das Problem vollständig beseitigen. – Dan

1

In Ihrer import(), die Zeilennummer von caller() zurück 0 sein wird, wenn das Modul über -M geladen wurde. Das ist wahr wann immer -M verwendet wird (mit -e oder nicht), aber ich denke, es ist der einzige Fall, wo die Zeilennummer 0 ist.

+0

perl -le '# line 0' -e'sub {print join ":", Aufrufer} ->() ' – ysth

+0

perl -le' # Zeile 1 '-e'sub {print join ":", Aufrufer} - >() ' –

1

Wenn Sie ein anderes Exportverhalten wünschen, verwenden Sie einen anderen Modulnamen als "sauberen" Weg. Wenn Sie wirklich viel Einliner-Einsatz erwarten, können Sie ihm sogar einen kurzen Namen geben. Z.B. MMN.pm:

package MMN; 
use My::Module::Name '/./'; 
use Exporter(); 
@ISA = 'Exporter'; 
@EXPORT = @My::Module::Name::EXPORT_OK; 
1; 

Beachten Sie, dass Exporter eine wenig bekannte Regex-Funktion hat; Vielleicht möchten Sie nur tun

perl -MMy::Module::Name=/./ -e ... 
+0

Ich weiß nicht, dass das so sauber ist, aber ich habe bereits ein Schema, um die Namen für den Aufruf der Befehlszeile zu verkürzen., – Axeman

Verwandte Themen