如何在Perl中组合目录路径

9

我有一个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中是否有任何方式或内置函数可以处理此条件并替换join方法。
我的目的只是不用担心分隔符“/”。即使脚本被调用的路径为“/test/dir_to_process”或“/test/dir_to_process/”,我也应该能够生成所有xml文件的正确绝对路径,而无需担心分隔符。
如果有人有任何建议,请告诉我。

5
当您接受了我之前关于同一段代码的回答 (http://stackoverflow.com/a/28503335/725418) 时,我认为您已经理解了我的关于该代码的评论(顺便说一下,这使得这个问题变得多余了)。但是现在我看到您的代码时,我发现您没有使用我所说的任何内容,甚至没有使用严格模式和警告。是否有什么地方您没有理解? - TLP
3个回答

15

注意你所得到的建议。当之前的评论和回答被忽略时,不停地提问是荒谬的。

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

你的程序中使用File::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";
}

是的,我确实采纳了之前帖子中给我的建议。我没有包含库的原因是因为我想展示只需要回答的代码区域(但从现在开始,我会确保警告/严格模式下始终包含库)。我的实际脚本比上面展示的更大更复杂。对于造成的混淆,我很抱歉。是的,我得到了答案,并且使用catfile运行良好。感谢您的帮助。 - user1188611
@user1188611:忘记加上"use strict",但却包含了"#!/usr/bin/perl"是有点奇怪的!我很高兴你找到了答案。 - Borodin

6
答案在File::Spec的文档中,例如catfile:
 $path = File::Spec->catfile( @directories, $filename );

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

0
这将在末尾添加斜杠(如果没有的话):
$dirPath =~ s!/*$!/!;

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