2015-07-02 18 views
8

Sono molto nuovo in Perl e ho riscontrato di recente il seguente problema. Il mio codice Perl deve risiedere all'interno di un singolo file (viene chiamato da un altro programma di cui non ho il controllo). Ora desidero eseguire lo script con un flag (ad esempio, perl myscript.pl -T per la modalità taint), sebbene inizialmente venga chiamato senza il flag. Come posso farlo, cioè come faccio a "impostare il flag" all'interno del file Perl?Creazione di script Perl * esecuzione automatica * con flag

Un'idea che ho avuto è quello di rendere il lancio di nuovo file stesso (dopo essere stato chiamato, senza bandiere), questa volta con la bandiera -T (mediante l'emissione di un comando di shell come system($^X, "myscript.pl -T", @ARGS);). Funzionerebbe? Qualche idea migliore?

+3

se controlli 'myscript .pl' puoi impostare la modalità di contaminazione modificando la tua linea di shebang per includere '-T' ad es '#!/usr/bin/env perl -T' –

+0

Quale comando viene usato per invocare lo script nell'altro programma? Se è qualcosa come '/ path/to/myscript.pl', puoi semplicemente aggiungere' -T' alla linea shebang. – ThisSuitIsBlackNot

+4

un '-T' nella riga shebang non abilita necessariamente la modalità taint - se lo script è invocato con' perl' dalla shell senza '-T', si ottiene un errore irreversibile – mob

risposta

5

Penso che tu sia sulla strada giusta. Si può fare uso della variabile $^{TAINT}, e exec invece di system:

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

Questo non funziona in tutti i casi. Per prima cosa, si perde alcune altre opzioni della riga di comando che lo script potrebbe inizialmente essere chiamato con:

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

Ci sono alcune soluzioni ad alcuni di questi (use warnings o aggiungere -w interruttore al vostro exec dichiarazione di cui sopra, analizzare @INC e %INC per determinare quali switch -I e -M sono stati aggiunti), ma più è possibile conoscere esattamente come viene chiamato il tuo script, più è possibile capire quali soluzioni temporanee è necessario preoccuparsi.


A seconda delle dinamiche di gruppo ... in gioco qui, un altro approccio è quello di esercitare un certo controllo indiretto del programma chiamante. Vai avanti e inserisci -T nella riga shebang come @Hunter McMillen e @ThisSuitIsBlackNon suggerisci, attendi un bug report e poi diagnostica il problema come "programma non invocato con -T switch" ...

+0

Purtroppo, questo non sembra funzionare per me, molto probabilmente a causa dei problemi che hai menzionato. L'inserimento di -T sulla riga shebang produce il seguente errore: _ "- T" è sul #! linea, deve essere usato anche sulla riga di comando_ – mike622867

Problemi correlati