繁体   English   中英

如何使用Perl中的记录分隔符

[英]Howto Work with Record Separator in Perl

我有一个看起来像这样的数据

--
read50_1: read1391364_2,read3529226_1,
--
read46_2: read916_1,read178252_2,read1336397_1,read1824459_2,
read916_1: read0_1
--
read34_1: read209771_2,
--
read32_2: read520377_2,

我想要做的是访问除记录分隔符“ - ”之外的条目。

但为什么这段代码没有呢?

my  $INFILE_file_name = "myfile.txt";      # input file name
my $content = '';
open ( INFILE, '<', $INFILE_file_name )
    or croak "$0 : failed to open input file $INFILE_file_name : $!\n";

{
    local $/ = "--";

    $content = <INFILE>;
    print "$content\n";

}

close ( INFILE );           # close input file

首先,我猜你的意思

local $/ = "--\n"; # or maybe "\n--\n"

(如果你使用"\\n--\\n" ,那么第一线将不再被认为是记录分隔符,但将是第一个记录的一部分,你可能想阅读第一--改变$/ 。)

请记住, <IN>运算符不会删除$/ 使用chomp来做到这一点。

其次,文件以记录分隔符开头,因此第一条记录将为空白。

{
    local $/ = "--\n";

    while ($content = <INFILE>) {
      chomp $content;
      print "$content\n" if $content; # Skip empty records
    }
}
#!/usr/bin/env perl

use Modern::Perl;
use autodie;
use Data::Dump 'pp';

open my $file, "<", "input.txt";
{
    local $/ = "--\n";
    say pp <$file>;
}
close $file;

并输出:

(
  "--\n",
  "read50_1: read1391364_2,read3529226_1,\n--\n",
  "read46_2: read916_1,read178252_2,read1336397_1,read1824459_2,\nread916_1: read0_1\n--\n",
  "read34_1: read209771_2,\n--\n",
  "read32_2: read520377_2,\n",
)

换句话说,读取不会剥离输入记录分隔符。 你可能想要这样的东西:

open my $file, "<", "input.txt";
{
    local $/ = "--\n";
    for (<$file>) {
        chomp;
        s/\n//g;
        say "<$_>";
    }
}
close $file;

这使:

<>
<read50_1: read1391364_2,read3529226_1,>
<read46_2: read916_1,read178252_2,read1336397_1,read1824459_2,read916_1: read0_1>
<read34_1: read209771_2,>
<read32_2: read520377_2,>

作为旁注,您应该使用三arg打开 ,您可能对autodie感兴趣,这样您就不必编写or die模板。

你也可以这样做:

while(<INFILE>) {
        print unless(/\s*--\s*/);
}

虽然在这里使用记录分隔符是可能的,但它不是一个非常好的解决方案,除非' - '暗示一些有意义的数据分组(将被使用)。 如果目的只是过滤掉' - ',请使用循环控制。

use strict;
use warnings;

my $file = 'myFile.txt';

open my $fh, '<', $file or die "Unable to open $file: $!";

while ( <$fh> ) {   # Read text file line-by-line

    next if /^--/;  # Skips current line if it begins with '--'
    print;          # Will only execute if line doesn't begin with '--'
}

close $fh;

尝试这个:

my  $INFILE_file_name = "myfile.txt";
my @content = ( );
open ( INFILE, '<', $INFILE_file_name );
@content = <INFILE>;
close ( INFILE );

foreach my $line (@content) {
    $line =~ s/^\s+//;
    $line =~ s/\s+$//;
    if ($line eq '--') {
        next;
    }
    print $line . "\n";
}

从那里,您将能够逐行访问记录,而不使用--分隔符。 此外,如果您只想将它​​放在一个变量而不是数组中,您可以:

$file .= $line . "\n";

$content = <INFILE>仅获取以$/的字符结尾的下一行。 它应该被包裹在一个循环中以获得所有的行。

while ( $content = <INFILE> ) {
    chomp $content;
    print "$content\n";
}

现代Perl用户远离裸字文件句柄。 相反,使用词法变量作为文件句柄。 要知道为什么词汇变量比bareword文件句柄更受欢迎,请阅读: Bareword大写文件句柄

local $ / =“ - \\ n”; 而(格格($ _ =)){打印;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM