我不是Perl用户,所以我只知道最基本的语法,但是我从一个同事那里继承了一些脚本,用于我试图弄清楚的数据分析管道。
特别是,我不能理解他的perl脚本是如何定位适当的输入/输出目录使用以下命令:
opendir DIR, "." or die
我看到的使用opendir的方式是沿着
的行opendir DIR, </yourpath> or die
我无法在脚本中找到任何东西来指示正在访问的目录名,那么"."语法在干什么?我想也许它只是表示打开当前目录,但那大概是
opendir DIR, './' or die
在任何情况下,程序在没有访问所需文件的情况下终止,所以我猜这是有问题的行。
看到.
是当前的工作目录后,这里有一些有趣的事实
-
这不是程序文件所在的目录。最好使用$FindBin::RealBin
-
当前工作目录可以在程序运行期间通过chdir或使用的库更改。如果程序是从另一个程序启动的,或者是从cron启动的,则可能与预期不同。简而言之,在程序运行
的任何时候都不应该假设它是什么。 -
在许多编程语言中,字符串
.
表示它并不是一个完整的语言特性,而是一种额外的方便,一种礼貌;这实际上是操作系统/文件系统的事情。在编程语言中,它是不完整和不一致的,并且可能在人们期望它时不可用。(示例:虽然我可以使用.
打开一个文件,但我无法使用它获得我的当前目录,因此要保存它以供以后使用,我希望能够做到的。)我使用库,如Cwd:: Cwd或Path::Tiny:: Cwd,将全路径工作目录存储在变量中。(在
Path::Tiny
中还有其他方法可以使用它) -
以防万一:
opendir
+readdir
组合返回文件的名称,没有路径;因此,当从当前目录以外的目录查询时,这些不是实际的文件。†补救措施:要么将工作目录更改为正在读取的目录,要么将路径附加到readdir
返回的每个文件名,以便文件名引用现有文件
†如果程序在(工作目录)a_dir
中,它在../other_dir
上执行opendir
,然后readdir
返回file.txt
——没有这样的文件(在当前工作目录a_dir
中)。程序所在的实际文件是../other_dir/file.txt
..
(用于父目录)和.
(
)也被定义。
在文件系统中导航可以通过绝对路径指定,相对路径,参考主目录,当前目录或父目录
- 绝对路径——/usr/home/work/perl
- 相对路径——../bin/prog
- 主目录——~(或~/),$ Home(环境变量)
- 当前工作目录——。(或。/)
- 父目录——..(. ./)
几个例子:
- ~/bin/script(绝对的,因为shell扩展了~)
- $HOME/bin/script(绝对路径,因为$HOME应该是绝对路径)
- /usr/地方/bin/ldd(绝对)
- /usr/sbin/焦油(绝对)
- script.pl(相对)
- 工作/perl/script.pl(相对)
- 。/工作/perl/script.pl(相对)
- 。/工作/python/script.py(相对)
- . ./项目/Makefile(相对)
- . ./book/perl.pdf(相对)
参考资料:导航Linux文件系统的初学者指南
这不是Perl的特性,而是操作系统的特性。在Windows和unix系统中,.
指的是进程的当前工作目录[1]
每个进程都有一个CWD,它继承自它的父进程。它是解析相对路径(不以目录分隔符开头的路径)的相对目录。
$ ls -l # Defaults to the CWD.
total 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l . # The CWD.
total 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l file # `file` in the CWD.
total 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ readlink -e .
/tmp/a
$ ls -l /tmp/a
total 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 file
$ ls -l /tmp/a/file
total 0
-rw------- 1 ikegami ikegami 0 Aug 31 19:44 /tmp/a/file
- 在Windows中,每个驱动器都有一个CWD。其中
.
单独为当前驱动器的CWD。