首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl优化建议

Perl优化建议
EN

Stack Overflow用户
提问于 2012-07-24 21:21:22
回答 2查看 142关注 0票数 1

我正在寻找关于如何优化这个perl脚本的建议。

我有这个脚本来做一些小的文件的格式调整。该脚本执行以下操作:

  1. 从STDIN读取分隔的文件
  2. 移除尾随空格,
  3. 移除“空”文本字符串
  4. 将日期列从"YYYYMMDD“格式转换为”YYYYMMDD“格式。
  5. 打印到STDOUT,并执行kluge以防止在数据为NULL时丢失最后一列数据。对于每一行,列的#必须是相同的。

示例输入:

代码语言:javascript
复制
.091590.S           |CHF|SWX|2011-05-23 00:00|                   77.25|                    NULL|                    NULL|      78.620000000000005|                NULL
.091590.S           |CHF|SWX|2011-05-24 00:00|      77.599999999999994|                    NULL|                    NULL|                   77.25|                NULL
.091590.S           |CHF|SWX|2011-05-25 00:00|      77.760000000000005|                    NULL|                    NULL|      77.599999999999994|                NULL
.091590.S           |CHF|SWX|2011-05-26 00:00|      77.430000000000007|                    NULL|                    NULL|      77.760000000000005|                NULL
.091590.S           |CHF|SWX|2011-05-27 00:00|      77.909999999999997|                    NULL|                    NULL|      77.430000000000007|                NULL
.091590.S           |CHF|SWX|2011-05-30 00:00|      78.060000000000002|                    NULL|                    NULL|      77.909999999999997|                3506

FormattingScript.pl col

它可以是单个数字,也可以是由逗号分隔的数字列表。此输入确定哪一列或哪些列需要日期转换。

代码语言:javascript
复制
@updcol = split(',',@ARGV[0]);

while (<STDIN>)
{
      s/.$/|DATAEND/g; ## USING THIS TO KEEP FROM TRUNCATING NULL LAST COLUMN
      s/^\s*//g;
      s/\s*$//g;
      s/\s*\|/\|/g;
      s/\|\s*/\|/g;
      s/\|NULL\|/\|\|/g;
      s/\|NULL\s*$/\|/g;
      s/\|NULL\s*/\|/g;
      s/\|NULL$/\|/g;
      @dataline = split('\|',$_);
if (@updcol[0] != 999) { ## REFORMAT DATES IF PARAM IS NOT 999
        foreach my $col (@updcol) {
        $dataline[$col]=substr($dataline[$col],0,4).substr($dataline[$col],5,2).substr($dataline[$col],8,2);
        }}
      $dataline[-1]="";
      $line=join('|',@dataline);
      print substr($line,0,-1)."\n";
}

exit 0;

示例输出:

代码语言:javascript
复制
.091590.S|CHF|SWX|2011-05-23 00:00|77.25|||78.620000000000005|
.091590.S|CHF|SWX|2011-05-24 00:00|77.599999999999994|||77.25|
.091590.S|CHF|SWX|2011-05-25 00:00|77.760000000000005|||77.599999999999994|
.091590.S|CHF|SWX|2011-05-26 00:00|77.430000000000007|||77.760000000000005|
.091590.S|CHF|SWX|2011-05-27 00:00|77.909999999999997|||77.430000000000007|
.091590.S|CHF|SWX|2011-05-30 00:00|78.060000000000002|||77.909999999999997|3506
EN

回答 2

Stack Overflow用户

发布于 2012-07-24 21:37:29

任何优化都将是微观的,这意味着您需要拿出基准测试,并开始测试不同的方法来做同样的事情。

清理代码比优化代码更有好处。

代码语言:javascript
复制
my @date_cols = split(/,/, shift(@ARGV));

while (<>) {
   #chomp;  # Redundant.
   my @fields = split(/\|/, $_, -1);

   for (@fields) {
      s/^\s+//;
      s/\s+\z//;
      s/^NULL\z//;
   }

   for (@fields[@date_cols]) {
      s/^(....)-(..)-(..).*/$1$2$3/s;
   }

   print(join('|', @fields), "\n");
}
票数 9
EN

Stack Overflow用户

发布于 2012-07-25 04:47:32

您可以使用Regexp::组装优化正则表达式。这将使您能够将所有正则表达式组合成一个正则表达式,该正则表达式的执行速度可能比运行多个正则表达式更快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11639490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档