我有一个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 strict
和use warnings
在顶部每个你写Perl程序,并使用声明每个变量my
。这并不难,如果你发布没有这些措施的代码,你会受到谴责。
你use
是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";
}
Run Code Online (Sandbox Code Playgroud)
答案在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)
归档时间: |
|
查看次数: |
5492 次 |
最近记录: |