Pan20 has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have a problem with my code. As I'm trying to extract the date before I insert the data into a table using sql code. I'm trying to extract data from a string to get the date, using the array function. The problem is that when it runs it only takes the first row of the file and going into an infinite loop inserting the 1st row. Any ideas why is doing this ? how can I get the date for each row inserted to the table ?

$csv = Text::CSV->new(); while (<FILE>) { if ($count ==0) { } else { $status = $csv->parse($_); @data = $csv->fields(); $done=0; $retry=0; while($done==0) { # convert timestamp to date @timestamp = split (" ",$data[7]); $day=$timestamp[2]; $month1=$timestamp[1]; $month = $mon2num{lc substr($month1,0,3)}; $year=$timestamp[5]; $date = "$day/$month/$year"; $query = " INSERT INTO DigitalB_Master (date +,julianday,mac_address,enterprise_id,enterprise_name,group_id ,group_ +name,device_name ,device_type) ". " Values ('$date','$jd','$data[6]', +'$data[0]','$data[1]','$data[2]','$data[3]','$data[4]', '$data[5]')" +. " ON DUPLICATE KEY UPDATE ". "enterprise_id='$data[0]',". "enterprise_name='$data[1]',". "group_id='$data[2]',". "group_name='$data[3]',". "device_name='$data[4]',". "device_type='$data[5]';"; print ($query."\n"); my $sth = $dbh->prepare($query); $sth->execute();

Replies are listed 'Best First'.
Re: Perl Array issue.
by tobyink (Canon) on May 07, 2012 at 07:19 UTC

    You never increment $done (or at least you don't in the incomplete code shown above). Therefore $done is always zero, and while($done==0) will keep looping.

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

      Hi tobyink , how can I increment $done ? don't you think that my @timestamp array is causing the infinite loop,because without this piece of code it works, how can I make the array stop at the end of the string, Thanks.

        Let's back up a step: what's the purpose of your inner while loop? Is there a reason you might want to insert some records from your input file multiple times? If not, then you don't need that while loop (or $done or $retry). Just loop through your CSV file record by record as you're doing, and for each record, do whatever processing you need to do on the fields and insert it into your database.

        Aaron B.
        My Woefully Neglected Blog, where I occasionally mention Perl.

        ++ is the increment operator. You can also use = to assign a nonzero value if you like.