如何从Perl中的数组中删除随机值?

时间:2009-10-25 12:13:02

标签: perl arrays random

我正在学习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;

但是现在我想从文件中删除这个随机名称。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

  1. shift已从数组中删除名称。

    pop也是如此(一个从头开始,一个从头到尾) - 我建议使用pop因为它可能更有效并且是随机的,你不关心哪个在你用。

  2. 或者您是否需要从文件中删除它?

    如果是这种情况,您需要:

    一个。得到一个文件内的名字计数(如果很小,使用File::Slurp在内存中读取它,如果大,可以逐行读取并计数或通过反引号执行wc -l $filename命令。 / p>

    B中。生成随机#从1到&lt; $ of lines&gt; (例如,$random_line_number

    ℃。逐行读取文件。对于读取的每一行,将其写入另一个临时文件(使用File::Temp生成临时文件。除非不将编号为$random_line_number的行写入文本文件

    d。关闭临时文件并移动它而不是原始文件

  3. 如果列表包含文件名称,您需要删除文件本身(随机文件),请使用unlink()功能。不要忘记处理来自unlink()的返回代码,并且与任何IO操作一样,打印包含$!的错误消息,该消息将是失败时系统错误的文本。

  4. 完成。

    d

答案 1 :(得分:2)

当您说“从列表中删除此内容”时,您的意思是从文件中删除它吗?如果您只是想从@array中删除它,那么您已经使用shift完成了该操作。如果您希望将其从文件中删除,并且顺序无关紧要,只需将@array中的其余名称写回文件即可。如果文件顺序 重要,那么你将不得不做一些稍微复杂的事情,例如重新打开文件,按顺序读取项目,除了你不想要的项目,然后再将它们全部写回来。要么是这样,要么在阅读文件时更多地注意订单。

答案 2 :(得分:1)

如果您需要从文件中删除一行(从您的问题中不完全清楚),最简单和最有效的方法之一是使用Tie::File来操作文件,就像它是一个数组一样。否则perlfaq5会解释如何做到这一点。