我以读写模式(+ <)打开一个文件并遍历每行以保存上一行。基于上一行,我试图修改当前行,但似乎行不通。
我的输入:我有一个学生哈希,其中存在姓名,地址和DOB。我有一个文件,学生信息放在开始(本地或国际)和结束标签之间。
请在我的输入txt文件下面找到:
+++++++++++++++++++++++++++ViSHWASCHOOL++++++++++++++++++++++++++
student database system.... xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
some text here.... filled with xxx
for school data security ++++++
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
/begin Local
Karen
""
mothername Mawna
fathername Gildixon
total_marks 400
percent 90% /end Local
/begin Local
John
""
fathername Alister
mothername Linda
total_marks 320
percent 72% /end Local
/begin Local
Katie
"24 lenin street florida us"
mothername Sandra
fathername Manwel
total_marks 450
percent 95% /end Local
/begin International
Boris
""
mothername laumra
fathername deaol
total_marks 490
percent 98% /end International
/begin International
hawo binco
"honko , china"
mothername ""
fathername ""
total_marks 500
percent 100% /end International
任务:现在我要做的是将学生文件中的所有地址都填写在学生姓名之后的空白处,然后按原样保留学生文件的所有空格和格式。
我的Perl代码:
use strict;
use warnings;
use Data::Dumper;
my %student_hash;
my $student_report = "StudentReport.csv";
%student_hash = (
'RollNummber1' => {
'studentname' => 'Boris',
'address' => ['Vietnam',
'local'
],
'DOB' => '5june2000'
},
'RollNummber2' => {
'studentname' => 'John',
'address' => [
'4th/floor',
'Culverdown/Street',
'WestHam',
'UK.',
],
'DOB' => '2feb2000'
},
'RollNummber3' => {
'studentname' => 'Karen',
'DOB' => '5march2000'
}
);
my $studentfile = "testfile.txt";
my @studenttype = ('International', 'Local');
foreach my $type (@studenttype) {
process_studentfile( $type, $studentfile );
}
print "\nStudent Files are now filled with addresses\n";
sub process_studentfile {
my $type = shift;
my $studentfile = shift;
open(my $file,'+<',$studentfile);
my $previous_line = "";
while(my $current_line = <$file>){
if($current_line =~ /""/) {
foreach my $key(%student_hash) {
foreach my $name(keys %{$student_hash{$key}}) {
if($previous_line =~ /$student_hash{$key}{'studentname'}/) {
print $file join(",",@{$student_hash{$key}->{address}});
}
}
}
$previous_line = $_;
}
}
close $file;
}
**注意:**我以不同的方式对此感到厌倦,但仍然无法完成任务。有人可以在不使用任何cpan模块的情况下提供帮助,允许使用标准模块吗?
在while ( <$fh> )
尝试重写的同时使用存在一个基本问题。因为那while
是基于定界符读取文件块$/
。但是文件以字节为单位工作。
来自perldoc open
:
通常,您不能使用任何一种读写模式来更新文本文件,因为它们具有可变长度的记录。有关
perlrun
更好的方法,请参见-i开关。
因此,如果您写不同的长度线,那么一切都会变得有些莫名其妙。对于文本文件,它只是效果不佳,因为您具有可变长度的“记录”。
您可以使用seek
来浏览文件,但要记住,您实际上是在按字节(字符)的基础上进行覆盖。
或者,只需使用一个临时文件,并在完成后将其复制到您的源上即可。这是做什么的-i
。(这也意味着您损坏数据的风险要低得多,因为如果出现问题,您可以优雅地纾困)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句