无法遵循 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
- 在 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(相对)
我不是 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
- 在 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(相对)