为什么设置为$/="__Data__\n"
的perl输入记录分隔符不起作用?
数据记录设置如下:
__Data__\n
1aaaaaaaaaa\n
aaaaaaaaaaa\n
aaaaaaaaaaaaa\n
__Data__\n
1bbbbbbbbbb\n
bbbbbbbbbbb\n
bbbbbbbbbbbbb\n
__Data__\n
1cccccccccc\n
ccccccccccc\n
ccccccccccccc\n
__Data__\n
以下是访问每个数据记录第一行的perl代码....
$/="__Data__\n";
open READFILE,"<","logA.txt" or die "Unable to open file";
while(<READFILE>)
{
if(/([^\n]*)\n(.*)/sm)
{
print "$1\n";
}
}
close(<READFILE>);
我得到了不受欢迎的输出:
__Data__
而不是理想的输出:
1aaaaaaaaaaa
1bbbbbbbbbbb
1ccccccccccc
有人可以告诉我为什么输入记录分隔符$/="__Data__";
不起作用或者我对它应该如何工作的误解?
答案 0 :(得分:4)
如果我正确理解了这个问题,您想要删除__Data__
部分。你想要这个......
1aaaaaaaaaa
1bbbbbbbbbb
1cccccccccc
......但是你得到了这个......
__Data__
1aaaaaaaaaa
1bbbbbbbbbb
1cccccccccc
您可以使用chomp
命令删除行尾。通常这只是换行符,但chomp
会响应您设置$/
的内容。
use strict;
use warnings;
{
local $/="__Data__\n";
open my $fh, "<", "logA.txt" or die "Unable to open file";
while(my $record = <$fh>) {
chomp $record;
print $record;
}
}
顺便说一句,因为你改变了&#34;行尾#34的概念,__Data__
字段之间的所有内容都将被视为一行。如果您需要拆分行,可以使用my @lines = split "\n", $record
。
use strict;
use warnings;
{
# Isolate the change to the global $/
local $/="__Data__\n";
open my $fh, "<", "logA.txt" or die "Unable to open file";
while(my $record = <$fh>) {
# Remove the __Data__ separator
chomp $record;
# Split the record by line
my @lines = split /\n/, $record;
# Empty record, skip it
next if !@lines;
# Print the first line of the record
print $lines[0], "\n";
}
}
我还对您的代码进行了一些改进。 $/
是全局的,会影响读取文件的所有内容。 local
确保您的更改仅在块内发生。
我使用了词法文件句柄,当它们超出范围时(当它们被声明的块完成时),它们会自动关闭。
我已经开启了严格的警告,这些警告可能会发现错别字和close(<READLINE>)
等错误。
答案 1 :(得分:2)
input.txt中
__Data__
1aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaaa
__Data__
1bbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbbbb
__Data__
1cccccccccc
ccccccccccc
ccccccccccccc
__Data__
使用$/=qq{__Data__\n}
perl -e 'use Data::Dumper;$Data::Dumper::Useqq=1; $/=qq{__Data__\n}; open $fh,"input.txt"; print Dumper [ <$fh> ]'
$VAR1 = [
"__Data__\n",
"1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data__\n",
"1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data__\n",
"1cccccccccc\nccccccccccc\nccccccccccccc\n__Data__"
];
使用$/=qq{Data}
$VAR1 = [
"__Data",
"__\n1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data",
"__\n1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data",
"__\n1cccccccccc\nccccccccccc\nccccccccccccc\n__Data",
"__"
];
我想这是自我解释的。