我正在动态获取目录的路径,并将其存储在变量中。我需要降低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/..
答案 0 :(得分:3)
使用模块来操纵路径可能是一个更安全的选择。 File::Spec
具有方便的splitdir
和catdir
功能:
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);