From 4442ba50ab98afc7c835af7ce61bb6b7c22275d9 Mon Sep 17 00:00:00 2001
From: Steve Hancock <perltidy@users.sourceforge.net>
Date: Mon, 8 Nov 2021 15:52:39 -0800
Subject: [PATCH] fix c104, error reformatting '$ 0'

---
 lib/Perl/Tidy/Formatter.pm |  2 +-
 local-docs/BugLog.pod      | 27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/lib/Perl/Tidy/Formatter.pm b/lib/Perl/Tidy/Formatter.pm
index f38cba87..08379196 100644
--- a/lib/Perl/Tidy/Formatter.pm
+++ b/lib/Perl/Tidy/Formatter.pm
@@ -6508,7 +6508,7 @@ sub respace_tokens {
                     # $sigil =~ /^[\$\&\%\*\@]$/ )
                     if ( $is_sigil{$sigil} ) {
                         $token = $sigil;
-                        $token .= $word if ($word);
+                        $token .= $word if ( defined($word) );  # fix c104
                         $rtoken_vars->[_TOKEN_] = $token;
                     }
                 }
diff --git a/local-docs/BugLog.pod b/local-docs/BugLog.pod
index d3bd2fd6..8f29937b 100644
--- a/local-docs/BugLog.pod
+++ b/local-docs/BugLog.pod
@@ -2,6 +2,33 @@
 
 =over 4
 
+=item B<Fix coding error, issue c104>
+
+Automated random testing produced an error with something like the following
+input line taken from an obfuscated perl script:
+
+    open(IN, $ 0);
+
+The '0' was missing in the output:
+
+    open( IN, $ );
+
+The tokenization was correct, but a line of code in the formatter which
+removes the space between the '$' and the '0' should have used a 'defined'
+when doing a check:
+
+    $token .= $word if ($word);             # OLD: error
+
+This if test fails on '0'. The corrected line is
+
+    $token .= $word if ( defined($word) );  # NEW: fixes c104
+
+This fixes the problem and gives the correct formatted result
+
+    open( IN, $0 );
+
+8 Nov 2021.
+
 =item B<Fix undefined variable reference, c102>
 
 Random testing produced an undefined variable reference for the following input
-- 
2.39.5