用后缀连接并打印每个数组元素

时间:2014-12-05 13:35:35

标签: perl

我在目录中有一些文件,如:

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

3 个答案:

答案 0 :(得分:4)

你可以试试,

chomp(@dir_list_initial);

以后

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

因为@dir_list_initial数组的每个元素在字符串末尾都有换行符。

更好的是完全跳过shell,并且只使用perl,

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

答案 1 :(得分: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,而这不是您想要的。

答案 2 :(得分: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已经指出的那样,最好不要涉及shell:

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