如何在perl中合并目录路径

use*_*611 6 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";
}
Run Code Online (Sandbox Code Playgroud)

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

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

让我知道是否有人有任何建议。

Bor*_*din 11

注意你得到的建议。当对以前帖子的评论和答案被忽略时,继续提问是荒谬的。

必须始终 use strictuse warnings在顶部每个你写Perl程序,并使用声明每个变量my。这并不难,如果你发布没有这些措施的代码,你会受到谴责。

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

catfile将正确地将文件(或目录)名称连接到路径,如果路径分隔符不正确,则做正确的事情。对您的程序的这种重写工作正常。

#!/usr/bin/perl

use strict;
use warnings;

use File::Spec::Functions 'catfile';

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

my ($dir_path) = @ARGV;
my $xml_pattern = catfile($dir_path, '*.xml');

while ( my $xml_file = glob($xml_pattern) ) {
   print "Absolute path is $xml_file\n";
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*key 5

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

 $path = File::Spec->catfile( @directories, $filename );
Run Code Online (Sandbox Code Playgroud)

或Catpath:

 $full_path = File::Spec->catpath( $volume, $directory, $file );
Run Code Online (Sandbox Code Playgroud)