无法遵循 Perl 中的 opendir 语法

Unable to follow opendir syntax in Perl

我不是 Perl 用户,所以我只知道最基本的语法,但我从同事那里继承了一些脚本,用于我正在尝试弄清楚的数据分析管道。

具体来说,我无法理解他的 perl 脚本如何使用以下内容找到适当的 input/output 目录:

opendir DIR, "." or die

我看到 opendir 的使用方式与

opendir DIR, </yourpath> or die

我在脚本中找不到任何内容来指示正在访问的目录名称,那么“.”是什么?语法在做什么?我想也许它只是表示打开当前目录,但那大概是

opendir DIR, './' or die

无论如何,程序在没有访问所需文件的情况下终止,所以我猜这是有问题的行。

这不是 Perl 的特性,而是 OS 的特性。在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。

看到 . 是当前的 working-directory,这里有一些有趣的事实

  • 这不是程序文件所在的目录。为了最佳使用 $FindBin::RealBin

  • 当前工作目录可以在程序 运行 期间由 chdir 或所使用的库更改。如果程序是从另一个程序或 cron 启动的,它可能与预期不同。简而言之,在程序的 运行

    中的任何时候都不应该假设它是什么
  • 在许多编程语言中用字符串 . 表示它并不是一个完整的语言特性,而是一种额外的便利,一种礼貌;这真的是一件 OS/filesystem 的事情。在编程语言中,它是不完整和不一致的,并且可能无法在人们期望的时候使用。 (示例:虽然我可以使用 . 打开文件,但我无法使用它获取当前目录,因此为了以后保存它,我希望能够做到这一点。)

    我使用一个库,例如 Cwd::cwd or Path::Tiny::cwd,将完整路径的工作目录存储在一个变量中。 (在 Path::Tiny 中还有其他方法可以使用它)

  • 以防万一:opendir + readdir 组合 returns 文件的裸名,没有路径;因此,当从当前目录以外的目录查询时,这些文件不是实际文件。 补救措施:将工作目录更改为正在读取的目录,或者将路径添加到 readdir,以便文件名引用现有文件


如果程序在(工作目录)a_dir 中并且它在 ../other_dir 上执行 opendir,然后 readdir returns file.txt -- 没有这样的文件(在当前工作目录中,a_dir)。程序所在的实际文件是 ../other_dir/file.txt

注意,对于父目录,.. 也与 .

一起定义

在文件系统中导航可以通过绝对路径相对路径、参考主目录[=]来指定39=]、当前目录父目录

  • 绝对路径--/usr/home/work/perl
  • 相对路径--../bin/prog
  • 主目录--~(或~/),$HOME(环境变量)
  • 当前工作目录 -- 。 (或./)
  • 父目录 -- ..(或 ../)

举几个例子:

  • ~/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(相对)

参考:A beginner's guide to navigating the Linux filesystem