无法遵循Perl中的opendir语法



我不是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

  1. 在Windows中,每个驱动器都有一个CWD。其中.单独为当前驱动器的CWD。

最新更新