使用文件句柄 perl 排序
Sorting with filehandle perl
我想按行对输出文件的内容进行排序。
我有这个代码
unless (open FILE1, '<'. $file1) {die "Couldn't open file\n";}
unless (open FILE2, '>'. $file2) {die "Couldn't open file\n";}
while (my $line = <FILE1>){
chomp $line;
print FILE2 sort (substr($line, 0, -1))."\n";
}
close FILE1;
close FILE2;
我想按字母顺序对行进行排序,但它不起作用。如果没有排序,我会得到未排序的所需输出。我该如何解决这个问题,以便无需执行 $sort -o $file $file
.
即可对文件输出中的每一行进行排序
读取数组中的所有内容很简单。对数组进行排序。然后解析数组并根据需要对其进行处理。
一种易于编写的文件读取解决方案是使用File::Slurper:
#!/usr/bin/perl
use strict;
use warnings;
use File::Slurper 'read_lines';
my $file1 = "a.a";
my $file2 = "b.b";
unless ( -f $file1 ) {die "Missing file: $file1\n";}
# Read all lines in an array
my @lines = read_lines($file1);
# Sort the array
my @sorted_lines = sort(@lines);
unless (open FILE2, '>'. $file2) {die "Couldn't open file\n";}
# Parse the sorted array
foreach my $line (@sorted_lines)
{
# prcoess each line however you want
print FILE2 substr($line, 0, -1)."\n";
}
close FILE2;
我认为您可以直接在数组上下文中对 <>
的输出进行排序以删除循环并使其更易于阅读。
如果您正在对行进行排序,则无需删除行尾。如果你把它留在那里,它会通过删除手动换行符来清理 print
语句。
此外,如果您为 open
函数使用词法变量(例如 my $input
)而不是文件句柄(例如 'INPUT'),则文件描述符会在结束时自动关闭范围。
use strict;
use warnings;
open my $input, "<", "input.txt";
open my $output, ">", "output.txt";
my @lines=sort <$input>; #Use array context to read all lines in file
for (@lines) {
print $output $_;
}
我想按行对输出文件的内容进行排序。
我有这个代码
unless (open FILE1, '<'. $file1) {die "Couldn't open file\n";}
unless (open FILE2, '>'. $file2) {die "Couldn't open file\n";}
while (my $line = <FILE1>){
chomp $line;
print FILE2 sort (substr($line, 0, -1))."\n";
}
close FILE1;
close FILE2;
我想按字母顺序对行进行排序,但它不起作用。如果没有排序,我会得到未排序的所需输出。我该如何解决这个问题,以便无需执行 $sort -o $file $file
.
读取数组中的所有内容很简单。对数组进行排序。然后解析数组并根据需要对其进行处理。
一种易于编写的文件读取解决方案是使用File::Slurper:
#!/usr/bin/perl
use strict;
use warnings;
use File::Slurper 'read_lines';
my $file1 = "a.a";
my $file2 = "b.b";
unless ( -f $file1 ) {die "Missing file: $file1\n";}
# Read all lines in an array
my @lines = read_lines($file1);
# Sort the array
my @sorted_lines = sort(@lines);
unless (open FILE2, '>'. $file2) {die "Couldn't open file\n";}
# Parse the sorted array
foreach my $line (@sorted_lines)
{
# prcoess each line however you want
print FILE2 substr($line, 0, -1)."\n";
}
close FILE2;
我认为您可以直接在数组上下文中对 <>
的输出进行排序以删除循环并使其更易于阅读。
如果您正在对行进行排序,则无需删除行尾。如果你把它留在那里,它会通过删除手动换行符来清理 print
语句。
此外,如果您为 open
函数使用词法变量(例如 my $input
)而不是文件句柄(例如 'INPUT'),则文件描述符会在结束时自动关闭范围。
use strict;
use warnings;
open my $input, "<", "input.txt";
open my $output, ">", "output.txt";
my @lines=sort <$input>; #Use array context to read all lines in file
for (@lines) {
print $output $_;
}