我有一个存储在变量中的值
$var1="/home/PPP/Testing/dir2/file1";
这是我的linux系统中的一条真实路径。现在,使用$var1
的值,我想提取$var2
的值。
我想要"/家庭/PPP/测试";在CCD_ 3中。我不能将字符串值直接放在$var2
中,因为$var1
中的路径可能会有所不同。类似地,它($var1
(可以是"/home/PPPP/Testing/dir2/file1"home/PPP/lnx/dir3/file4"home/PPPP/window62/dir24/file1";。
总之,我希望$var1
中的路径返回两个级别,然后存储在$var2
中。
我该怎么做?可以使用dirname完成吗?
提取路径一部分的方法是解析它,然后重新组装所需的内容。
对于解析,最简单的建议是为该工作提供一个库,比如核心文件::Spec
use File::Spec;
my @fqn = File::Spec->splitdir($var1);
my $var2 = File::Spec->catdir( @fqn[0..$#fqn-2] );
如果路径以/
(按设计(开头,则splitdir
返回一个空的第一个元素,并且由于您正想将这些元素连接回来,因此第一个空元素正是所需的。然后连接最后两个元素(要丢弃的文件名和一个目录(。变量CCD_ 11是数组CCD_ 12中最后一个元素的索引。
当然还有其他的图书馆,还有其他的方式。
可以通过/
和my @fqn = split m{/}, $var1
手动分割路径,其中如果路径以/
开始,则第一个元素也是空字符串。或者使用类似my @fqn = m{[^/]+}g
的正则表达式(现在第一个元素不为空(。在这种情况下,我看不出这些比一个好的图书馆有任何优势。
下面是一个使用Path::Tiny执行此操作的示例。它不在核心Perl中,但它非常漂亮。
use Path::Tiny;
my $var1 = "/home/PPP/Testing/dir2/file1";
my $var2 = path($var1)->parent(2);