免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2032 | 回复: 2
打印 上一主题 下一主题

perl脚本求教贴 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-22 16:07 |只看该作者 |倒序浏览
各位兄弟,在项目开发过程中,读前面不知多少年前的哪位哥们在shell脚本里留下的一段perl脚本。
我和周围的人都没有用过perl。所以不知道这段脚本到底做的时候。麻烦哪位亲帮忙看看,翻译翻译,不胜感谢:

  1. perl -e '
  2.      while (<>) { s/\|\s*$/ |/;  # make sure final | is preceded by space.
  3.              @A = split; if (!($#A == 5 && $A[1] =~ m/sph2pipe$/ &&
  4.                                $A[2] eq "-f" && $A[3] eq "wav" && $A[5] eq "|")) { exit(1); }
  5.              $utt = $A[0]; $sphere_file = $A[4];

  6.              if (!open(F, "<$sphere_file")) { die "Error opening sphere file $sphere_file"; }
  7.              $sample_rate = -1;  $sample_count = -1;
  8.              for ($n = 0; $n <= 30; $n++) {
  9.                 $line = <F>;
  10.                 if ($line =~ m/sample_rate -i (\d+)/) { $sample_rate = $1; }
  11.                 if ($line =~ m/sample_count -i (\d+)/) { $sample_count = $1; }
  12.                 if ($line =~ m/end_head/) { break; }
  13.              }
  14.              close(F);
  15.              if ($sample_rate == -1 || $sample_count == -1) {
  16.                die "could not parse sphere header from $sphere_file";
  17.              }
  18.              $duration = $sample_count * 1.0 / $sample_rate;
  19.              print "$utt $duration\n";
  20.      } '
复制代码



论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-12-22 17:26 |只看该作者
本帖最后由 sunzhiguolu 于 2016-12-22 20:46 编辑

  1. while (<>) {
  2.     s/\|\s*$/ |/;    #匹配以 "|" 字符串结尾的记录,允许行尾的空白; 将其替换为 " |" 的形式
  3.     @A = split;    #用空白字符分割每条记录,忽略前导空白字符
  4.     if (!($#A == 5 && $A[1] =~ m/sph2pipe$/ && $A[2] eq "-f" && $A[3] eq "wav" && $A[5] eq "|")) {
  5.     #如果 数组 @A 包含6个元素 并且 第二个元素以 "sph2pipe " 字符串结尾 并且 第三个元素等于 "-f" 字符串 并且 第四个元素等于 "wav" 字符串 并且最后一个元素等于 "|" 字符串的话, 执行取反操作
  6.     # 执行 exit 函数返回码为 "1";
  7.         exit(1);
  8.     }
  9.     #if 条件判断失败的话,执行如下语句;
  10.     $utt = $A[0];    #将第一个元素的值赋值给变量 $utt;
  11.     $sphere_file = $A[4];    #将第五个元素的值赋值给变量 $sphere_file

  12.     if (!open(F, "<$sphere_file")){    #如果打开文件失败的话, 抛出一个异常;
  13.         die "Error opening sphere file $sphere_file";
  14.     }
  15.    
  16.     $sample_rate = -1;    $sample_count = -1;    # 变量初始化操作
  17.     for ($n = 0; $n <= 30; $n++) {    #仅读取文件的前31行记录
  18.         $line = <F>;
  19.         if ($line =~ m/sample_rate -i (\d+)/){
  20.             $sample_rate = $1;
  21.         }
  22.         if ($line =~ m/sample_count -i (\d+)/) {
  23.             $sample_count = $1;
  24.         }
  25.         if ($line =~ m/end_head/) {
  26.             break;    #匹配此模式后退出 for 循环
  27.         }
  28.     }
  29.     close(F);    #关闭 F 文件句柄
  30.     if ($sample_rate == -1 || $sample_count == -1) {
  31.         die "could not parse sphere header from $sphere_file";    #变量 $sample_rate 或 $sample_count 任意一个依然保持初始化的值的话,抛出一个异常;
  32.     }
  33.     $duration = $sample_count * 1.0 / $sample_rate;
  34.     print "$utt $duration\n";    #打印结果
  35. }
复制代码
应该能够看懂了。

论坛徽章:
0
3 [报告]
发表于 2016-12-22 18:27 |只看该作者
回复 2# sunzhiguolu

万分感谢~有了你打注释简单多了,虽然没有学过perl,不过这段代码大概做什么是明白了~谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP