提问:一个正则非贪婪问题。(已解决)

提问:一个正则非贪婪问题。(已解决)

论坛中上次有人提出得到所运行程序绝对路径的问题,我也遇到了相同的问题,但感觉已有的解决问题不太完善,想解决它。

英文不好,不知有没有相应的模块可以解决?

上次问题的URL:
http://bbs.chinaunix.net/viewthread.php?tid=873001


目录结构
/root+---script
        |       cwd1.pl
        |
        +---limit
                abc.shell

在limit目录运行../script/cwd1.pl
输出结果:

/root/limit
../script/cwd1.pl
/root/limit/../script/cwd1.pl
/root/limit/../script/cwd1.pl
/script/cwd1.pl              #结果

想得到的结果为
/root/script/cwd1.pl

我的代码

#!/usr/bin/perl

use Cwd;
my $dir = getcwd;

use Cwd 'abs_path';
my $abs_path = abs_path($file);
print "$abs_path\n";
print "$0\n";

$prog_path= $abs_path . '/' . $0;
print $prog_path . "\n";

$prog_path=~s/\/\.\//\//g;
print $prog_path . "\n";

#关键地方
$prog_path=~s/(\/.*?\/)\.\.\//\//g;
print $prog_path . "\n";

改成
$prog_path=~s/(\/.*\/){1}\.\.\//\//g;
print $prog_path . "\n";
也不好用。

abs_path 不可以么?
感谢cobrawgl !!!

abs_path可以完成功能,我写错了。

my $abs_path = abs_path($file);

改为my $abs_path = abs_path($0);
就行了。

但还有一个问题就是非贪婪匹配问题。如何将类似

/root/limit/../script/cwd1.pl
替换为
/root/script/cwd1.pl

就是替换
/limit/../为/

我写的几种写法都不对,如何能做到?

perl -e '$_="/root/limit/../script/cwd1.pl";s{[^/]*/\.\./}{};print "$_\n"'


QUOTE:
原帖由 ly5066113 于 2008-12-5 09:16 发表
perl -e '$_="/root/limit/../script/cwd1.pl";s{[^/]*/\.\./}{};print "$_\n"'

感谢ly5066113!!!
方法可行

原来可以这样用。