2015-07-02 3 views
8

Ich bin sehr neu in Perl, und vor kurzem das folgende Problem aufgetreten. Mein Perl-Code muss sich alle in einer einzigen Datei befinden (er wird von einem anderen Programm aufgerufen, auf das ich keinen Einfluss habe). Ich möchte jetzt das Skript mit einem Flag (z. B. perl myscript.pl -T für Taint-Modus) ausführen, obwohl es zunächst ohne das Flag aufgerufen wird. Wie kann ich das tun, d.h. wie setze ich das Flag innerhalb der Perl-Datei?Making Perl-Skript * selbst ausführen * mit Flags

Eine Idee, die ich je hatte, die Datei Start selbst wieder zu machen (nach ohne Fahnen genannt wird), diesmal mit dem -T Flag (durch einen Shell-Befehl wie system($^X, "myscript.pl -T", @ARGS); Ausgabe). Funktioniert das? Irgendwelche besseren Ideen?

+3

wenn Sie 'myscript steuern .pl' können Sie den Taint-Modus einstellen, indem Sie Ihre Shebang-Linie so ändern, dass sie zB '-T' enthält '#!/usr/bin/env perl -T ' –

+0

Welcher Befehl wird verwendet, um das Skript im anderen Programm aufzurufen? Wenn es etwas wie '/ path/to/myscript.pl' ist, kannst du einfach' -T' zur Shebang-Zeile hinzufügen. – ThisSuitIsBlackNot

+4

ein '-T' in der Shebang-Zeile aktiviert nicht unbedingt den Taint-Modus - wenn das Skript mit' Perl' von der Shell ohne '-T' aufgerufen wird, erhalten Sie einen fatalen Fehler – mob

Antwort

5

Ich denke, du bist auf dem richtigen Weg.

exec($^X, $0, '-T', @ARGV) if $^{TAINT} < 1; 

Das wird nicht funktionieren in allen Fällen: Sie können den $^{TAINT} variabel und exec statt system machen. Für eine Sache, werden Sie einige andere Befehlszeilenoptionen verlieren, die Ihr Skript könnte zunächst mit aufgerufen werden:

perl -I/path/to/some/more/libs -w -MNecessary::Module myscript.pl ... 

Es gibt einige Workarounds, um einige dieser (use warnings oder fügen Sie -w Schalter auf Ihrem exec Aussage oben, analysieren @INC und %INC zu bestimmen, was -I und -M Switches hinzugefügt wurden), aber je mehr Sie erfahren können, genau wie Ihr Skript aufgerufen wird, desto mehr können Sie herausfinden, welche Problemumgehungen Sie sich sorgen machen müssen.

Abhängig von der ... Gruppendynamik spielt hier eine andere Herangehensweise eine indirekte Steuerung des aufrufenden Programms aus. Gehen Sie voran und setzen Sie -T auf die Shebang-Linie als @Hunter McMillen und @ ThisSuitIsBlackNot vorschlagen, warten auf einen Fehlerbericht, und dann diagnostizieren das Problem als "Programm nicht mit -T-Schalter aufgerufen" ...

+0

Leider scheint dies bei mir nicht zu funktionieren, höchstwahrscheinlich aufgrund der Probleme, die Sie erwähnt haben. Das Setzen des -T auf die Shebang-Linie erzeugt den folgenden Fehler: _ "- T" ist auf dem #! Zeile, muss es auch in der Befehlszeile verwendet werden_ – mike622867