2013-04-04 6 views
5

Problem: Windows XP übergibt Befehlszeilenargumente nicht an Perl-Skripts.

Symptom: einen einfachen Befehl wie:

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

in Resultierte:

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

Lösung:

Das Root-Problem in Windows XP ist. Die Standardmethode zum Starten von Perl übergibt nur die erste Variable, nämlich den Skriptnamen. Das Ergebnis ist, dass $ ARGV [0] nicht initialisiert ist.

Das Update ist der Windows-Registry auf bearbeiten:

\HKEY_CLASSES_ROOT\Perl\shell\Open\command 

und den Eintrag machen:

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

Ergebnis ist:

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

Dank besonders an David W, der darauf hinwies ich in die richtige Richtung.

+0

Das Tutorial, das Sie verlinkt haben, ist nicht sehr hochwertig. Es hat nicht einmal "verwenden streng". – simbabque

+1

Humor mich: Versuch 'argtest 1 2 3' und schau was passiert. –

+1

Ich habe versucht, Ihren Code (Perl 5.16.2 unter Mac OS X 10.7.5; ziemlich weit von Ihrer Plattform entfernt), und mit 'x.pl 1 2', habe ich' Verwendung von nicht initialisierten Wert in Verkettung (.) Oder Zeichenfolge bei x.pl Zeile 5.' und der Ausgabe 'Argument 0: 1, Argument 1: 2, Argument 2: .' Ich frage mich, ob dein Perl dich irreführt (obwohl deine Ausgabe konsistent mit $ ARGV [0 ist ] nicht initialisiert sein. Denken Sie daran, '$ 0' enthält den Namen des Skripts; '$ ARGV [0]' enthält den Namen des ersten Arguments für das Skript. –

Antwort

0

In perl Dateiname ist nicht Teil des Arrays von Argumenten. Zumindest im Test habe ich Sie müssen ARGV[2] entfernen oder drei Argumente übergeben, wie argtest 1 2 3

+0

Ergebnisse von argtest 1 2 3: Verwendung von nicht initialisierten Wert $ ARGV [0] in Verkettung (.) Oder Zeichenfolge bei C: usw. Keine Änderung. – user2246544

+0

DWIM basiert auf Strawberry Perl, wenn das etwas hinzufügt. Dies ist so grundlegend, ich sehe nicht, wie es mit DWIM verwandt sein kann. Es ist mir egal, welchen Perl ich benutze, aber ich werde wirklich sauer sein, wenn ich zu ActiveState wechsele und es ist nicht anders. – user2246544

2

Beachten Sie, dass @ARGV in Perl ist nicht ganz wie 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] 

Also, wenn Sie ein Befehlszeilenargument liefern zu einem Perl-Skript wird es in $ARGV[0] gefunden werden. $ARGV[1] wird nicht initialisiert.

1

Es gibt zwei Möglichkeiten, wie Windows weiß, dass es Perl zum Ausführen eines Programms verwenden soll.

  1. Die Befehlszeile beginnt mit der ausführbaren Datei perl und der Name des auszuführenden Skripts wird als Befehlszeilenargument bereitgestellt. So funktioniert es auch unter Unix und anderen Umgebungen.
  2. Ihr System ordnet eine oder mehrere Erweiterungen wie .pl, .pm und/oder .cgi der Perl-Anwendung zu, und Windows startet Perl, wenn Sie einen Dateinamen mit einer dieser Erweiterungen eingeben oder auf eine Datei mit einer dieser Erweiterungen klicken Erweiterungen im Windows Explorer.

Sie Ihr Skript einfach aufgerufen haben als

argtest 1 2 

und nicht einer von

perl argtest 1 2 
argtest.pl 1 2 

Das hat mich denken lässt, dass Perl nicht die erste Anwendung, die in der Datei suchen wird bezeichnet zu durch argtest.Vielleicht gibt es eine Datei mit dem Namen argtest.bat oder argtest.exe, die die Aufgabe hat, Perl zum Ausführen Ihres Perl-Codes zu bekommen. Aus irgendeinem Grund übergibt dieses Zwischenprogramm die von Ihnen bereitgestellten Befehlszeilenargumente nicht an die Perl-Anwendung.

Geben Sie den Code für diese Zwischendatei ein und wir können Ihnen weitere Hilfestellung geben.


UPDATE: David W schlägt einen dritten Weg - die PATHEXT Umgebungsvariable inclue .pl Dateien einstellen und argtest von der Kommandozeile aufrufen - siehe seine Antwort. Dann, als nur C:\Dwimperl\perl\bin\perl „und nicht“ C:\Dwimperl\perl\binperl %* "wurde, wenn Fenster des Dateizuordnung mit der .pl Erweiterung vermasselt, sagen wir, setzen dann würde die OP das Verhalten bekommen, dass er beschreibt.

+0

Benutzer hat in einem der Kommentare gesagt, dass er versuchte 'perl argtest.pl Hilfe!' Und bekam das gleiche Ergebnis – imran

+0

Ja, ich habe es von "perl argtest.pl HILFE!" und bekam die gleichen Ergebnisse. – user2246544

+0

Eigentlich sagten Sie das Ergebnis der Ausführung von 'perl argtest.pl HELP!' War, dass '$ ARGV [1]' nicht initialisiert wurde, nicht '$ ARGV [0]'. Das klingt tatsächlich so, als würde es so funktionieren, wie es soll. – mob

1

Herunterladen Cygwin und Ihren Code testen in der Cygwin Ich wette, das ist ein Windows-Problem. (Wenn Sie ein Unix-Kopf sind, werden Sie Cygwin mögen, weil es Ihnen die Unix/Linux-ähnliche Umgebung auf Ihrem Windows-Rechner gibt. Ich benutze Windows nicht ohne es.)

Windows verwendet Suffixe, um zu bestimmen, welches Programm welche Dateien öffnet.Ist Ihr Perl-Skript argtest, argtest.bat oder argtest.pl?

Stellen Sie unter Windows sicher, dass alle Ihre Perl-Skripts das Suffix *.pl verwenden. Daher wird Windows den jeweiligen Perl-Parameter verwenden, um sie auszuführen. Windows verwendet das shebang nicht.

Ein weiteres mögliches Problem: Unter Windows XP hatte ich ein Problem mit Perl-Skripten mit Parametern, da Windows diese als Ausführungszeichenfolge hatte:

perl %1 

, die das Perl-Programm mit meinem Skript ausführen würde, aber ignoriere die Parameter. Ich musste dies ändern in:

perl %* 

Leider hat Windows Vista bis Windows 8 geändert, wie dies festgelegt ist. Ich habe jedoch Windows 7 und habe dieses Problem nicht. Ich stellte sicher, Perl unter C:\Perl und nicht C:\Program Files\Perl wegen des Raumes im Verzeichnisnamen zu installieren. Ich habe auch Strawberry Perl installiert.

Es gibt eine spezielle Windows-Umgebungsvariable namens PATHEXT. Damit können Sie foo anstelle von foo.pl eingeben. Wenn Windows nicht sehen kann, wie Sie Ihre Datei ausführen, geht Windows durch %PATHEXT und versucht, verschiedene Suffixe anzuhängen, bis es einen findet, der funktioniert. Möglicherweise möchten Sie diese Umgebungsvariable mit .PL anhängen, sodass Sie die ganze Zeit foo anstelle von foo.pl eingeben können.

+0

Danke, ich wusste nicht über '% PATHEXT%'. Wenn OPs 'PATHEXT' gesetzt ist und seine Zuordnung für' .pl' Dateien nur 'perl' und nicht' perl% 1' oder 'perl% *' ist, könnte das seine Probleme erklären. – mob

Verwandte Themen