2014-08-28 87 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去。

相關問題