避免在perl循环的最后一行打印新行

时间:2018-12-06 19:42:43

标签: perl

我有这段代码可以在目录中创建.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

3 个答案:

答案 0 :(得分:7)

如果您愿意采用其他方法,则可以将所有文件读入数组,然后使用join打印它们:

my @files = grep { /\.txt$/ } readdir (DIR);
print LIST join "\n", map { "$_\t$_" } @files;

这可以打很多,但我认为这样可以清楚地显示步骤。

顺便说一句,最佳实践要求您将文件句柄DIRLIST更改为$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";
}