如何使用perl脚本洗牌文件中的行

如何使用perl脚本洗牌文件中的行,perl,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/SravanthiBek

我有一个文本文件,我想用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);
use List::Util qw(shuffle);
我的@行;
我的@重新排序;
my$filepath1=“C:/Users/SravanthiBekkam/Desktop/pearl/data.txt”;
my$filepath2=“C:/Users/SravanthiBekkam/Desktop/pearl/temp.txt”;
我的$fhandle;
我的$handle;
打开($fhandle,“,$filepath2);
foreach(@重新排序){
打印$handle“$\n”;
}
关闭$fhandle;
关闭$handle;
取消$fhandle的链接;
重命名($handle,$fhandle);
在上面的代码中,我将文件存储到
@lines
数组中,并将数组洗牌并重写到另一个文件中,同时删除先前的文件并将附加的文件重命名为原始文件


应将同一文件中的行洗牌或至少写入另一个文件。

您可以使用
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;

这是一个很好的例子,如果你a)使用更高级的习惯用法,b)使用I/O间接寻址来摆脱所有打开和读取文件的操作,程序就会变得更短

use List::Util qw(shuffle);

print shuffle <>;
当然,你需要自己重新命名。但这似乎是一个小代价,因为不必编写所有那些繁琐的额外代码:-)

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

rename($filepath2, $filepath1);

(对
$filepath 1
的名称似乎也有一些混淆-有时您只是将其称为
$filepath

什么不起作用?还请注意,您可以
my@lines=
print{$handle}@reordered。您的问题可能与您的问题完全相同?检查您的
取消链接
重命名
调用是否失败可能会提供信息。这是评论还是回答?///Tie::文件永远不是答案,尤其是在这里。这只会让你的程序速度变得非常慢,并且会毫无代价地占用大量内存,因为你的版本不比使用File::Slurper的版本短。@ikegami,来自Tie::File的文档,该文件没有加载到内存中,所以即使是大文件也可以这样做。不,不会。在固定大小的缓冲区之上,Tie::File保存它遇到的每一行的索引。在64位构建的Perl上,每行需要28字节(不计算内存分配器的开销)。如果平均行很短(例如,计算机代码),访问帖子中的每一行会导致Tie::File实际使用的内存比将文件加载到标量中要多!即使行很长,我们仍然在谈论巨大文件的巨大内存量。所有这些都需要花费30倍的时间(对于一些任务,包括琐碎的任务)。
perl-i shuffle_file data.txt
rename($filepath2, $filepath1);