2

我动态获取目录的路径,并将其存储在变量中。我需要降低 1 级并获取父目录。此外,该路径是 Windows 路径。基本上,我在 Windows 上运行 perl。如何在 perl 中实现这一点?一切都很好 - 正则表达式或任何其他方式。请帮忙!

例如 :

原始目录路径:

        my $dir = "C:/mytest/mydata/mywork/mydir";

输出需要的是:

        my $dir = "C:/mytest/mydata/mywork";

我需要直到父目录“mywork”,而不是“mydir”。

任何人都可以帮助编写相同的代码吗?

第二个查询:

我在目录路径中有空间:

例子 :

      my $testdir = "C:/mytest own/mydata/mywork/mydir";

请注意,“mytest own”是一个目录,但有空间。现在,当我尝试输入以使用此变量进入此目录时,我无法这样做。

对于查询 1,我尝试了以下代码:

@英戈:

          #!/usr/bin/perl

          my $dir = "C:/mytest/mydata/mywork/mydir";

          print "Input directory is : $dir\n";

          my $outdir = $dir . "/..";

          print "Output directory is :  $outdir";

注意:我需要在不使用任何 perl 模块的情况下完成此操作。

@TLP:我尝试使用您的缩短方法,再次复制代码,但没有提供所需的输出。

        #!/usr/bin/perl

         use strict;
         use warnings;
         use File::Spec;

          my $str    = "C:/mytest/mydata/mywork/mydir";
          my @dirs   = File::Spec->splitdir($str);        # parse directories                                    
          my $newdir = File::Spec->catdir(@dirs, File::Spec->updir());      # create new path
          print $newdir;

输出看起来像:输出附加 /..

          C:/mytest/mydata/mywork/mydir/..
4

4 回答 4

3

使用模块来操作路径可能是更安全的选择。File::Spec具有方便splitdircatdir功能:

use strict;
use warnings;
use File::Spec;

my $str    = "C:/mytest/mydata/mywork/mydir";
my @dirs   = File::Spec->splitdir($str);        # parse directories
pop @dirs;                                      # remove top dir
my $newdir = File::Spec->catdir(@dirs);         # create new path
print $newdir;

请注意,默认情况下,新路径将使用您当前系统使用的路径分隔符。

你也可以做

my $newdir = File::Spec->catdir(@dirs, File::Spec->updir());

updir()返回..)在我的系统(Windows 7)上的输出是一样的,也就是说

C:\mytest\mydata\mywork

我原以为会是C:\mytest\mydata\mywork\mydir\..,但显然模块缩写了。

于 2013-11-07T15:10:30.133 回答
0

由于您可能想知道如何将目录路径分隔为路径元素列表,因此这里有一个用于分隔路径的子例程。这是针对 linux 的,所以您可能想要更改路径分隔符正则表达式,

#!/bin/perl
use strict;
use warnings;
#examine pathname, extract directory path
#examine pathname, extract directory path
sub dirname
{
    my($pn) = @_;
    my @p = split(/\//,$pn);    ##windows would want split(/\\/,$pn)
    if( $#p > 0 ) { pop(@p); push(@p,""); }
    else { pop(@p); push(@p,"."); }
    $pn = join('/',@p);         ##you would want join('\\',@p)
    return($pn);
};
my $dir=$ARGV[0] || "/a/b/c/d/e/f/g/h/i/j";
while ( $dir && length($dir)>1) {
    print "$dir\n";
    $dir = dirname($dir);
}
于 2013-11-07T15:49:11.667 回答
0

首先,要获取父目录,只需附加“/..”

$dir . "/.."

其次,您是在外部命令中使用它还是什么?然后你必须引用路径名,如:

system "ls '$testdir'"

否则,如果您想在 perl 中更改目录,以下应该没问题:

chdir $testdir or die "Can't change to '$testdir' - $!"
于 2013-11-07T14:48:53.270 回答
0

使用此代码

my $dir = "C:/mytest/mydata/mywork/mydir";
my $char = '/';
my $result = rindex($dir, $char);
$path = substr("$dir", 0,$result);
于 2015-07-23T15:44:30.440 回答