如何在存储在perl中的变量中的目录路径上返回1级

时间:2013-11-07 14:44:22

标签: perl unix

我正在动态获取目录的路径,并将其存储在变量中。我需要降低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,我尝试了以下代码:

@Ingo:

          #!/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:我尝试使用你的cut-short方法,代码再次复制,但它没有提供所需的输出。

        #!/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 个答案:

答案 0 :(得分: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\..,但显然是模块的缩写。

答案 1 :(得分:0)

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

$dir . "/.."

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

system "ls '$testdir'"

否则,如果要更改perl中的目录,则以下内容应该没问题:

chdir $testdir or die "Can't change to '$testdir' - $!"

答案 2 :(得分:0)

由于您可能想知道如何将目录路径分成路径元素列表,因此这是一个将路径分开的子例程。这是针对linux的,所以你可能想要改变路径分隔符regex,

#!/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);
}

答案 3 :(得分:0)

使用此代码

my $dir = "C:/mytest/mydata/mywork/mydir";
my $char = '/';
my $result = rindex($dir, $char);
$path = substr("$dir", 0,$result);