Re: Bug report: "Use of uninitialized value $_ in print"
- From
Jeff King <peff@peff.net>
- Date
- Mar 2, 2018, 10:46 UTC
- Message-ID
- <20180302104608.GB11074@sigill.intra.peff.net>
- In-Reply-To
- <20180302070434.GG238112@aiede.svl.corp.google.com>
On Thu, Mar 01, 2018 at 11:04:34PM -0800, Jonathan Nieder wrote:
Show 17 quoted lines
> > Use of uninitialized value $_ in print at
> > /usr/lib/git-core/git-add--interactive line 1371, <STDIN> line 75.
> [...]
>
> Strange. The relevant line, for reference:
>
> $ dpkg-deb --fsys-tarfile git_2.11.0-3+deb9u2_amd64.deb |
> tar Oxf - ./usr/lib/git-core/git-add--interactive |
> sed -n '1370,1372 p'
>
> for (@{$hunk[$ix]{DISPLAY}}) {
> print; <---- this one
> }
>
> This is a foreach loop, so it's supposed to have set $_ to each value
> in the list @{$hunk[$ix]{DISPLAY}). So why is Perl considering it
> uninitialized?Because the array is full of "undef". See parse_diff(), which does this:
my @diff = run_cmd_pipe("git", @diff_cmd, "--", $path);
...
@colored = run_cmd_pipe(@display_cmd);
...
for (my $i = 0; $i < @diff; $i++) {
...
push @{$hunk[-1]{TEXT}}, $diff[$i];
push @{$hunk[-1]{DISPLAY}},
(@colored ? $colored[$i] : $diff[$i]);
}If the @colored output is shorter than the normal @diff output, we'll push a bunch of "undef" onto the DISPLAY array (the ternary there is because sometimes @colored is completely empty if the user did not ask for color).
-Peff