如何使用Perl脚本对文件内部的行进行混排

时间:2019-02-19 12:20:30

标签: perl

我有一个文本文件,我想使用Perl脚本对行进行混排。我将整个文件保存在数组中,并在util中使用了shuffle,我想将经过改组的数据写入另一个文件中,并将其重命名为旧文件名。

我写了一段代码:

use List::Util qw(shuffle);
my @lines;
my @reordered;
my $filepath1 ="C:/Users/SravanthiBekkam/Desktop/pearl/data.txt";
my $filepath2 ="C:/Users/SravanthiBekkam/Desktop/pearl/temp.txt";
my $fhandle; 
my $handle;
open ( $fhandle, "<", $filepath);

while (<$fhandle>) {

    push(  @lines, $_);
}
@reordered = shuffle(@lines);
open ( $handle, ">", $filepath2);
foreach  (@reordered) {
    print $handle  "$_\n";
}
close $fhandle;
close $handle;
unlink $fhandle;
rename($handle, $fhandle);

在上面的代码中,我将文件存储到@lines数组中,将数组改组并重写为另一个文件,然后删除先前的文件,并将附加的文件重命名为原始文件。

预期将同一文件中的行改编或至少写入另一个文件。

2 个答案:

答案 0 :(得分:2)

这是一个很好的程序示例,如果您a)使用更多的Perlish习惯用法并且b)使用I / O间接操作来摆脱所有打开和读取文件的麻烦,那么程序就会变得短很多。

use List::Util qw(shuffle);

print shuffle <>;

这将从STDIN读取文件,并将经过改组的版本写入STDOUT。因此,如果它位于名为shuffle_file的文件中,则可以这样命名:

$ shuffle_file < data.txt > temp.txt

当然,您需要自己重新命名。但这似乎是不必为编写所有繁琐的额外代码而付出的小代价:-)

哦,我认为您原始代码的问题在于,您需要调用rename()并将其传递给关闭的文件句柄-当它需要文件名时。

rename($filepath2, $filepath1);

$filepath1的名称似乎有些混乱-有时您将其称为$filepath。)

答案 1 :(得分:-1)

您可以使用Tie::File模块。这样,您就可以将文件的内容作为数组访问。

use List::Util qw(shuffle);
use Tie::File;

tie my @lines, 'Tie::File', "C:/Users/SravanthiBekkam/Desktop/pearl/data.txt";
@lines = shuffle @lines;
untie @lines;
相关问题