2014-08-28 263 views
-1

我有像下面这样的数组。我想用Perl去除最后的工作。使用Perl删除字符串中的最后一个字

my @array = 'directory1/directory2/directory3/log_info.txt'; 

我想获得没有log_info.txt的目录结构。

e.g要输出directory1/directory2/directory3/

感谢

+0

你显示的是错误的。 '@ array'是一个数组,另一边是一个字符串。 – Jens 2014-08-28 18:47:22

+1

@Jens不会只是创建一个项目的数组?我同意OP可能想要使用'$ array'。 – jkeuhlen 2014-08-28 18:50:25

回答

0
 Below line working for me. 

      $array =~ s/log_info.txt//g; 
2

File::Basename是解析用Perl文件路径的传统和可移植的方式。

use warnings; 
use strict; 
use File::Basename qw(dirname); 

my @array = 'directory1/directory2/directory3/log_info.txt'; 
for (@array) { 
    print dirname($_), "/\n"; 
} 

__END__ 

directory1/directory2/directory3/ 
+0

我猜测OP并不意味着要创建一个单元素数组;我认为这是唯一使这个问题不是重复的[如何获得与Perl的文件的dirname?](http://stackoverflow.com/questions/3455956/how-do-i-get-the- dirname-of-a-file-with-perl),所以解释似乎是有保证的。另外,对于这个问题,我认为一个关于'dirname'的警告(尽管不适用于这个特殊情况)将会很有用,这个警告是根据[Schwern的回答](http://stackoverflow.com/a/3461953/176646)的线条来描述的。 – ThisSuitIsBlackNot 2014-08-28 19:19:15

0

有可能是一个更好的办法做到这一点,但这里是一个快速和肮脏的解决办法:

$/ = "log_info.txt"; 
chomp(@array); 

会切断最后一部分。

另外,您可以使用正则表达式:

my ($dir) = @array[0] =~ /(.*)\/log_info.txt/; 
+0

为什么你的正则表达式输出为1? – 2014-08-28 19:01:56

+0

我错过了'$ dir'周围的零件。固定。 – jkeuhlen 2014-08-28 20:21:27

+0

为什么圆括号有所不同?你能解释一下原因吗?为什么你必须在这种情况下为变量使用圆括号? – 2014-08-28 23:52:55

0

这里是改变你的阵列中的每个项目的正则表达式的方法:

@array = map { s![^/]+$!!r } @array; 

但是,在这种特殊情况下,我会用dirname去。

相关问题