5

問題: Windows XP がコマンド ライン引数を perl スクリプトに渡していません。

症状:次のような単純なコマンド:

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

をもたらしました:

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

解決:

根本的な問題は Windows XP にあります。perl を開始するためのデフォルトの方法では、スクリプト名である最初の変数のみが渡されます。その結果、$ARGV[0] が初期化されていません。

修正するには、次の場所で Windows レジストリを編集します。

\HKEY_CLASSES_ROOT\Perl\shell\Open\command

そして、次のように入力します。

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

結果は次のとおりです。

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

特に、私を正しい方向に向けてくれた David W に感謝します。

4

4 に答える 4

2

Perlでは、C@ARGVとはまったく異なることに注意してください。argv

                              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]

したがって、Perl スクリプトに 1 つのコマンド ライン引数を指定すると、$ARGV[0]. $ARGV[1]初期化されません。

于 2013-04-04T21:03:15.950 に答える
1

Perl を使用してプログラムを実行することになっていることを Windows が認識する方法は 2 つあります。

  1. コマンド ラインは perl 実行可能ファイルで始まり、実行するスクリプトの名前がコマンド ライン引数として提供されます。これは、Unix やその他の環境でも機能する方法です。
  2. システムは.pl.pm、および/または.cgiPerl アプリケーションと 1 つまたは複数の拡張子を関連付けます。これらの拡張子のいずれかを含むファイル名を入力するか、Windows エクスプローラーでこれらの拡張子のいずれかを含むファイルをクリックすると、Windows は Perl を起動します。

次のように単純にスクリプトを呼び出しました

argtest 1 2

そして、の1つではありません

perl argtest 1 2
argtest.pl 1 2

これは、Perl が によって参照されるファイルを参照する最初のアプリケーションではないと私に思わせますargtest。Perl に Perl コードを実行させるタスクを持ったargtest.batorという名前のファイルがあるかもしれません。argtest.exe何らかの理由で、この中間プログラムは、指定したコマンド ライン引数を Perl アプリケーションに渡しません。

この中間ファイルのコードを提供していただければ、さらにお手伝いいたします。


更新: David W が 3 番目の方法を提案しています。PATHEXT環境変数を inclue.plファイルに設定argtestし、コマンドラインから呼び出す方法です。彼の回答を参照してください。次に、拡張子とのウィンドウのファイルの関連付け.plが台無しになった場合、たとえば、 「」ではC:\Dwimperl\perl\bin\perlなく「C:\Dwimperl\perl\binperl %*」として設定された場合、OPは彼が説明する動作を取得します。

于 2013-04-04T21:31:27.053 に答える
1

Cygwinをダウンロードして、Cygwin 環境でコードをテストします。これはWindowsの問題だと思います。(もしあなたが Unix に詳しいなら、Cygwin を気に入るでしょう。なぜなら、Windows マシン上で Unix/Linux のような環境が得られるからです。私は Cygwin なしでは Windows を使用しません。)

Windows はサフィックスを使用して、どのプログラムがどのファイルを開くかを決定します。Perl スクリプトの名前は ですかargtestargtest.batそれともargtest.plですか?

Windows では、すべての Perl スクリプトが*.plサフィックスを使用していることを確認してください。これにより、Windows は Perl パラメーターを使用してスクリプトを実行します。Windows はshebangを使用しません。

別の考えられる問題: Windows XP では、Windows が実行文字列としてこれを持っていたため、パラメーターを持つ Perl スクリプトに問題がありました。

 perl %1

私のスクリプトでPerlプログラムを実行しますが、パラメーターは無視します。これを次のように変更する必要がありました。

 perl %*

残念ながら、Windows Vista から Windows 8 では、この設定方法が変更されました。ただし、私は Windows 7 を使用しており、この問題は発生していません。ディレクトリ名にスペースがあるためではC:\Perlなく、 Perlをインストールするようにしました。C:\Program Files\PerlストロベリーPerlもインストールしました。

という特別な Windows 環境変数がありますPATHEXT。これにより、 のfoo代わりに入力できますfoo.pl。Windows がファイルの実行方法を認識できない場合、Windows は、動作する%PATHEXTサフィックスが見つかるまで、さまざまなサフィックスを追加しようとします。.PLその環境変数に追加したい場合があるので、常に入力するfoo代わりに入力できますfoo.pl

于 2013-04-04T23:09:24.347 に答える