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

Hi,

Right, noob here of sorts. Ill try and be brief.

I have a piece of code that loops through a csv sheet and parses th data. In particular, I need the date to increment when the time is 23:xx:xx in a corresponding cell (long story to do with GMT/BST I wont get into)

So, a line of data being fed into the script looks like this.


program,xx.xx.xx.xx,28/05/08,23:48:31,28/05/08,17:53,data

I stick each line in an array seperated by the comma. I then access the relevant area of the array.

foreach(<FH1>) { my @test = split(); $date = $test[2]; $first_seen = $test[3]; if ($first_seen = /(23\:\d{1,2}\:\d{1,2})/) { $first_seen = $1; $first_seen =~ s/23/00/i; my $delim = "/"; my ($day,$month,$year) = split($delim, $date); $day++; my $new_day = join "/", "$day","$month","$year"; ##splice(@test, 3, "$new_day");

Now, the last line is the problem. I try adn stick that back in the array, but i get this warning.


Argument "29/05/08" isn't numeric in splice at abc.pl line 28, <FH1> line 251.

The script doesnt die....but the 4th Element of the array is missing(the spliced bit) and its critical its there.

Any ideas of how to force it into the array? Make perl see it as a string perhaps?

Replies are listed 'Best First'.
Re: Warnings - Argument isnt numneric
by moritz (Cardinal) on Jul 08, 2008 at 09:10 UTC
    Look at the splice documentation - if there is a third argument, it's interpreted as the length of the splice. So you have to pass a length argument - if you want to insert, the length (of the replaced list) is 0.
      gents,

      Yes, @test does contain what I think it does. The actual file in question was once an excel i think, and i slit on whites[ace. I added the comma's in for clarity.

      ill look up the splice docs first. I have Programming perl sitting here and i didnt see a thing in ti about the 3rd argument.

      Failing that, I will investigate datetime module.
        moritz is right. To insert the value in $new_day before the 4th element of @test, you need
        splice(@test, 3, 0, $new_day);

        It reads as: "Replace 0 elements of @test starting at index 3 with the single value $new_day". See splice.

Re: Warnings - Argument isnt numneric
by Corion (Patriarch) on Jul 08, 2008 at 09:08 UTC

    Are you sure that @test contains what you think it does?

    You assign to @test in line three:

    my @test = split();

    See split for what that does - it splits on whitespace. I can't reproduce your exact error case from the data you posted, but splitting on "," (comma) works for me:

    use strict; foreach(<DATA>) { my @test = split(/,/); my $date = $test[2]; my $first_seen = $test[3]; if ($first_seen = /(23\:\d{1,2}\:\d{1,2})/) { $first_seen = $1; $first_seen =~ s/23/00/i; my $delim = "/"; warn $date; my ($day,$month,$year) = split($delim, $date); warn $day; $day++; my $new_day = join "/", $day,$month,$year; warn $new_day; ##splice(@test, 3, "$new_day"); }; }; __DATA__ program,xx.xx.xx.xx,28/05/08,23:48:31,28/05/08,17:53,data

    Also note that you don't need to add double quotes around $day etc. - Perl knows that you intend to treat them as strings. You might be interested in DateTime or any of the other date handling modules though - especially when dealing with timestamps spanning a day change, I find real timestamps more convenient. Consider what happens on the change from 31st of May to 1st of June.