我有一个用空格分隔键值对的文件。文件中的第一列是键,其余列是值。换句话说,每个键可以有一个值数组。
我只对文件中某些键的值感兴趣。我有一个包含我感兴趣的键的数组。什么是最好的方式在perl中创建一个哈希只有我感兴趣的键/值对的子集?
到目前为止我写的是:
foreach my $line (@{$file_arr_ref}) {
my $sub = substr( $line, 0, 1);
if(($sub ne "#") and ($sub ne "")){ #omit comments and blank lines
my @key_vals = split(/s/, $line);
if $key_vals[0] eq "key_i'm_interested_in_1" or $key_vals[0] eq "key_i'm_interested_in_2" {
insert_into_hash();
}
}
}
是否有更优的方法来做到这一点?
用你需要的键从数组中创建一个散列。
my @keys_i_need = ('key_1', 'key_2', 'key_3');
my %keys_i_need = map {$_ => 1} @keys_i_need;
foreach my $line (@{$file_arr_ref}) {
my $sub = substr( $line, 0, 1);
if(($sub ne "#") and ($sub ne "")){ #omit comments and blank lines
my @key_vals = split(/s/, $line);
insert_into_hash() if(exists $keys_i_need{$key_vals[0]});
}
}
通常情况下,当一个人在寻找某个东西的存在时,他应该想到的第一个数据结构是哈希。
但是,如果项目列表很短,使用grep
也可以使用数组。
foreach my $line (@{$file_arr_ref}) {
next if $line =~ /^$/ || $line =~ /^#/; # Omit blank lines and comments
my @key_vals = split /s/, $line;
next if ! grep {$key_vals[0] eq $_} qw(key_one key_two key_three);
insert_into_hash();
}
还请注意,如果要对文件的所有行进行迭代,那么最好以while (<$fh>)
的形式进行迭代,而不是首先将它们全部加载到数组中。