欢迎来到 StackOverflow。
您的代码存在多个问题。首先,请发布可编译的Perl;我必须添加三个大括号才能给它最远的编译机会,并且我必须猜测其中一个大括号去了哪里(并且有一定的机会它应该在大括号的另一侧)print
我发表的声明)。
接下来,专家们有:
use warnings;
use strict;
放在脚本的顶部,因为他们知道如果不这样做就会错过一些东西。作为一名学习者,你也应该这样做,这一点至关重要;它会防止你犯错误。
有了这些,您就必须在使用变量时声明它们。
接下来,请记住缩进您的代码。这样做更容易理解。即使在最好的情况下,Perl 也可能难以理解。不要让事情变得比本来应该的更加困难。 (你可以决定你喜欢哪里的牙套——这是可以讨论的,尽管选择你喜欢的风格并坚持下去更简单,忽略任何讨论,因为讨论可能会毫无结果。)
数据中的 EB 与 VB 是否显着?很难猜测。
也不清楚你到底在追求什么。您可能正在寻找一个条目数组,文件中的每个块都有一个条目(其中块在仅包含反斜杠的行处结束),并且数组中的每个条目都是由前两个字母键入的哈希值(或第一个单词)在该行上,该行的其余部分是值。这是一个相当复杂的结构,可能超出了您在学习 Perl 的这个阶段所期望使用的结构。
你有这条线while ($line = <ifh>)
。如果您以老式方式打开文件,这在 Perl 中并不是无效的,但这不是您应该学习的方式。您没有显示输出文件句柄是如何打开的,但在尝试打印时确实使用了现代表示法。然而,这里也有一个错误:
print $ofh, $line; # Print two values to standard output
print $ofh $line; # Print one value to $ofh
您需要仔细查看代码,并考虑循环逻辑。我确信你所拥有的并不是你所需要的。但是,我不确定您确实需要什么。
更简单的解决方案
来自评论:
我想标记从 AA 开始的每条记录\
作为记录 0 到记录 n 并希望将其与所有记录号一起保存在一个新文件中。
那么你可能只需要:
#!/usr/bin/env perl
use strict;
use warnings;
my $recnum = 0;
while (<>)
{
chomp;
if (m/^\\$/)
{
print "$_\n";
$recnum++;
}
else
{
print "$recnum $_\n";
}
}
这将从命令行上指定的文件(或标准输入,如果没有)读取,并将标记的输出写入标准输出。它为除“记录结束”标记行之外的每一行添加记录编号和空格作为前缀。选择输出格式和文件处理以满足您的需求。你可能会争辩说chomp
会适得其反;你当然可以在没有它的情况下编写程序。
过于复杂的解决方案
在提问者没有明确指示的情况下制定的.
这是读取数据的一种可能的方法,但它使用中等高级的 Perl(哈希引用等)。这Data::Dumper
模块对于打印 Perl 数据结构也很有用(请参阅:perldoc Data::Dumper http://search.cpan.org/perldoc?Data%3a%3aDumper).
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @data;
my $hashref = { };
my $nrecs = 0;
while (<>)
{
chomp;
if (m/^\\$/)
{
# End of group - save to data array and start new hash
$data[$nrecs++] = $hashref;
$hashref = { };
}
else
{
m/^([A-Z]+)\s+(.*)$/;
$hashref->{$1} = $2;
}
}
foreach my $i (0..$nrecs-1)
{
print "Record $i:\n";
foreach my $key (sort keys $data[$i])
{
print " $key = $data[$i]->{$key}\n";
}
}
print Data::Dumper->Dump([ \@data ], [ '@data' ]);
输入示例的输出示例:
Record 0:
AA = c0001
BB = afsfjgfjgjgjflffbg
CC = table
DD = hhhfsegsksgk
EB = jksgksjs
Record 1:
AA = e0002
BB = rejwkghewhgsejkhrj
CC = chair
DD = egrhjrhojohkhkhrkfs
VB = rkgjehkrkhkh;r
$@data = [
{
'EB' => 'jksgksjs',
'CC' => 'table',
'AA' => 'c0001',
'BB' => 'afsfjgfjgjgjflffbg',
'DD' => 'hhhfsegsksgk'
},
{
'CC' => 'chair',
'AA' => 'e0002',
'VB' => 'rkgjehkrkhkh;r',
'BB' => 'rejwkghewhgsejkhrj',
'DD' => 'egrhjrhojohkhkhrkfs'
}
];
请注意,此数据结构并未针对除记录编号之外的搜索进行优化。如果您需要以其他方式搜索数据,那么您需要以不同的方式组织它。 (在没有完全理解的情况下,不要将此代码作为答案 - 它很微妙。它也不进行错误检查;小心错误的数据。)