我不是Perl用戶,所以我只知道最基本的語法,但我從一位同事那里繼承了一些用于資料分析管道的腳本,我正試圖弄清楚。
具體而言,我無法理解他的 perl 腳本是如何使用以下內容來定位適當的輸入/輸出目錄的:
opendir DIR, "。" or die
我見過的opendir的使用方法是這樣的:
opendir DIR, </yourpath> or die
我在腳本中找不到任何東西來表明正在訪問什么目錄名,那么". "的語法是干什么的?我想也許它只是表示要打開當前的目錄,但這大概是
opendir DIR, './' or die
在任何情況下,程式在沒有訪問所需檔案的情況下就終止了,所以我猜測這就是有問題的一行。
uj5u.com熱心網友回復:
在看到.是當前的作業目錄之后,這里有幾個有趣的事實
這不是程式檔案所在的目錄。為此最好使用$FindBin::RealBin
在程式運行程序中,當前作業目錄可以通過chdir或使用的庫來改變。如果程式是從另一個程式中啟動的,或者是從cron中啟動的,它可能與預期的不同。 簡而言之,人們不應該假設它是什么
。在許多編程語言中,用字串.來表示它并不是一個完整的語言功能,而更像是一種額外的便利,一種禮節;那其實是作業系統/檔案系統的事情。在編程語言中,它是不完整和不一致的,而且在人們可能期望它的時候可能并不存在。(Quick: 你能不能通過使用.來保存你的當前目錄,以便在你chdir了一圈之后能夠回到它那里?)
我使用一個庫,比如Cwd::cwd或Path::Tiny::cwd,將全路徑的作業目錄存盤在一個變數中。 (在Path::Tiny中還有其他的作業方式)
為了以防萬一:opendir readdir組合回傳檔案的名稱,沒有路徑;所以當從當前目錄以外的目錄查詢時,這些不是實際的檔案。?補救措施:要么將作業目錄改為被讀取的目錄,要么在readdir回傳的每個檔案名前加上路徑,以便檔案名指向現有檔案。
? 如果程式在(作業目錄)a_dir中,并且在.../other_dir上進行opendir,然后readdir回傳file.txt -- 沒有這樣的檔案(在當前作業目錄,a_dir)。實際的檔案,從程式所在的地方,是.../other_dir/file.txt
注意,...,代表父目錄,也被定義了,同時還有.
uj5u.com熱心網友回復:
在檔案系統中的導航可以通過絕對路徑、相對路徑來指定,參考主目錄、當前目錄或父目錄
。幾個例子:
- ~/bin/script (絕對的,因為shell會展開~)
- $HOME/bin/script (絕對的,因為$HOME應該是一個絕對路徑) 。
- /usr/local/bin/ldd (絕對值)
- /usr/sbin/tar (絕對路徑)
- script.pl (相對)
- work/perl/script.pl (相對)
- ./work/perl/script.pl (相對)
- ./work/python/script.py(相對)
- ./project/Makefile (相對)
- ./book/perl.pdf(相對的) 。
參考資料。瀏覽Linux檔案系統的初級指南
uj5u.com熱心網友回復:
這不是一個Perl的特性,而是一個作業系統的特性。在Windows和unix系統中,.指的是行程的當前作業目錄。[1]
每個行程都有自己的作業目錄。
每個行程都有一個CWD,它從其父級繼承。它是相對路徑(那些不以目錄分隔符開始的路徑)被決議的相對目錄。
$ ls -l # 默認為 CWD。
總數 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l . # CWD。
總數 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l file # CWD中的`file`。
總數 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ readlink -e .
/tmp/a
$ ls -l /tmp/a
總數 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l /tmp/a/file
總數 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 /tmp/a/file
- 在 Windows 中,每個驅動器都有一個 CWD。
.單獨指的是當前驅動器的CWD. 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311344.html
標籤:
