这个Perl foreach循环中发生了什么?

时间:2010-04-28 07:38:23

标签: perl

我有这个Perl代码:

foreach (@tmp_cycledef)
{
 chomp;
 my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);
 $cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
 $close_day  =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
 $first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;

 #print "$cycle_code, $close_day, $first_date\n";
 $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ];
}

tmp_cycledef的值来自SQL查询的输出:

select cycle_code,cycle_close_day,to_char(cycle_first_date,'YYYY-MM-DD')
  from cycle_definition d
  order by cycle_code;

for循环中究竟发生了什么?

6 个答案:

答案 0 :(得分:2)

嗯,我很惊讶没有人为你解决这个问题:)

看起来这个人写的是试图修剪每个字段的前导和尾随空格。这是一个非常奇怪的方式,并且由于某种原因,尽管他的锚定,他过分关注每个领域的内部空白。

我认为这应该与修剪split中分隔符周围的空白一样:

foreach (@tmp_cycledef)
    {
    s/^\s+//; s/$//; #leading and trailing whitespace on the whole string
    my ($cycle_code, $close_day, $first_date) = split(/\s*\|\s*/, $_, 3);

    $cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ];
    }

考虑split的关键是考虑要丢弃字符串的哪些部分,而不仅仅是将所需字段分开的部分。

答案 1 :(得分:0)

对于正则表达式部分,s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/会删除前导和尾随空格

答案 2 :(得分:0)

@tmp_cycledef中的每一行都由在“cycle_code | close_day | first_date”之后格式化的字符串组成。

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);

将字符串分成三部分。以下正则表达式用于去除前导和尾随空格。

循环的最后一条指令在由$cycledef索引的字典$cycle_code中创建一个条目。格式化的条目使用以下方案格式化:

[ $close_day, YYYY, MM, DD ]

其中$first_date = "YYYY-MM-DD"

答案 3 :(得分:0)

@tmp_cycledef:sql查询的输出存储在此数组

foreach (@tmp_cycledef):对于此数组中的每个元素。

chomp :从每个元素的末尾删除\ n char。

my ($cycle_code, $close_day, $first_date) = split(/\|/, $_,3);

将元素分成3个部分,并将变量分配给每个分裂元素。拆分的部分是“拆分(/ PATTERN /,EXPR,LIMIT)”

$cycle_code =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$close_day =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;
$first_date =~ s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/;

这个正则表达式部分是从每个变量中截取前导和尾随空格。

答案 4 :(得分:-1)

天哪,自从我读过perl以来已经很久了......但是我会试一试。

你从@tmp_cycledef中获取一条记录,然后在结尾处删除换行符,并将其拆分为三个变量:然后,就像S.Mark所说的那样,每个替换正则表达式都会删除每个变量的前导空格和尾随空格。三个变量。最后,将值作为列表推送到哈希中,并在其上方注释掉一些调试代码。

HTH

答案 5 :(得分:-1)

  • 您的查询提供了一组行 存储在数组中 @tmp_cycledef
  • 我们遍历每一行 结果使用:foreach (@tmp_cycledef)
  • 结果行可能有尾随 newline char,我们摆脱它们 使用chomp
  • 接下来我们split行(不是 在$_)管道上并分配 前3件到$cycle_code$close_day$first_date 分别
  • 分裂的部分可能具有领先优势 和尾随的空白,接下来的3 行是删除前导和 在3中拖尾空白 变量
  • 最后我们进入了 哈希%cycledef。关键用途是 $cycle_code,价值是 第一个元素是的数组 $close_day和其他元素 分裂后得到的碎片 连字符$first_date