Error in IsEqual subroutine in exiftool script

Started by jvradelis, April 14, 2013, 01:52:10 PM

Previous topic - Next topic

jvradelis

System type:  Mac
Exiftool version:  9.26
Command line:  /usr/bin/exiftool -l -X [filename].DNG
Error message:  Can't use string ("[filename].DNG") as an ARRAY ref while "strict refs" in use at /usr/bin/exiftool line 2814.

I think there may be a bad dereference in the IsEqual subroutine at line 2814 of exiftool.  I get the error message above when I run it on a DNG file, and Rob Cole's ExifMeta plugin fails to write the exifdata in Lightroom.  However, if I change line 2814 from

    return 0 if $$_[0][$i] ne $$_[1][$i];

to:

    return 0 if ${$_[0]}[$i] ne ${$_[1]}[$i];

the error message goes away, and exiftool appears to work as intended, and the plugin successfully reads and writes the data.

I don't think the original line is doing what you intend.  It's been quite a few years since I did any heavy lifting in Perl, but I think what's happening is that the $$ bind closely to _ (more closely than []) and Perl thinks you're trying to dereference _ as an array ref.  But _ isn't an array ref, it's an array.  If you add the braces as in the changed line, it causes _[0] and _[1] to be dereferenced as array refs (which they are at that point).

Don't know why I only seem to see this with DNG files, but it may be that DNGs have the filename as data while NEFs and JPGs do not.  Haven't been able to work that all the way through.





Phil Harvey

#1
Thanks for this report!

You're right.  Darn.  This bug was introduced in 9.25, which was a production version too.

It should have been:

    return 0 if $_[0][$i] ne $_[1][$i];

This will be fixed in 9.27.

Your code also works.  I'll have to think about why.

- Phil

Edit: Version 9.27 is now available.  Also, I'm back at work now and could check my "Programming Perl" reference book, and it says that "$LoL[1][2] is just a convenient way to write ${$LoL[1]}[2]".
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

jvradelis