【问题标题】:how to combine directory path in perl如何在perl中组合目录路径
【发布时间】:2015-04-16 07:07:15
【问题描述】:

我有一个 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 文件的正确绝对路径,而不必担心分隔符。

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

【问题讨论】:

  • 当您接受我之前关于相同代码的回答 (stackoverflow.com/a/28503335/725418) 时,我假设您了解我的 cmets 关于代码的内容(顺便说一下,这使这个问题变得多余)。现在阅读您的代码时,我发现您没有使用我所说的anything,甚至没有使用严格和警告。有什么不明白的地方吗?

标签: linux perl


【解决方案1】:

听从你的建议。当 cmets 和对以前帖子的回答被忽略时,继续提问是荒谬的。

必须始终use strictuse 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";
}

【讨论】:

  • 是的,我确实接受了以前帖子中给我的建议。我没有包含库的原因是因为试图仅显示需要答案的代码区域(但从现在开始,我将确保始终包含警告/严格)库)。我的实际脚本比我上面显示的更大更复杂。很抱歉造成混乱。是的,我得到了答案,并且使用 catfile 运行良好。感谢您的帮助
  • @user1188611:省略use strict 但包含#!/usr/bin/perl 很奇怪!很高兴您找到了答案。
【解决方案2】:

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

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

或catpath:

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

【讨论】:

    【解决方案3】:

    如果不存在,这将添加尾部斜杠:

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

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2010-11-28
      • 2010-09-29
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多