如何使用Perl在相同的文本文件上读写

佩尔

我以读写模式(+ <)打开一个文件并遍历每行以保存上一行。基于上一行,我试图修改当前行,但似乎行不通。

我的输入:我有一个学生哈希,其中存在姓名,地址和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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章