Perl - 我如何将完整的目录路径名传递给 perl 脚本

Posted

技术标签:

【中文标题】Perl - 我如何将完整的目录路径名传递给 perl 脚本【英文标题】:Perl -How do i pass complete directory path name into perl script 【发布时间】:2014-10-03 20:31:54 【问题描述】:

我有一个 perl 脚本,它从“/root/pkt/sw/se/tool”路径执行,需要脚本内的完整目录路径。

你能告诉我如何获得完整的路径吗?

sample.pl

 our ($tool_dir);

 use strict;
 use warnings;
 BEGIN 
   $tool_dir = $0;
   my $home_path = $tool_dir
   $home_path =~ s|\w*/\w*/\w*$||;
   my $target_path ="obj/Linux-i686/usr/share/ddlc/lib";
   $lib_dir = "$home_path$target_path";
   unshift(@INC, $lib_dir);
 

我正在从“pkt/sw/se/tool”路径执行这个脚本,但这里我只得到“pkt/sw/se/tool”而不是“/root/pkt/sw/se/tool”

我的 perl 脚本在 /root/pkt/sw/se/tools/sample.pl 下可用

【问题讨论】:

【参考方案1】:

您可以使用 CWD 模块 (http://perldoc.perl.org/Cwd.html)(代码取自该页面)

use Cwd;
my $dir = getcwd;
use Cwd 'abs_path';
my $abs_path = abs_path($file);

或者你可以执行 pwd 命令

$cwd = `pwd`;

如果您只想要目录,而不是完整路径,您可以在 Print current directory using Perl 上查看现有答案

【讨论】:

感谢您的解决方案 在第 3 行为什么要重复声明 use Cwd 'abs_path';?在工作的第 1 行声明 abs_path @Hussain,查看我链接的原始答案并在那里提问:-)【参考方案2】:

使用已经提到的模块之一,切勿使用反引号 - 除非您完全了解这样做的风险和影响。如果您确实想运行“pwd”,请通过 IPC::Run3 之类的方式调用它。

例子:

#!/usr/bin/perl

use strict;
use warnings;

use Cwd;
use IPC::Run3;

# CWD
my $working_dir_cwd = getcwd; 
print "Woring Dir (Cwd): $working_dir_cwd\n";

# IPC::Run3
my ($in, $out, $err);
my @command = qw/pwd/;

run3 \@command, $in, \$out, \$err or die $?;

print "Working Dir (pwd): $out\n";

【讨论】:

你能告诉我如何通过 IPC::Run 使用 'pwd' 吗? 对不起,我的意思是 IPC::Run3。看一下示例脚本(编辑)。您会看到调用 Cwd 的代码要少得多 - 但 IPC::Run3 对于安全运行命令(简单或复杂)和捕获结果非常有用。【参考方案3】:

您可以使用FindBin 来定位原始perl 脚本的目录。

use FindBin;
use lib "$FindBin::Bin/../../../obj/Linux-i686/usr/share/ddlc/lib";

【讨论】:

以上是关于Perl - 我如何将完整的目录路径名传递给 perl 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何将哈希传递给 Perl 中的函数?

使用 perl openssh 传递命令服务器

C# process.Start 文件名和传递参数

如何将单击的文件完整路径传递给设置为默认程序以打开某些特定文件类型的批处理命令快捷方式

如何从我的 perl 脚本调用同一目录中的脚本

如何让 perl 正确传递具有多个参数和复杂文件路径(空格和符号)的命令行参数?