2013-04-04 30 views
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. 

特別是由於大衛W¯¯誰指出我在正確的方向。

+0

你鏈接的教程不是很高的質量。它甚至沒有「嚴格使用」。 – simbabque 2013-04-04 20:51:47

+1

幽默我:試試'argtest 1 2 3',看看會發生什麼。 – 2013-04-04 20:52:30

+1

我嘗試了你的代碼(Mac OS X 10.7.5上的Perl 5.16.2;離你的平臺很遠),並且用'x.pl 1 2',我得到了'在串聯(。)或字符串中使用未初始化的值'和輸出 '參數0:1,參數1:2,參數2:.'我想知道你的Perl是否會誤導你(儘管你的輸出與'$ ARGV [0 ]未被初始化)。請記住,'$ 0'包含腳本的名稱; '$ ARGV [0]'包含腳本的第一個參數的名稱。 – 2013-04-04 20:54:41

回答

0

perl文件名不是參數數組的一部分。至少在測試我也必須刪除ARGV[2]或傳遞三個參數,如argtest 1 2 3

+0

argtest的結果1 2 3:使用未初始化的值$ ARGV [0]連接(。)或C中的字符串:無變化。 – user2246544 2013-04-04 20:59:08

+0

DWIM基於草莓Perl,如果增加了任何東西。這很基礎,我不明白它如何與DWIM相關。我並不在意perl的使用方式,但如果我更改爲ActiveState,那麼我會非常生氣,而且沒有什麼不同。 – user2246544 2013-04-04 21:26:57

2

注意@ARGV在Perl是不是很喜歡在C. 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腳本,它將在$ARGV[0]中找到。 $ARGV[1]將被初始化。

1

Windows有兩種方式知道它應該使用Perl來執行程序。

  1. 命令行以perl可執行文件開頭,要運行的腳本名稱作爲命令行參數提供。這也是它在Unix和其他環境中的工作原理。
  2. 您的系統將一個或多個擴展名(例如.pl,.pm和/或.cgi)與Perl應用程序相關聯,當您使用其中一個擴展名鍵入文件名時,Windows將啓動Perl,或者單擊帶有其中一個擴展名的文件Windows資源管理器中的擴展名。

你調用腳本僅僅作爲

argtest 1 2 

perl argtest 1 2 
argtest.pl 1 2 

這讓我覺得Perl是不是得看提到該文件的第一個應用程序而不是一個到argtest。也許有一個名爲argtest.batargtest.exe的文件,它有讓Perl運行你的Perl代碼的任務。出於某種原因,該中間程序未將您提供的命令行參數傳遞給Perl應用程序。

提供這個中間文件的代碼,我們可以幫助更多。


UPDATE:大衛W¯¯提出了第三個方式 - PATHEXT環境變量設置爲inclue .pl文件和命令行調用argtest - 看他的答案。 然後,如果窗口的與.pl擴展名的文件關聯被搞砸了,比方說,設置爲只C:\Dwimperl\perl\bin\perl「而不是」 C:\Dwimperl\perl\binperl %*「,那麼OP會得到行爲,他描述。

+0

用戶在其中一個評論中說過,他嘗試過'perl argtest.pl HELP!'並得到了相同的結果 – imran 2013-04-04 21:33:25

+0

是的,我是從「perl argtest.pl HELP!」運行它的。並得到了相同的結果。 – user2246544 2013-04-04 21:35:33

+0

實際上,你說運行'perl argtest.pl HELP!'的結果是'$ ARGV [1]'是未初始化的,而不是'$ ARGV [0]'。這實際上聽起來像是按照它應有的方式工作。 – mob 2013-04-04 21:48:00

1

下載Cygwin並在Cygwin的測試代碼(如果你是一個Unix主管,你會喜歡Cygwin,因爲它給了你Windows機器上的Unix/Linux環境,沒有它,我不會使用Windows)

Windows使用後綴來確定什麼程序打開什麼文件。你的Perl腳本叫argtest,argtest.batargtest.pl

在Windows上,確保所有Perl腳本都使用*.pl後綴,因此Windows將使用任何Perl參數來執行它們。 Windows不使用shebang

另一個可能的問題:在Windows XP中,我有Perl腳本有問題的參數,因爲Windows有此作爲執行字符串:

perl %1 

這將與我的腳本執行Perl程序,卻忽略了參數。我必須將其更改爲:

perl %* 

不幸的是,Windows Vista通過Windows 8改變了設置方式。但是,我有Windows 7並沒有這個問題。由於目錄名稱中有空格,我確實在C:\Perl下安裝了Perl,而不是C:\Program Files\Perl。我也安裝了Strawberry Perl。

有一個特殊的Windows環境變量PATHEXT。這允許您鍵入foo而不是foo.pl。如果Windows無法看到如何執行文件,則Windows會通過%PATHEXT並嘗試附加各種後綴,直到找到可用的後綴。您可能需要將.PL附加到該環境變量,因此您可以始終輸入foo而不是foo.pl

+0

謝謝,我不知道'%PATHEXT%'。如果設置了OP的'PATHEXT',並且他的'.pl'文件關聯只是'perl'而不是'perl%1'或'perl%*',那麼這可以解釋他的問題。 – mob 2013-04-04 23:48:05