网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月18日漏签0天
perl吧 关注:5,585贴子:27,292
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 38回复贴,共1页
<<返回perl吧
>0< 加载中...

初学求帮助

  • 只看楼主
  • 收藏

  • 回复
  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有这么一串十六进制码 0026 0000 0008 02 00 00 00 00 00 00 1E
想用perl脚本把它们转化为T38 = {2,0,0,0,0,0,0,30},
其中38 是0026 的十进制数 0000是编号 0008代表后面为8个数据
就是把这八个十六进制数据转化为十进制 以上述T38......格式输出 。
希望给点意见


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#!/usr/bin/perl -w
$str="0026 0000 0008 02 00 00 00 00 00 00 1E";
@nums = split(" ",$str);
$res = "T".hex(shift(@nums))." = {";
$n = hex(shift(@nums));
$count = hex(shift(@nums));
for $item (@nums)
{
$res = $res.hex($item).",";
}
$res =~ s/,$/}/;
print $res;


2026-08-18 05:42:12
广告
不感兴趣
开通SVIP免广告
  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原文件 (input.raw):
0067 0000 000E 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0067 0001 000E 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0068 0000 000B 01 02 78 0F 0C 02 02 78 0F 0C 02
0069 0000 0012 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
输出文件 (output.txt)
.config_T103 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T103 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T104 = {1,2,120,15,12,2,2,120,15,12,2},
.config_T105 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
原文件中四位十六进制数分别对应输出文件中T后十进制数、编号(不输出)、两位十六进制数的个数(不输出)。把所有两位的十六进制数按输出文件格式转化为十进制。
要求实现方式:
./convert.pl input.raw output.txt
刚有点事抱歉 五楼来了 perl到文件操作不会 还有我的思路是调用3楼的函数, 逐行输出 ,不知到可不可行。谢谢!
@自由de王国


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#!perl -w
$input = shift @ARGV;
$output = shift @ARGV;
open FHINPUT,"$input";
open FHOUTPUT,">$output";
while(<FHINPUT>)
{
@nums = split(" ",$_);
$res = ".config_T".hex(shift(@nums))." = {";
$n = hex(shift(@nums));
$count = hex(shift(@nums));
for $item (@nums)
{
$res = $res.hex($item).",";
}
$res =~ s/,$/},/;
print FHOUTPUT "$res\n";
}
close FHINPUT;
close FHOUTPUT;


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#从命令行读参数
$input = shift @ARGV;
$output = shift @ARGV;
#将最后的","替换为“},”
$res =~ s/,$/},/;
#写入文件
print FHOUTPUT "$res\n";
至于那个for,就是系统帮你把@nums中的值赋给$item。
相当于
for(int i = 0; i <= $#nums; i++){
$item = $nums[i];
}


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
n是编号,count是后面二进制数的个数,我是怕你有用,所以才单列出来的。你去了以后结果一样?大括号中会多一个数吧?


  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#! /usr/bin/perl -w
$input = shift @ARGV;
$output = shift @ARGV;
open FHINPUT,"$input";
open FHOUTPUT,">$output";
while(<FHINPUT>)
{
@nums = split(" ",$_);
$res = ".config_T".hex(shift(@nums));
$n = hex(shift(@nums));
$count = hex(shift(@nums));
if ( $n ) {
$res = "$res _$n = {";
} else {
$res = "$res = {";
}
for $item (@nums)
{
$res = $res.hex($item).",";
}
$res =~ s/,$/},/;
print FHOUTPUT "$res\n";
}
close FHINPUT;
close FHOUTPUT;
还有两个问题:1、我想用编号区分一下(编号仅含0的T后不变、编号非0区分)就是形如如下输出:
.config_T103_0 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T103_1 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T104 = {1,2,120,15,12,2,2,120,15,12,2},
.config_T105 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
我自己加了句代码不能实现编号非0时的0号输出
2、运行脚本后T103后面会有空格(本意是不要有空格),如果程序写成$res = "$res_$n = {"; 又会报错;
上面到程序输出结果会变成
.config_T103 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T103 _1 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0},
.config_T104 = {1,2,120,15,12,2,2,120,15,12,2},
.config_T105 = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
求指导 @自由de王国


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第二个问题很简单:
$res = ".config_T".hex(shift(@nums))."_".hex(shift(@nums))." = {";
至于第一个问题,其实现在这样也不错啊。。而且所有的行都带编号的话,格式不是更整齐吗。
如果你一定要把0也输出的话,我觉得很麻烦啊。我现在想到的就是这个文件处理两遍,第一遍的时候把编号不止一个的存储下来,比如103。然后再读一遍文件,把不带_的103后面加上_0。


2026-08-18 05:36:12
广告
不感兴趣
开通SVIP免广告
  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#! /usr/bin/perl -w
$res = "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
$strLength = length($res);
my @results;
for ( $i = 0 ; $i < $strLength ; $i += 6 ) {
if ( $strLength < ( $i +=6 ) ) {
push @results, substr( $res,$i,( $strLength - $i ) );
} else {
push @results, substr( $res,$i,$i+=6 );
print "\n";
}
}
print "@results\n";
我想实现:
1,1,1
1,1,1
1,1,1
1,1,1
1,1
这样输出该怎么改 或是怎么重新写。求教@自由de王国


  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
修改下要求:输出每行是相同个数的数字和逗号(最后一行除外) 而不是相同个数的字符串
eg.
1,2,12,
1,1,1,
1,3,333,
1,3


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
$res = "1,1,1,1,61,1,5,154,4,1,1,51,1,61,1,1,1";
while($res =~ s/^(\d+,\d+,\d+),/$1\n/m){}
print $res;


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你每行末尾的,要不要?
要的话改成
while($res =~ s/^(\d+,\d+,\d+,)(?=\d+)/$1\n/m){}


  • 自由de王国
  • 签订契约
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
额,^$和/m完全不是一类东西。
^$是正则里的元字符,是正则表达式的一部分。
而/m是正则的修饰符,相当于正则引擎的选项的开关,/m会影响^$的表现。没有/m时,^$分别匹配字符串的开头和结尾,加了/m后,^$会匹配行的开头和结尾。
举个例子就是,对于文本
“adffds
sadf
sdf”
/^s/会匹配不到,因为文本开始是a
/^s/m则会匹配到第二行的s


  • 頎巾睂鎿
  • 不要扶他
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
还是原来的相关问题
原文件里有几行是多余的 且不是以”0000 0000 0000“这种形式输出的 我想剔除掉这些行再操作 我在while循环里加入 if ( <FHINPUT> =~ m/^/w/w/w/w /w/w/w/w /w/w/w/w/) {
。。。
}
但输出的数据会丢失不少 求指导!!!@自由de王国
#!perl -w
$input = shift @ARGV;
$output = shift @ARGV;
open FHINPUT,"$input";
open FHOUTPUT,">$output";
while(<FHINPUT>)
{
if ( <FHINPUT> =~ m/^/w/w/w/w /w/w/w/w /w/w/w/w/) {@nums = split(" ",$_);
$res = ".config_T".hex(shift(@nums))." = {";
$n = hex(shift(@nums));
$count = hex(shift(@nums));
for $item (@nums)
{
$res = $res.hex($item).",";
}
}
$res =~ s/,$/},/;
print FHOUTPUT "$res\n";
}
close FHINPUT;
close FHOUTPUT;


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 38回复贴,共1页
<<返回perl吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示