我有这段代码可以在目录中创建.txt文件列表,并将其打印在输出文件的2列中;所以我只想避免最后一个文件之后的换行(\ n)
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
#Variables
my ($dir_path, $outputfile);
GetOptions (
'dir=s' =>\$dir_path,
'list=s' =>\$outputfile
);
opendir (DIR, $dir_path) or die $!;
open LIST, '>', $outputfile, or die "can´t open $outputfile file";
while (my $files=readdir(DIR)) {
chomp $files;
if ($files =~ m/\.txt$/g) {
print LIST "$files\t$files\n";
}
else {
next;
}
}
closedir DIR;
close LIST;
exit;
打印:
file_1.txt file_1.txt
file_2.txt file_2.txt
file_3.txt file_3.txt
file_Last.txt file_Last.txt
NEW_LINE (\n)
并且我只想避免在最后一个文件之后打印las NEW LINE !!:
file_1.txt file_1.txt
file_2.txt file_2.txt
file_3.txt file_3.txt
file_Last.txt file_Last.txt
答案 0 :(得分:7)
如果您愿意采用其他方法,则可以将所有文件读入数组,然后使用join
打印它们:
my @files = grep { /\.txt$/ } readdir (DIR);
print LIST join "\n", map { "$_\t$_" } @files;
这可以打很多,但我认为这样可以清楚地显示步骤。
顺便说一句,最佳实践要求您将文件句柄DIR
和LIST
更改为$DIR
和$LIST
。
Which one is good practice, a lexical filehandle or a typeglob?
Why is three-argument open calls with autovivified filehandles a Perl best practice?
答案 1 :(得分:2)
IO::All
的必需插头:
perl -MIO::All -E 'say for io->dir("~/Documents/")->glob("*.txt")'
或者,作为脚本而不是单行代码:
use IO::All;
my @dir = io->dir("~/Documents/")->glob("*.txt");
print join "\n", @dir ;
对不起:-)
答案 2 :(得分:0)
您可以通过将问题从“将换行添加到每行的末尾(最后一行除外)”更改为“将换行添加到每行的开头”,而不是将所有行读入内存并将它们连接在一起除了第一个”。第二个问题更容易解决。
用于说明概念的工作示例:
use strict;
use warnings;
# a set of chomp-ed "lines" to print
my @lines = qw(foo bar baz);
# newline before each line (but blank for the first line)
my $nl = '';
# print the lines with \n before all except first
for (@lines) {
print "$nl$_";
# remaining lines will get \n before them
$nl = "\n";
}