如果值满足特定要求,则从Perl中的散列中删除行到新文件

时间:2016-03-24 18:31:03

标签: perl hash

Perl新手,可以使用一些帮助。在Perl中使用哈希,尝试将原始文件中的一行删除到新文件中,如果该值小于或等于20。

原始文件:

apple       30
orange      45
pear        2

产生的两个文件是:

apple       30
orange      45

pear        2

到目前为止,这是我的代码:

use strict; use warnings;
use Data::Dumper;

open (INFILE1, 'sample.txt') or die "Cannot open INFILE1: $!\n";
open (OUTFILE, '>output.txt') or die "Cannot open OUTFILE: $!\n";

my %Hash;

while(<INFILE1>){
   chomp;
   my ($k, $v) = split(/\s+/);
   push @{$Hash{'INFILE1'}{$k}},$v;
}

我想接下来我必须使用foreach循环,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

您不需要哈希来执行此任务,因为您没有比较不同键的值。要读取文件中的所有行,您可以使用while (my $line = <$in_fh>)。此外,不鼓励使用bareword文件句柄名称,而是使用标量:open (my $in_fh, 'sample.txt') ...。把它们放在一起:

open (my $in_fh, 'sample.txt') or die "Cannot open INFILE1: $!\n";
open (my $out_fh, '>output.txt') or die "Cannot open OUTFILE: $!\n";

while (my $line = <$in_fh>)
{
    chomp $line;
    my ($k, $v) = split /\s+/, $line;

    if ($v > 20)
    {
        print $out_fh $line . "\n";
    }
}

答案 1 :(得分:-1)

$ perl -wane 'print if $F[1] <= 20' input.txt > output.txt

-w开关打开警告。

-n开关在程序周围创建一个while (<>) { ... }循环。

-a开关启用自动分割模式,该模式会为每一行将$_拆分为@F

-e开关指定我们的简短过滤程序。