首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl中的rel2abs,用于解析文件路径中的..

perl中的rel2abs,用于解析文件路径中的..
EN

Stack Overflow用户
提问于 2013-12-05 00:03:31
回答 3查看 1.7K关注 0票数 1
代码语言:javascript
复制
  my $dep_file="/local/mnt/LINUX/platform/gnss/v02.d"; #is my dep file
  open my $FH, $dep_file or die "Could not open $dep_file: $!";
  my $cwd = getcwd();
  while( my $dep = <$FH>)  {
      if ($dep =~ /$cwd/) { #interested only in lines starting with $cwd
         $dep =~ s/^\s*//; #remove whitespaces in the beginning.
         $dep =~ s/\s+\\\s*$//; # remove white space followed by \ at the end.
         print File::Spec->rel2abs( $dep ) ; #trying to print full path of file without a ".." in it.
         #print $dep;
         print "\n";
         }
      last if $dep =~ /^$/; # don't want to read any line after an empty line.
   }
  close $FH;

但结果并不像预期的那样:

代码语言:javascript
复制
/local/mnt/LINUX/platform/../source/gnss/api/src/v02.c
/local/mnt/LINUX/project/../source/gnss/api/../../hexagon-infra/q6-00/include/internal.h

我希望打印的行不带"..“在解析之后..在其中,类似于下面的内容

代码语言:javascript
复制
/local/mnt/LINUX/source/gnss/api/src/v02.c
/local/mnt/LINUX/source/hexagon-infra/q6-00/include/internal.h

您能帮我一下吗,提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-12-05 00:46:44

代码语言:javascript
复制
/local/mnt/LINUX/platform/../source/gnss/api/src/v02.c

并不一定是指

代码语言:javascript
复制
/local/mnt/LINUX/source/gnss/api/src/v02.c

因为

代码语言:javascript
复制
/local/mnt/LINUX/platform

可能是个符号链接。因此,如果不进行文件系统检查,则无法安全地折叠x/..。Spec不执行任何文件系统检查,但Cwd执行。

代码语言:javascript
复制
use Cwd qw( abs_path );

print abs_path( $dep );
票数 3
EN

Stack Overflow用户

发布于 2013-12-05 00:14:09

您必须使用Cwd模块中的函数realpath()

代码语言:javascript
复制
use Cwd qw<realpath>;
...
print File::Spec->rel2abs( realpath($dep) ) ;
票数 2
EN

Stack Overflow用户

发布于 2013-12-05 00:15:38

代码语言:javascript
复制
print Cwd::realpath( $dep ) ;

很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20380116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档