1

如何将文件中未注释的行读取/存储到数组中?

file.txt如下所示

request abcd uniquename "zxsder,azxdfgt"
request abcd uniquename1 "nbgfdcbv.bbhgfrtyujk"
request abcd uniquename2 "nbcvdferr,nscdfertrgr"
#request abcd uniquename3 "kdgetgsvs,jdgdvnhur"
#request abcd uniquename4 "hvgsfeyeuee,bccafaderryrun"
#request abcd uniquename5 "bccsfeueiew,bdvdfacxsfeyeueiei"

现在我必须将未注释的行(此脚本中的前 3 行)读取/存储到一个数组中。是否可以通过字符串名称或任何正则表达式的模式匹配来使用它?如果是这样,我该怎么做?

下面的代码将所有行存储到一个数组中。

open (F, "test.txt") || die "Could not open test.txt: $!\n"; 
@test = <F>; 
close F; 
print @test;

我怎样才能只为未注释的行做到这一点?

4

3 回答 3

4

如果您知道您的评论将在开头包含#,您可以使用

next if $_ =~ m/^#/

或者使用你必须读取每一行的任何变量而不是$_

这与行首的 # 符号匹配。至于将其他人添加到数组中,您可以使用push (@arr, $_)

#!/usr/bin/perl

# Should always include these
use strict;
use warnings;

my @lines; # Hold the lines you want

open (my $file, '<', 'test.txt') or die $!; # Open the file for reading
while (my $line = <$file>)
{
  next if $line =~ m/^#/; # Look at each line and if if isn't a comment
  push (@lines, $line);   # we will add it to the array.
}
close $file;

foreach (@lines) # Print the values that we got
{
  print "$_\n";
}
于 2012-08-07T18:45:00.460 回答
2

你可以这样做:

push @ary,$_ unless /^#/;END{print join "\n",@ary}'

这会跳过任何以 开头的行#。否则,该行将添加到数组中以供以后使用。

于 2012-08-07T18:48:35.277 回答
0

对原始程序的最小更改可能是:

open (F, "test.txt") || die "Could not open test.txt: $!\n"; 
@test = grep { $_ !~ /^#/ } <F>; 
close F; 
print @test;

但我强烈建议稍微重写一下以使用当前的最佳实践。

# Safety net
use strict;
use warnings;
# Lexical filehandle, three-arg open
open (my $fh, '<', 'test.txt') || die "Could not open test.txt: $!\n"; 
# Declare @test.
# Don't explicitly close filehandle (closed automatically as $fh goes out of scope)
my @test = grep { $_ !~ /^#/ } <$fh>; 
print @test;
于 2012-08-08T09:03:57.310 回答