tags:

views:

119

answers:

6

I have this Perl code:

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) ];
}

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?

A: 

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

S.Mark
thanks can you explain it furthur more clearly
Vijay Sarathi
$variable =~ s/something/somethingelse/ that is a substitution regex that finds something and replaces it with something else: there's plenty of stuff on regex's are formatted on the web.
thenoviceoof
Trimming whitespace is much easier with Scalar::Util::trim.
Ether
A: 

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

thenoviceoof
$cycledef{$cycle_code} = [ $close_day, split(/-/,$first_date) ]; can you tell me what is happening in this line?
Vijay Sarathi
Read Lohrun's post
thenoviceoof
A: 

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".

Lohrun
A: 

@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.

Space
why down vote?? If you think any issue with answer why you are not putting it here?
Space
A: 
  • 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.
codaddict
@Downvoter: Care to explain ?
codaddict
+2  A: 

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.

brian d foy