我在目录中有一些文件,如:
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
答案 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>