我得到當我運行該腳本的結果「找不到文件」:如何查找Windows路徑下的所有lib目錄?
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[L|l]ib/ }
split /\n/, dir e:\\/ad/b/s;
print @dirs;
這是我的實際代碼。我正在嘗試grep
在整個驅動器中的名稱爲lib或Lib的目錄和子目錄。
我得到當我運行該腳本的結果「找不到文件」:如何查找Windows路徑下的所有lib目錄?
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[L|l]ib/ }
split /\n/, dir e:\\/ad/b/s;
print @dirs;
這是我的實際代碼。我正在嘗試grep
在整個驅動器中的名稱爲lib或Lib的目錄和子目錄。
任何數量的東西。
split
,如果你使用反引號,因爲它會回來的名單。[L|l]
意味着你認爲它的意思。如果您的意思是大寫「L」或小寫「l」,則不需要交替符號。正確的表達是[Ll]
(或(?i:l)ib
這意味着我們本地化的I位爲組。)所以,如果它看起來像這樣:
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ } qx{dir /AD /B /S e:\\};
這應該工作,如果有任何與之相匹配的東西。只要確保您使用qx
運算符或反引號。
+1,但你錯過了'%PATH%'中另一個'dir'程序的可能性。 – 2009-12-01 12:09:09
如果您正在使用從my answer to your previous question的代碼,我能想到的唯一的事情是,有可能是你的路徑上一些外部dir.exe
不理解內置dir
cmd.exe
的命令行選項。例如,Cygwin的在我的路徑中的目錄,我得到
dir: cannot access /ad/b/s: No such file or directory
您也應該得到展示的習慣確切輸出,如果你希望人們能夠你得到幫助你更有效。
要確保不發生,用途:
use strict; use warnings;
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ }
split /\n/, `cmd.exe /c dir e:\\ /ad/b/s`;
print "$_\n" for @dirs;
注意反引號```。還要注意對您正在使用的模式的修正。
@Sinan,我認爲@lokesh是Windows XP用戶。我測試了他從你那裏借來的代碼,它沒有任何有趣的工作。所以現在我想他正在使用其他系統。 – Mike 2009-12-01 12:28:19
@Mike:我在Windows XP上。當我在路徑中放入'c:\ opt \ cygwin \ bin'時,'No such file or directory'是我得到的消息,因爲Cygwin的'dir.exe'認爲'/ ad/b/s'是路徑。 (用'E:\'完全可以)。所以,@ lokesh在路徑中必須有其他'dir'。解決方案是顯式調用'cmd.exe'的內置dir,它可以理解傳遞給它的選項。 – 2009-12-01 13:35:08
@Sinan,你的解釋很有道理。 – Mike 2009-12-01 14:35:05
呃,第二行是幹什麼的? – 2009-12-01 06:00:33
這一行:split/\ n /,dir e:\\/ad/b/s; < - 是你的問題。爲什麼不使用glob來查找以[lL] ib開頭的文件? – ghostdog74 2009-12-01 06:42:28
請顯示您的實際代碼。你似乎缺少那裏的一些零件 – ysth 2009-12-01 06:42:45