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

I have a CSV file I am manipulating into something that is readable by my other program. Perl has been a big help so far. There is a significant learning curve when it comes to dereferencing arrays and their contents. That is probably part of my problem.

I would like to initialize a new field in my CSV to receive extracted data when I parse an existing field. If there was always a result from the parse then I wouldn't have an "Use of uninitialized value in substitution" message later on.

How do I set a dereferenced array to ""?

Am I asking the right Question?

Right now the following doesn't work.

#Initialize to first character of first field, no warnings #Creates extra unneeded data. ($row->[15]) = $row->[0] =~ /(.)/; #This appears to match undefined and sets it to "", warnings #^ * matches null string many times in regex; marked by <--HERE in m/ +(^ * <-- HERE $) / at convertACsv.pl line 86. #Use of uninitialized value in substitution (s///) at convertACsv.pl l +ine 86, <_GEN_0> line 1. $row->[15] =~ s/ (^ *$) //gx; #This appears to match undefined and sets it to "", warnings #Use of uninitialized value in substitution (s///) at convertACsv.pl l +ine 86, <_GEN_0> line 1. $row->[15] =~ s/ (^z) //gx; #oops, dropped the "\" $row->[15] =~ s/ (^\z) //gx; #Why doesn't one of these work? ($row->[15]) = ""; ($row->[15]) = ("");

Replies are listed 'Best First'.
Re: Initialize or Match undef without warning
by u65 (Chaplain) on Dec 14, 2015 at 22:35 UTC

    I'm not sure I understand your exact problem but, assuming your $row ref comes from, say, Text::CSV, I would loop through existing fields (or whatever number of fields you want for the copied extended row), testing each for being defined. If a field is not defined, set it to the empty string, otherwise, extract or copy what you need.

    It would help greatly to see your program and some sample CSV data.

    Update: You should be able to set a non-existent cell in an array reference like this:

    $row->[15] = '';

      That! Solved the problem.

      It also created a problem. I had remarked out the assignment later on in the code. After adding it back in. It has made some of the fields undefined again. I think I need an OR in the extract regex now.

      # this initializes the field correctly $row->[15] = ''; # This overwrites the empty field with undefined if it doesn't match. ($row->[15]) = $row->[5] =~ /(#[^ ]+)/;
        # I changed this $row->[15] = ''; ($row->[15]) = $row->[5] =~ /(#[^ ]+)/; # to this and it does what I want $row->[15] = ''; if ($row->[5] =~ /#[^ ]+/) { ($row->[15]) = $row->[5] =~ /(#[^ ]+)/; }

        Is there a better, more compact way to do this that is still easy to read?