为什么要将Perl输入记录分隔符设置为$/="__数据;不工作?
为什么将Perl输入记录分隔符设置为$/=“\uu数据\uu\n”不起作用 数据记录设置如下:为什么要将Perl输入记录分隔符设置为$/="__数据;不工作?,perl,Perl,为什么将Perl输入记录分隔符设置为$/=“\uu数据\uu\n”不起作用 数据记录设置如下: __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 下面是访问每个数据记录的
__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
为什么输入记录分隔符
$/=“\uuuu Data\uuuuu”代码>不工作?它应该如何工作?如果我正确理解了这个问题,您希望去掉\uu数据部分。你想要这个
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;
}
}
我还对代码做了一些一般性的改进<代码>$/
是全局的,将影响读取文件的所有内容<代码>本地
确保您的更改只发生在块内部
我使用了词法文件句柄,当它们超出范围时(当它们在其中声明的块完成时),它们会自动关闭自己
我已经打开了strict和warnings,它们会捕捉打字错误和一些小错误,比如close()
input.txt
__Data__
1aaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaaaa
__Data__
1bbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbbbb
__Data__
1cccccccccc
ccccccccccc
ccccccccccccc
__Data__
使用$/=qq{{\uuuuuuu数据\uuuuuuu\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__"
];
我想这是不言自明的。这是数据中可见的文字“\n”吗?请不要发布您运行的代码以外的代码。不要发布您使用的数据以外的数据。发布您实际获得的输出。哪部分不是?它表示您使用了“
”$/=“Data\n”
。它表示获得了“数据”
”作为输出。它表示您希望“1aaaaaaaaaaa 1BBBBBBBBBBBB 1CCCCCCC
”作为输出,浮动“}关闭()代码>“等等。你读了吗?认真的?这是你今天第四次问这个问题了。你已经得到了足够多的帮助来自己解决这个问题。实际上,其他行工作的唯一原因是因为您的正则表达式与第一行不匹配,$/不会从数据中拆分并删除自身,它会拆分并将自身包含在数据中,这就是为什么您在循环中对$\执行任何操作之前先执行chomp。在if之前添加chomp就足够了,请阅读perldoc-f chomptanks,但问题是,如何打印每条记录的第一行?@YetimworkBeyene是的,现在好多了。我在文章的最后解释了这些变化,并对每一行进行了评论,解释了它的作用。如果您只是想在不理解现有代码的情况下将其粘贴到现有代码中,那么我不想给出这样的答案。如果您有关于更改的问题,我很乐意回答。这些答案的问题是,我必须将我的思维转换为新的代码答案,而不是从我的代码示例中得出的答案,这会使事情变得更加复杂。从您的示例中,我不知道为什么要使用$VAR1和$/=qq{{uuuuuu Data\uuuu\n}不起作用……首先,您必须牢牢掌握什么是$/
,以及它如何影响文件读取$VAR1..
是Data::Dumper
输出,显示perl如何根据$/
值逐个记录读取文件。
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__"
];
$VAR1 = [
"__Data",
"__\n1aaaaaaaaaa\naaaaaaaaaaa\naaaaaaaaaaaaa\n__Data",
"__\n1bbbbbbbbbb\nbbbbbbbbbbb\nbbbbbbbbbbbbb\n__Data",
"__\n1cccccccccc\nccccccccccc\nccccccccccccc\n__Data",
"__"
];