[英]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,>
你也可以这样做:
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.