2013-04-04 13 views
5

Problema: Windows XP non sta passando gli argomenti della riga di comando agli script perl.

Sintomo: un semplice comando come:

say "Argument 1 (\$ARGV[0]) is: $ARGV[0], argument 2 (\$ARGV[1]) is: $ARGV[1]."; 

stata:

Use of uninitialized value $ARGV[0] in concatenation (.) or string at... 

Soluzione:

Il problema principale è in Windows XP. Il metodo predefinito per l'avvio di perl passa solo la prima variabile, che è il nome dello script. Il risultato è che $ ARGV [0] non è inizializzato.

La correzione è quello di modificare il registro di Windows in:

\HKEY_CLASSES_ROOT\Perl\shell\Open\command 

E fare la voce:

"C:\Perl\bin\perl.exe" %* 

risultato è:

C:\whatever>perl argtest.pl 1 2 
Argument 1 ($ARGV[0]) is: 1, argument 2 ($ARGV[1]) is: 2. 

Grazie soprattutto a David W che ha sottolineato io nella giusta direzione.

+0

Il tutorial collegato non è di alta qualità. Non ha nemmeno "usare rigorosamente". – simbabque

+1

Humor me: prova 'argtest 1 2 3' e guarda cosa succede. –

+1

Ho provato il tuo codice (Perl 5.16.2 su Mac OS X 10.7.5, abbastanza lontano dalla tua piattaforma), e con 'x.pl 1 2', ho ottenuto l'uso del valore non inizializzato in concatenazione (.) O stringa alla riga x.pl 5.' e all'output 'Argomento 0: 1, argomento 1: 2, argomento 2: .' Mi chiedo se il tuo Perl ti sta fuorviando (anche se il tuo output è coerente con' $ ARGV [0 ] 'non inizializzato). Ricorda, '$ 0' contiene il nome dello script; '$ ARGV [0]' contiene il nome del primo argomento dello script. –

risposta

0

Nel nome file perl non fa parte dell'array di argomenti. Almeno nel test ho fatto è necessario rimuovere ARGV[2] o passare tre argomenti, come argtest 1 2 3

+0

Risultati di argtest 1 2 3: Uso del valore non inizializzato $ ARGV [0] in concatenazione (.) O stringa in C: ecc. Nessuna modifica. – user2246544

+0

DWIM è basato su perl Strawberry, se questo aggiunge qualcosa. Questo è così semplice che non vedo come possa essere correlato a DWIM. Non mi interessa davvero quello che perl uso, ma sarò davvero incazzato se cambio in ActiveState e non è diverso. – user2246544

2

noti che @ARGV in Perl non è abbastanza come argv in C.

       C   Perl 

Name of the program  argv[0]  $0 
1st argument    argv[1]  $ARGV[0] 
2nd argument    argv[2]  $ARGV[1] 
n-th argument    argv[n]  $ARGV[n-1] 

Quindi, se si fornisce argomenti della riga di un comando a uno script Perl, sarà trovato in $ARGV[0]. $ARGV[1] non sarà inizializzato.

1

Ci sono due modi in cui Windows sa che si suppone che usi Perl per eseguire un programma.

  1. La riga di comando inizia con l'eseguibile perl e il nome dello script da eseguire viene fornito come argomento della riga di comando. Funziona così anche su Unix e altri ambienti.
  2. Il sistema associa uno o più interni, ad esempio .pl, .pm e/o .cgi con l'applicazione Perl, e Windows avvierà Perl quando si digita un nome file con una di queste estensioni o si fa clic su un file con uno di questi estensioni in Esplora risorse di Windows.

Hai invocato lo script semplicemente come

argtest 1 2 

e non uno dei

perl argtest 1 2 
argtest.pl 1 2 

Questo mi fa pensare che Perl non è la prima applicazione che arriva a guardare il file di cui a da argtest.Forse c'è un file chiamato argtest.bat o argtest.exe che ha il compito di ottenere da Perl l'esecuzione del codice Perl. Per qualche ragione questo programma intermedio non sta passando gli argomenti della riga di comando che tu fornisci all'applicazione Perl.

Fornire il codice per questo file intermedio e possiamo aiutarne altri.


UPDATE: David W propone una terza via - impostare la variabile PATHEXT ambiente .pl file inclue e invocando argtest dalla riga di comando - vedere la sua risposta. Poi, se un'associazione di file della finestra con l'estensione .pl era incasinato, ad esempio, impostare come solo C:\Dwimperl\perl\bin\perl "e non" C:\Dwimperl\perl\binperl %* ", allora l'OP otterrebbe il comportamento che egli descrive.

+0

l'utente ha detto in uno dei commenti che ha provato 'perl argtest.pl HELP!' E ha ottenuto lo stesso risultato – imran

+0

Sì, l'ho eseguito da "perl argtest.pl HELP!" e ha ottenuto gli stessi risultati. – user2246544

+0

In realtà, hai detto che il risultato dell'esecuzione di 'perl argtest.pl HELP!' Era che '$ ARGV [1]' non era inizializzato, non '$ ARGV [0]'. In realtà sembra che funzioni come dovrebbe. – mob

1

Scarica Cygwin e testare il codice nel Cygwin Ambiente. Scommetto che questo è un problema di Windows. (Se sei un capo Unix, ti piacerà Cygwin perché ti dà l'ambiente Unix/Linux sulla tua macchina Windows. Io non uso Windows senza.)

Windows utilizza i suffissi per determinare quale programma apre i file. Lo script Perl è denominato argtest, argtest.bat o argtest.pl?

Su Windows, assicurarsi che tutti gli script Perl utilizzino il suffisso *.pl, quindi Windows utilizzerà qualsiasi parametro Perl per eseguirli. Windows non utilizza shebang.

Un altro possibile problema: In Windows XP, ho avuto un problema con gli script Perl con i parametri perché Windows ha avuto questo come una stringa di esecuzione:

perl %1 

che eseguire il programma Perl con il mio script, ma ignorare il parametri. Ho dovuto cambiare questo:

perl %* 

Purtroppo, Windows Vista attraverso Windows 8 ha cambiato il modo in cui questo viene impostato. Tuttavia, ho Windows 7 e non ho questo problema. Mi sono assicurato di installare Perl sotto C:\Perl e non su C:\Program Files\Perl a causa dello spazio nel nome della directory. Ho anche installato Strawberry Perl.

C'è una speciale variabile di ambiente Windows denominata PATHEXT. Ciò consente di digitare foo anziché foo.pl. Se Windows non riesce a vedere come eseguire il file, Windows passa attraverso %PATHEXT e tenta di aggiungere vari suffissi finché non ne trova uno che funzioni. È possibile aggiungere .PL a tale variabile di ambiente, quindi è possibile digitare foo anziché foo.pl in qualsiasi momento.

+0

Grazie, non sapevo su% PATHEXT% '. Se OP 'PATHEXT' è impostato, e se la sua associazione per i file '.pl' è solo' perl' e non 'perl% 1' o' perl% * ', ciò potrebbe spiegare i suoi problemi. – mob

Problemi correlati