开发者

What's happening in this Perl foreach loop?

开发者 https://www.devze.com 2022-12-28 05:10 出处:网络
I have this Perl code: foreach (@tmp_cycledef) { chomp; my ($cycle_code, $close_d开发者_如何学Pythonay, $first_date) = split(/\\|/, $_,3);

I have this Perl code:

foreach (@tmp_cycledef)
{
 chomp;
 my ($cycle_code, $close_d开发者_如何学Pythonay, $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) ];
}

The value of tmp_cycledef comes from output of an SQL query:

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

What exactly is happening inside the for loop?


Huh, I'm surprised no one fixed it for you :)

It looks like the person who wrote this was trying to trim leading and trailing whitespace from each field. It's a really odd way to do that, and for some reason he was overly concerned with interior whitespace in each field despite his anchors.

I think that should be the same as trimming the whitespace around the delimiter in the 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) ];
    }

The key to thinking about split is considering which parts of the string you want to throw away, not just what separates the fields that you want.


For regex part, s/^\s*(\S*(?:\s+\S+)*)\s*$/$1/ do stripping of leading and trailing whitespaces


Each row in @tmp_cycledef is composed of a string formatted following "cycle_code | close_day | first_date".

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

Split the string into three parts. The following regular expressions are used to strip leading and trailing whitespaces.

The last instruction of the loop creates an entry in the dictionary $cycledef indexed by $cycle_code. The entry is formated is formatted using the following scheme:

[ $close_day, YYYY, MM, DD ]

where $first_date = "YYYY-MM-DD".


@tmp_cycledef: The output of the sql query is stored in this array

foreach (@tmp_cycledef) : For every element in this array.

chomp : remove the \n char from the end of every element.

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

split the elements into 3 parts and assign the variable to each of the splited element. parts of split are "split(/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/;

This regex part is sripping of leading and trailing whitespaces from each variable.


my god, it's been such a long time since I've read perl... but I'll give it a shot.

you grab a record from @tmp_cycledef, and chomp off the newline at the end, and split it up into the three variables: then, like S.Mark said, each substitution regex strips off the leading and trailing whitespace for each of the three variable. Finally, the values get pushed into a hash as a list, with some debugging code commented out right above it.

hth


  • Your query gives a set of rows that are stored in the array @tmp_cycledef.
  • We iterate over each row in the result using: foreach (@tmp_cycledef).
  • The result rows might have trailing newline char, we get rid of them using chomp.
  • Next we split the row (which is not in $_) on the pipe and assign the first 3 pieces to $cycle_code, $close_day and $first_date respectively.
  • The split pieces might have leading and trailing white spaces, the next 3 lines are to remove the leading and trailing white space in the 3 variables.
  • Finally we make an entry into the hash %cycledef. The key use is $cycle_code and the value is an array whose first element is $close_day and rest of the elements are pieces got after splitting $first_date on hyphen.
0

精彩评论

暂无评论...
验证码 换一张
取 消