Chinaunix

标题: 请教 文本文件转换的问题 [打印本页]

作者: yilong777jp    时间: 2005-01-05 17:20
标题: 请教 文本文件转换的问题
本帖最后由 yilong777jp 于 2010-10-24 17:19 编辑

有一段关于cpu的命令定义,怎样用一段程序来检测当MDR_LOAD <- 1, MDR_INST <- 0的语句存在时,c段的命令定义变成原先c段的命令内容和d段的命令内容*(就是节省了一段,下面的文本文件1,转变为文本文件2,)其他的不变。希望大家帮忙
1。R2 <- R1 + (R4)
作者: flw    时间: 2005-01-05 23:28
标题: 请教 文本文件转换的问题
请尽量把标题写得有意义一些。
作者: yilong777jp    时间: 2005-01-06 01:15
标题: 请教 文本文件转换的问题
我可能说的不太明白,我只是举一个例子,我刚接触perl,最近又遇到这个程序的困扰。希望得到版主和各位朋友的帮助。
作者: yilong777jp    时间: 2005-01-06 01:31
标题: 请教 文本文件转换的问题
这个是关于processor设计,有关pipeline技术的应用,把命令定义段数减少,可以降低cost的一个提案,为了可以达到自动化,需要类似上文的一个程序,由于刚接触perl,想了2天也没有什么头绪,抱着试试看的心理,请版主和各位大虾指点迷津。一点点思路也好~~(蛮着急的3夜没有睡觉了)
作者: apile    时间: 2005-01-06 08:30
标题: 请教 文本文件转换的问题
用個array把每一行存起來..然後針對每一行取比對..找到你要的那一行
時候,將array中下一個index..用splice刪除..並將內容放進找到的那一行..
作者: yilong777jp    时间: 2005-01-06 15:15
标题: 请教 文本文件转换的问题
本帖最后由 yilong777jp 于 2010-10-24 17:19 编辑

谢谢apile
作者: apile    时间: 2005-01-06 17:14
标题: 请教 文本文件转换的问题
你可以用array將整個文檔讀進來..
@ary = <FH>;;
然後利用
$idx = 0;
for(@ary){
  $idx++;
}
每次取出一行...
最後再將@ary寫進文件2...
會照順序排列的...不是很理解你的問題??
作者: yilong777jp    时间: 2005-01-06 18:18
标题: 请教 文本文件转换的问题
apile  可能没有注意 当第2个文本变化的时候,原先的第一个字母可能由d变成c了,我主要困惑在如何确定每一行的第一个字母
作者: apile    时间: 2005-01-06 18:43
标题: 请教 文本文件转换的问题
那還不簡單...當你找到該idx的時候..看一下他開頭的ascii數字(ord)
是多少..加一就好了...後面以此類推..用array就可以全部解決...
作者: yilong777jp    时间: 2005-01-06 19:42
标题: 请教 文本文件转换的问题
本帖最后由 yilong777jp 于 2010-10-24 17:19 编辑

读取每一行
作者: apile    时间: 2005-01-06 21:40
标题: 请教 文本文件转换的问题
上面那個...
@ary = <FH>;;
$idx = 0;
for(@ary)
{

$idx++;
}
你的perl基礎不夠...先看看learning perl後再開始寫..會比較容易上手
作者: yilong777jp    时间: 2005-01-06 21:43
标题: 请教 文本文件转换的问题
但是新的命令开始又是从a到z的顺序了,不是接着上面命令的顺序了。。。
作者: superdoctor    时间: 2005-01-07 12:46
标题: 请教 文本文件转换的问题
出差中,闲着无事,给你写一个吧


  1.   use strict;

  2.   my $i=0;
  3.   my $n=-3;
  4.   my @letter = ("a".."z");
  5.   @ARGV = glob "cpuinfo" or die "no file found";
  6.    $^I = "";
  7.    while (<>;) {
  8.      if($i==1){
  9.       s/^$letter[$n]: (.*)/ $1/;
  10.       $i++;
  11.       }
  12.      if(/MDR_LOAD <- 1, MDR_INST <- 0/){
  13.       chomp;
  14.       $i++;
  15.       }
  16.      if($i>;1){
  17.       s/^$letter[$n]: (.*)/$letter[$n-1]: $1/;
  18.       }

  19.      print;
  20.      $n++;
  21.    }

复制代码


  1. [root@mail workspace]# cat cpuinfo
  2. R2 <- R1 + (R4)
  3. opcode op_add_21_4
  4. comment proc_opcode := "01100110"; -- R2 <- R1+(R4)
  5. a: MDR <- mem[PC], PC <- PC + 1
  6. b: MAR_SRC <- R4, MAR_LOAD <- 1, ADDR_SEL <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  7. c: MDR_SRC <- MEM, MDR_LOAD <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  8. d: ALUs1_SRC <- R1, ALUs2_SRC <- MDR, ALU_FUNC <- alu_add, ALUOUT_DEST <- R2, ALUOUT_LOAD <- 1
  9. e: WB_DEST <- R2, REG_LOAD <- 1
  10. [root@mail workspace]#
  11. [root@mail workspace]# ./update_file.pl
  12. [root@mail workspace]# cat cpuinfo
  13. R2 <- R1 + (R4)
  14. opcode op_add_21_4
  15. comment proc_opcode := "01100110"; -- R2 <- R1+(R4)
  16. a: MDR <- mem[PC], PC <- PC + 1
  17. b: MAR_SRC <- R4, MAR_LOAD <- 1, ADDR_SEL <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  18. c: MDR_SRC <- MEM, MDR_LOAD <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1 ALUs1_SRC <- R1, ALUs2_SRC <- MDR, ALU_FUNC <- alu_add, ALUOUT_DEST <- R2, ALUOUT_LOAD <- 1
  19. d: WB_DEST <- R2, REG_LOAD <- 1
  20. [root@mail workspace]#

复制代码

应该合乎要求吧,跟行号无关 [/code]
作者: yilong777jp    时间: 2005-01-07 12:57
标题: 请教 文本文件转换的问题
运行了,根本不是你下面显示的那个~~~


作者: superdoctor    时间: 2005-01-07 13:39
标题: 请教 文本文件转换的问题
$^I learning perl里面有这个符号的说明

@ARGV = glob "cpuinfo" or die "no file found";
如果你的文件叫a.txt,并且在c:\目录下那么改为

@ARGV = glob "c:\a.txt" or die "no file found";   you kown?
作者: yilong777jp    时间: 2005-01-07 14:23
标题: 请教 文本文件转换的问题
您能说说思路么,我也学习学习
my $n=-3; 为什么是-3呀??表示后数第4行??
能说说么??
我现在手中没有教材呀。$^I什么意思,您就说说吧!!
总是说while (<> { 这一行有问题,怎么回事呢
作者: superdoctor    时间: 2005-01-07 14:57
标题: 请教 文本文件转换的问题
字母和@letter数组下标对应,你的文件前面都有三行是不包含首起字母的所以要-3

你看看是不是你拷贝的时候出现异常字符了,程序没有问题,我在linux下测试正常

$^I类似的符号Perl里面有非常多,还是找书来看吧
作者: yilong777jp    时间: 2005-01-07 15:15
标题: 请教 文本文件转换的问题
我明白您的意思了。但是cpu的命令有很多,这个只是一个例子,按您的程序的话,如果第前2行出现变化的话,就不能应用了。就是说a-z不一定出现在第2行的,我的意思是无论什么命令,只要读到那个语句,就把下行的内容加上,并把以下的行标改正。您能帮我看看我这个思路对么??
#!c:/perl/bin/perl
use strict;
my $idx = 0;
@ARGV = glob "C:\in.txt" or die "no file found";
while (<>{
  if(/^        ([a-z]): *(.*)/)
   {
     if(/MDR_LOAD <- 1, MDR_INST <- 0/)
    {
     $a=substr($idx,0,1);
     $idx+=1;
     $new=substr($idx,2);
     $stage=",";
     $idx.=$stage;
     $idx.=$new;
     $idx.=$stage;
     $cg="MDR_HAZARD <- 1"
     $idx.=$cg;

     $b=substr($idx,0,1);
     $b=chr(ord($b+1));
     $co=substr($idx+1,1);

     $idx+1=$b.$co;
     $idx++;
    }
     }
print;
$idx++;
}
作者: superdoctor    时间: 2005-01-07 15:23
标题: 请教 文本文件转换的问题
你改改就行了,简单的方法有--程序后面加参数,告诉程序a-z的行从第几行开始,然后变更相应的-3值

如果a-z行是连续的话就没有问题
作者: yilong777jp    时间: 2005-01-07 15:34
标题: 请教 文本文件转换的问题
-3??不能确定a段会出现在第3行的
您能帮我看看我上面的对么?
作者: superdoctor    时间: 2005-01-07 16:43
标题: 请教 文本文件转换的问题
你的程序到处是错误,而且你正则没学好啊

按照你的思路给你改了改,但这种思路我觉得太繁琐了,最好照我上个的那种算法


  1. use strict;

  2. my ($n);
  3. my $idx = 0;
  4. @ARGV = glob "cpuinfo" or die "no file found";
  5. while (<>;){
  6. if(/^([a-z])+: .*/)
  7. {
  8. if(/MDR_LOAD <- 1, MDR_INST <- 0/)
  9. {
  10. my @line = split(/:/, $_);
  11. chomp($line[1]);
  12. $n=ord($line[0]);
  13. print "$line[0]:$line[1]";
  14. $idx++;
  15. next;
  16. }
  17. my $need = $_;
  18. my @line2 = split(/:/,$need);
  19. if($idx >; 0 && ord($line2[0]) >; $n){     
  20. if(ord($line2[0]) == $n+1){
  21.   print ",$line2[1]";
  22.   next;
  23. }else{
  24. my $b = chr(ord($line2[0])-1);
  25. print "$b:$line2[1]";
  26. next;
  27. }
  28. }
  29. print;
  30. }
  31. #$idx++;
复制代码


  1. [root@mail workspace]# cat cpuinfo
  2. R2 <- R1 + (R4)
  3. opcode op_add_21_4
  4. comment proc_opcode := "01100110"; -- R2 <- R1+(R4)
  5. a: MDR <- mem[PC], PC <- PC + 1
  6. b: MAR_SRC <- R4, MAR_LOAD <- 1, ADDR_SEL <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  7. c: MDR_SRC <- MEM, MDR_LOAD <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  8. d: ALUs1_SRC <- R1, ALUs2_SRC <- MDR, ALU_FUNC <- alu_add, ALUOUT_DEST <- R2, ALUOUT_LOAD <- 1
  9. e: WB_DEST <- R2, REG_LOAD <- 1
  10. [root@mail workspace]# ./update_file2.pl
  11. a: MDR <- mem[PC], PC <- PC + 1
  12. b: MAR_SRC <- R4, MAR_LOAD <- 1, ADDR_SEL <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1
  13. c: MDR_SRC <- MEM, MDR_LOAD <- 1, MDR_INST <- 0, PC_INC <- 0, R2_PENDING <- 1, ALUs1_SRC <- R1, ALUs2_SRC <- MDR, ALU_FUNC <- alu_add, ALUOUT_DEST <- R2, ALUOUT_LOAD <- 1
  14. d: WB_DEST <- R2, REG_LOAD <- 1
复制代码

作者: yilong777jp    时间: 2005-01-07 17:48
标题: 请教 文本文件转换的问题
谢谢您,还是一头雾水,就是不明白为什么要设-3呢,看来我要从头学起了!!谢谢您的帮助~~
您有msn么,我的yilong0070701@msn.com.
希望能认识您这样的朋友~~
作者: superdoctor    时间: 2005-01-07 18:27
标题: 请教 文本文件转换的问题
my msn is supermicro_cn@hotmail.com
作者: yilong777jp    时间: 2005-01-08 20:34
标题: 请教 文本文件转换的问题
您的程序最后少个},不知道您是怎么执行的,我执行了,还是和原来一样呀没有变化!!
而且#$idx++;没什么意义吧?

错在哪里呢??  
$need = $_;表示的还是原来的那一行,并不是新的一行呀,读取下一行怎么执行呢?
作者: superdoctor    时间: 2005-01-10 09:52
标题: 请教 文本文件转换的问题
我的程序在拷贝的时候少了一个},你加上就可以

我第二个给你的程序是按照你的思路给你改的,程序无法更改原始文件的,而是直接将a-z行更新后输出到屏幕,你看我在程序后面运行时的例子就看得到

可以自己组合一下我的两个程序如果你一定要使用你自己的思路的话,或者最简单的是在第二个程序前面打开另外一个文件,然后将输出写到这个文件中,然后替换原始文件
作者: yilong777jp    时间: 2005-01-10 12:28
标题: 请教 文本文件转换的问题
第一个程序固然精妙。但是前3行的内容有时候是变化的,就是说a不一定是从第3行开始的,所以认为还是第2个的比较好!!
谢谢您 的指导~~




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2