我有一个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文件生成正确的绝对路径,而不必担心分隔符。
如果有人有任何建议,请告诉我。
答案 0 :(得分:4)
答案在File::Spec的文档中,例如,catfile:
$path = File::Spec->catfile( @directories, $filename );
或catpath:
$full_path = File::Spec->catpath( $volume, $directory, $file );
答案 1 :(得分:4)
请留意您的建议。当忽略对以前帖子的评论和回答时,继续提问是很荒谬的。
您必须始终 use strict
和use warnings
位于您编写的每个 Perl程序的顶部,并使用{{1}声明每个变量}。这样做并不难,如果您发布的代码没有采取这些措施,您将受到谴责。
您my
程序中的use
模块但从未使用它。使用File::Spec::Functions
通常更容易,它导出File::Spec
提供的方法,因此不需要使用面向对象的调用样式。
File::Spec
将正确地将文件(或目录)名称连接到路径,如果路径分隔符不正确,则执行正确的操作。这个重写你的程序工作正常。
catfile
答案 2 :(得分:0)
如果没有,则会添加尾部斜杠:
$dirPath =~ s!/*$!/!;