使用Perl打印当前目录

24

我有这段使用Perl打印当前目录的代码:

use Cwd qw(abs_path);
my $path = abs_path($0);
print "$path\n";

但是它显示了我的脚本文件名以及目录。

像这样:

C:\Perl\duration.pl

我只想显示 C:\Perl\

我该怎么做?


7
你是想获取当前工作目录,还是想获取当前脚本名称中的目录部分?这两者是不同的。 - Mat
根据@Mat的评论,这个问题的意图不清楚。你想要a)脚本所在的文件夹还是b)脚本当前工作的目录? - null
7个回答

47

要获取当前工作目录(在许多系统上使用pwd),可以使用cwd()代替abs_path

use Cwd qw();
my $path = Cwd::cwd();
print "$path\n";

或者没有参数的abs_path

use Cwd qw();
my $path = Cwd::abs_path();
print "$path\n";

详见Cwd文档

从目录外部获取你的perl文件所在的目录:

use File::Basename qw();
my ($name, $path, $suffix) = File::Basename::fileparse($0);
print "$path\n";

有关更多详细信息,请参阅File::Basename文档。


关于“获取您的Perl文件所在的目录”,如果使用符号链接到脚本,则无法正常工作。请参阅我的答案以获取可行的解决方案。 - ikegami
关于“获取您的Perl文件所在的目录”,如果使用符号链接到脚本,则无法正常工作。请查看我的答案以获取可行的解决方案。 - undefined

20

以下各段代码片段都可获取脚本所在目录,但与当前目录不同。不确定你需要哪种。

use FindBin qw( $RealBin );

say $RealBin;
或者
use Cwd            qw( abs_path );
use File::Basename qw( dirname );

say dirname(abs_path($0));
或者
use Cwd         qw( abs_path );
use Path::Class qw( file );

say file(abs_path($0))->dir;

3
请注意:根据文档,必须启用say作为功能才能使用。 - justkt
1
@justkt,我也省略了use strict;use warnings;。这并不重要。 - ikegami
既然这是被选中的答案,那么问题的标题可以改为询问如何找到脚本目录吗? - Chap
@ikegami 我并没有说它获取了脚本目录。 - Levi
@ikegami 我没有说它获取了脚本目录。 - undefined

6

使用:

print($ENV{'PWD'});

但我认为它在Windows上不起作用...


这个非常有效,不需要任何其他代码或模块。你可以将它写在当前工作目录中,但并没有回答原始问题 :) - alexmac
这甚至在非Windows系统上都无法工作,因为它依赖于父级设置变量。而且只有一些shell才会这样做。使用Cwd模块更可靠和可移植,而且不会增加任何复杂性。 - undefined

6

只需删除“$0”即可。

use Cwd qw(abs_path);
my $path = abs_path();
print "$path\n";

3

这里有一个简单的解决方案:

use Cwd;
my $cwd = cwd();
print "Current working directory: '$cwd()'";

我希望这能帮到您。


1
你可以使用FindBin
use FindBin '$RealBin';
print "$RealBin\n";

FindBin 是一个标准模块,它在安装 Perl 时已经安装好了。要获取标准语法和模块的列表,请参阅perldoc perlmodlib


0

我在带有符号链接的目录中使用了我的脚本。 该脚本解析路径并根据路径执行命令。 我面临的问题是正确确定当前路径。

以下是示例:

root@srv apache # pwd
/services/apache

root@srv apache # readlink -f .
/services/apache2225

Cwd模块披露路径(类似于readlink -f的模拟) http://perldoc.perl.org/Cwd.html

root@server apache # perl -e 'use Cwd; print cwd . "\n";'
/services/apache2225

如果您需要获取当前路径,就像pwd命令一样,您可以使用$ENV{'PWD'}。
root@srv apache # perl -e 'use Cwd; print $ENV{'PWD'}."\n";'
/services/apache

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接