现在有个文件:#Maths##Chinese##English#我现在有一堆数据,比如说成绩,不同科目的成绩我想分类添加到相应行的后面去,格式为#XXX#XXX。添加完之...
现在有个文件:
#Maths#
#Chinese#
#English#
我现在有一堆数据,比如说成绩,不同科目的成绩我想分类添加到相应行的后面去,格式为#XXX#XXX。
添加完之后为:
#Maths#99#89#.....
#Chinese#80#70#...
#English#77#88#....
求指导。。。
成绩获取是有个标志,是数学还是语文还是英语的。
我主要想知道 "类型" 是甚麼 ? 怎样的类型 ? 怎样的结构 ? 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
下次你最好不要再"基本上"了, 可以是"具体来说"吗 ?
比如:
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);