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.
Warum sollte ein Modul jemals darauf achten, ob es auf diese Weise aufgerufen wurde? – moonshadow