2014-12-05 75 views
0

我像一個目錄中的一些文件:串聯並打印每個數組元素帶有後綴

A.txt 
B.txt 
C.txt 

我想用新的後綴將它們打印:

#!/user/bin/perl 

my @dir_list_initial = `ls *.txt | sed 's/.txt//g' `; 
my $suffix = ".dat"; 

for (my $i=0; $i<=$#dir_list_initial; $i++){ 
print $dir_list_initial[$i] . $suffix; 
} 

我希望打印

A.dat 
B.dat 
C.dat 

但它打印

.datA 
.datB 
.datC 

回答

4

你可以嘗試,

chomp(@dir_list_initial); 

後來

print $dir_list_initial[$i] . "$suffix\n"; 

@dir_list_initial陣列的每一個元件在字符串的結尾換行符。

更妙的是這將是完全跳過外殼,並且只使用perl的,

my @dir_list_initial = map { s|\.txt||; $_ } glob("*.txt"); 
+0

很好!作品:) – EpiMan 2014-12-05 13:39:16

+0

請在投票正確答案時發表評論。 – 2014-12-09 06:37:06

2

你通過運行ls做一半的計劃。當你可以使用內建Perl機制來完成同樣的工作時,不要掏腰包glob可以用ls完成你正在做的一切,你不必依靠ls命令(如果這是Windows?)。

另外,總是use strict;use warnings;在您的程序中,它可以通過撿到常見的錯誤爲您節省大量的痛苦。

#! /usr/bin/env perl 
# 
use strict; 
use warnings; 
use feature qw(say); 

for my $file (glob "*.txt") { 
    chomp $file; 
    $file =~ s/\.txt$/.dat/; 
    say $file; 
} 

注意我使用s/.../.../代替一個後綴與另一個。你需要學習regular expressions。您的s/.txt//不正確。 .可以代表任何字符,並且您不指定.txt必須位於字符串的末尾。如果我的文件名爲ftxtback.txt,則會將文件名更改爲.datback.txt,這不是您想要的。

+1

'glob'返回的列表元素不需要'chomp'。這是最簡單的使用非破壞性替代'使用5.014;說地圖s/txt \ z/dat/ir,glob'* .txt'' – Borodin 2014-12-05 17:04:08

+0

是的,您在這種情況下不需要'chomp'。不過,我仍然習慣於使用它。不像舊的'chop',在不需要時使用'chomp'不會造成任何傷害。 – 2014-12-05 20:16:47

+0

什麼?你'chomp' *每*字符串*無處不在*?這有點奢侈! – Borodin 2014-12-05 21:18:11

1

沒有必要調用sed這裏,PERL可以處理好:

my @dir_list_initial = `ls *.txt`; 
chomp @dir_list_initial; 
my $suffix = ".dat"; 
foreach (@dir_list_inital){ 
    s/\.txt$/$suffix/; # this alters @dir_list_initial 
    print "$_\n"; 
} 

,如果你有一個Perl比5.14更近,你也可以這樣做:

use 5.014; 
my @dir_list_initial = `ls *.txt`; 
chomp @dir_list_initial; 
my $suffix = ".dat"; 
say s/\.txt$/$suffix/r foreach @dir_list_initial; # this doesn't alter the array. 

和,正如mpapec已經指出的那樣,最好不要涉及外殼:

say s/\.txt$/.dat/r foreach <*txt>