如何在perl中组合目录路径

时间:2015-02-15 19:23:06

标签: linux perl

我有一个perl脚本,我在其中提供目录作为输入的路径。 目录中包含xml文件。

在我的代码中,我遍历所有xml文件并为所有xml文件创建绝对路径。代码工作正常。

#!/usr/bin/perl

use File::Spec;

$num_args = $#ARGV + 1;
if ($num_args != 1) {
   print "\nUsage: $0 <input directory>\n";
   exit;
}

my $dirPath = $ARGV[0];

opendir(DIR, $dirPath);
my @docs = grep(/\.xml$/,readdir(DIR));

foreach my $file (@docs) 
{
   my $abs_path = join("",$dir,$file);

   print "absolute path is $abs_path";
}

我在这里的问题是, 加入$ dirPath和$ file没有分隔符,这意味着$ dirPath必须以“/”结尾。那么在perl中是否有任何方法或内置函数可以处理这种情况并替换连接方法。

我想要的只是不用担心分隔符“/”。即使用路径调用脚本为“/ test / dir_to_process”或“/ test / dir_to_process /”,我也应该能够为所有存在的xml文件生成正确的绝对路径,而不必担心分隔符。

如果有人有任何建议,请告诉我。

3 个答案:

答案 0 :(得分:4)

答案在File::Spec的文档中,例如,catfile:

 $path = File::Spec->catfile( @directories, $filename );

或catpath:

 $full_path = File::Spec->catpath( $volume, $directory, $file );

答案 1 :(得分:4)

留意您的建议。当忽略对以前帖子的评论和回答时,继续提问是很荒谬的。

必须始终 use strictuse warnings位于您编写的每个 Perl程序的顶部,并使用{{1}声明每个变量}。这样做并不难,如果您发布的代码没有采取这些措施,您将受到谴责。

my程序中的use模块但从未使用它。使用File::Spec::Functions通常更容易,它导出File::Spec提供的方法,因此不需要使用面向对象的调用样式。

File::Spec将正确地将文件(或目录)名称连接到路径,如果路径分隔符不正确,则执行正确的操作。这个重写你的程序工作正常。

catfile

答案 2 :(得分:0)

如果没有,则会添加尾部斜杠:

$dirPath =~ s!/*$!/!;