我正在学习Perl并使用以下代码构建一个从文件中获取随机行的应用程序:
open(my $random_name, "<", "out.txt");
my @array = shuffle(<$random_name>);
chomp @array;
close($random_name) or die "Error when trying to close $random_name: $!";
print shift @array;
但是现在我想从文件中删除这个随机名称。我怎么能这样做?
答案 0 :(得分:4)
shift
已从数组中删除名称。
pop
也是如此(一个从头开始,一个从头到尾) - 我建议使用pop
因为它可能更有效并且是随机的,你不关心哪个在你用。
或者您是否需要从文件中删除它?
如果是这种情况,您需要:
一个。得到一个文件内的名字计数(如果很小,使用File::Slurp
在内存中读取它,如果大,可以逐行读取并计数或通过反引号执行wc -l $filename
命令。 / p>
B中。生成随机#从1到&lt; $ of lines&gt; (例如,$random_line_number
℃。逐行读取文件。对于读取的每一行,将其写入另一个临时文件(使用File::Temp
生成临时文件。除非不将编号为$random_line_number
的行写入文本文件
d。关闭临时文件并移动它而不是原始文件
如果列表包含文件名称,您需要删除文件本身(随机文件),请使用unlink()
功能。不要忘记处理来自unlink()
的返回代码,并且与任何IO操作一样,打印包含$!
的错误消息,该消息将是失败时系统错误的文本。
完成。
d
答案 1 :(得分:2)
当您说“从列表中删除此内容”时,您的意思是从文件中删除它吗?如果您只是想从@array
中删除它,那么您已经使用shift
完成了该操作。如果您希望将其从文件中删除,并且顺序无关紧要,只需将@array
中的其余名称写回文件即可。如果文件顺序 重要,那么你将不得不做一些稍微复杂的事情,例如重新打开文件,按顺序读取项目,除了你不想要的项目,然后再将它们全部写回来。要么是这样,要么在阅读文件时更多地注意订单。
答案 2 :(得分:1)