perl 如何对文件内容进行添加

现在有个文件:
#Maths#
#Chinese#
#English#

我现在有一堆数据,比如说成绩,不同科目的成绩我想分类添加到相应行的后面去,格式为#XXX#XXX。

添加完之后为:
#Maths#99#89#.....
#Chinese#80#70#...
#English#77#88#....

求指导。。。
成绩获取是有个标志,是数学还是语文还是英语的。

"我现在有一堆数据" 是怎样的一堆, 内容是怎样的格式, 是一个档还是多个档, 多个档的话档案都怎样名命追问

可以理解为变量,我主要是想知道怎么将成绩按照类型添加到文件中,成绩我已经获取成功了,所以可以定义个hash,或怎么加变量到第一行后,第二行后。非常感谢。

追答

我主要想知道 "类型" 是甚麼 ? 怎样的类型 ? 怎样的结构 ? hash 是怎样的 hash ? 变量是怎样的变量? 内容是甚麼 ? 你只说著只有自己懂的状况, 没人帮到你的

追问

我只是想知道怎么把数据写到文件每一行后面,数据用变量存的,每次获取一个科目和成绩。

我根据科目知道要把成绩写到哪一行,但是不知道怎么指定写到文件某一行后面。

追答

"数据用变量存的", 从这句话我只能了解到你不是用纸笔写下来或是用手机拍下来的.. 但我依然不知道这 "变量" 是甚麼, 怎样的结构... ( 笼统点讲, 在编程里所有数据都是变量, 相对的只有 constant )

怎样为之 "每次" , 是每次都读同一个科目, 直到完了再到下一个科目? 还是 数学, 中文, 英文, 数学, 中文, 英文 地循环 ? (可能你最後告诉我"每次"其实是一个人的三个科目 ? )

以你的输入和输出格式而言, "怎么指定写到文件某一行后面" 是没有一个直接的办法能做得到的, 就算你用到最底层的 syswrite() 也做不到

无论如何, 我依然没法想像你的情况.. 要不你再想想该怎麼提问, 要不就能希望有其他人能帮到你了, Good Luck! =)

追问

基本上是perl先运行一个程序,获取到一个成绩和对应的科目,然后我就要把它存到文件对应的行后面,然后再运行同样的程序,再获取,这样子,每次获取到的可能是不一样的科目。
my $score = 90; //90是获取到的
my $type = "CHINESE"; //Chinese也是获取到的。

先谢谢了。

追答use utf8;

my $subjects={};
my $subFile="有个文件.txt";
my $outFile="添加完.txt";
my $extPerl="一个成绩和对应的科目.pl"; # 假设我从这里会得到一笔资料

sub getHash {
    # 你要在这里给出 $type 和 $score
    return ($type,$score);
}

sub loadSubjects {
    open F, $subFile or die "$! '$subFile'";
    my @data = <F>;        
    chomp @data;
    s/#//g foreach @data;
    $subjects->{$_}=[] foreach @data;
}

sub loadExisted {
    open F, $outFile or die "$! '$outFile'";
    my @data = <F>;
    chomp @data;
    foreach (@data) {
        s/^#(\w+)#(.+)$/$1-$2/;
        my ($sub, $sco) = split /-/, $_, 2;
        my @score = split /#/, $sco;
        @{$subjects->{$sub}}=@score;
    }
}

sub packOutput {
    open F, ">$outFile" or die "$! '$outFile'";
    for(sort keys %$subjects){
        my $write = join "#", @{$subjects->{$_}};
        print F "#$_#$write$/";
    }
}

#main
my $return = `perl "$extPerl"`;
my ($type,$score) = getHash($return);
loadSubjects;
loadExisted if (-e $outFile);
push @{$subjects->{$type}}, $score;
packOutput


 下次你最好不要再"基本上"了, 可以是"具体来说"吗 ?

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-05-02
  比如:
  my $content;
  my $file = $curdir."/score.txt";
  my $score_type = "CHINESE";
  my $score = 99;
  if(!-e $file)
  {
  open(FILE_TABLE,">>$file") or die "cannot open $file\n";
  syswrite(FILE_TABLE,"#MATHS\r\n");
  syswrite(FILE_TABLE,"#CHINESE\r\n");
  syswrite(FILE_TABLE,"#ENGLISH\r\n");
  close(FILE_TABLE);
  }
  
  open(FILE_R,"<$file") or die "cannot open $file\n";
  open(FILE_W,"+<$file") or die "cannot open $file\n";
  while(<FILE_R>)
  {
  chomp $_;
  if($score_type eq "MATHS")
  {
  if(/^#MATHS\s*/)
  {
  $content .= $_."#".$score."\n";
  }
  else
  {
  $content .= $_."\n";
  }
  }
  elsif($score_type eq "CHINESE")
  {
  
  if(/^#CHINESE\s*/)
  {
  $content .= $_."#".$score."\n";
  }
  else
  {
  $content .= $_."\n";
  }
  }
  elsif($score_type eq "ENGLISH")
  {
  if(/^#ENGLISH\s*/)
  {
  $content .= $_."#".$score."\n";
  }
  else
  {
  $content .= $_."\n";
  }
  }
  
  }
  print FILE_W $content;
  truncate(FILE_W, tell(FILE_W));
  close(FILE_R);
  close(FILE_W);

perl 如何对文件每一行进行添加内容
比如添加行号 my $H;open($H, $f) || die;my @cont = <$H>;my @cont_line = map {$_+1 . " " . $cont[$_]} 0..$#cont;close $H;open $H, '+>', $f;print $H join("\\n", @cont_line);close $H;

perl 如何在指定行插入字符串?
做个marker,从文件中每读入一行就让marker加1.当marker跟你的x行相同的时候。插入你需要插入的内容。举个简单的例子:open IN,"f:\/a.txt"||die $!; #读入文件 open OUT,">f:\/b.txt"||die $!; #输出文件 marker=0;x=5; #要插入的行 while(<IN>){ marker++;if($marker==5)...

用perl 语言,把一个文件里面的一部分内容写到另一个文件里的方法。谢谢...
如果只要求倒数第二列不重复,则:!\/usr\/bin\/perl# test.pluse strict;my %keys;while(<>) { my @ary = split \/\\t\/; if(! $keys{$ary[-2]}) { $keys{$ary[-2]} = 1; print "$ary[-2]\\t$ary[-1]"; }}如果要求两列都不重复,则:!\/usr\/bin\/perluse s...

如何在使用Perl来修改文本文件,要求在文件中出现字符('或,'时在中间...
给一个比较完美的方案:!perl -w use strict;AUTHOR: niejieqiang while (<>) { s\/('.*?')\/&rm($1)\/ge;print;} sub rm { my $str = $_[0];str=~s\/^\/N\/;return $str;}

如何用perl 在TXT文件中在第一列插入数值并删除 固定列后面其他的数值...
!#usr\/bin\/perl -w use strict;my $file=shift;open IN,"<",$file;while(<IN>){ my @line=split\/\\t\/,$_;print "插入数值\\t$line[0]\\$line[1]\\n"#不输出固定列后面的数值即可 }

怎样用perl添加数据到文件头部
不大的话可以这样。。。先写一个临时文件,临时文件里写helloworld 然后一行一行把原来文件写到临时文件里。删除原来的文件 把临时文件拷到原来文件那个地方 删除临时文件 完毕

perl 在某一个匹配行前面添加一行新的内容
!\/usr\/bin\/perl file = shift;matched = 0;newFile = "balabalabala_tmp";die "usage: .\/test.pl filename\\n" if !defined $file;open FD, "<$file" or die "can't open $file:$!";open TMP, ">$newFile";select TMP;while(<FD>) { line = $_;if(!$matched && \/nameserver...

档案存取Perl的档案存取
在Perl程式中,利用`open`指令进行档案操作。例如,`open FILE, "file.txt";`这一行代码能成功开启名为“file.txt”的档案。接着,通过小于符号``则用于向档案写入。在操作档案时,务必确保档案存在,否则可能会出现“开启档案失败:No such file or directory”的错误提示。在使用大于符号`>`时,若...

perl 可以对文件完成先遍历再修改的操作吗?
open(LOG,">>a.txt")a=<LOG>; #为了记录文件的行数 marker=0;while(<LOG>){ marker++;if ($marker eq scalar(@a)){ print LOG "输入你要添加的";} }

perl如何替换文本指定内容
【方法一】1.批量替换用sed:sed 's\/a\/b\/g' ##将a 换成b 2.批量替换文件内容方法,命令结构如下:find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g'3.下面例子将当前目录及所有子目录下的所有pom.xml文件的”http:\/\/repo1.maven.org\/maven2“...

相似回答