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

just seems that I'm braindead today. Why does this piece of code break?

#!perl -w use strict; my @c = q' # % ( / 3 6 7 @ B C G Q R ^ s t ~ '; print $c[2]; # breaks into : # Use of uninitialized value in print at line 6.

I even tried to join the array with this:

print join ('|', @c); # results in: # % ( / 3 6 7 @ B C G Q R ^ s t ~

where am I going wrong? I guess there is something special about the characters?

The qw() operator works as far as joining the array, but breaks with -w and gives this warning.

Possible attempt to put comments in qw() list at line 4.

He who asks will be a fool for five minutes, but he who doesn't ask will remain a fool for life.

Chady |

Edit by tye to change title

Replies are listed 'Best First'.
Re: Problem with Quoting
by tadman (Prior) on Jul 07, 2001 at 12:08 UTC
    Your use of q instead of qw is probably the issue. You are assigning a single string to @c, and then trying to extract the third value (index 2) which isn't defined.
    my @c = qw' # % ( / 3 6 7 @ B C G Q R ^ s t ~ ';
    It's one of those "off-by-one" letter errors.

    Update: LD2 helped point out that this will generate a warning "Possible attempt to put comments in qw() list" when run with '-w' and 'strict', although it does print '(' as being $c[2]. I'm upgrading to 5.6.1 from 5.6.0 on the test system right now just to make sure there's no additional problems.
    Update2: No additional problems in 5.6.1. It runs with the same '-w' warning about comments.
Re: Problem with Quoting
by Zaxo (Archbishop) on Jul 07, 2001 at 20:46 UTC

    You can get rid of the warning with:

    my @c = split " ", q{ # % ( / 3 6 7 @ B C G Q R ^ s t ~ };

    This warning about a legal construct in qw seems to me like a bug in Perl. It's bad enough when gcc is helpful like that, but Perl warnings often go into some log file each time the script is run.

    After Compline,

(tye)Re: Problem with Quoting
by tye (Sage) on Jul 08, 2001 at 06:13 UTC

    I'd probably write that as: my @c= split //, q'#%(/367@BCGQR^st~'; but you could also use: my @c= ( '#', qw' % ( / 3 6 7 @ B C G Q R ^ s t ~ ' );

    Note that perlop.pod documents this right there under qw:

    A common mistake is to try to separate the words with comma or to put comments into a multi-line C<qw>-string. For this reason, the use warnings pragma and the -w switch (that is, the $^W variable) produces warnings if the STRING contains the "," or the "#" character.
    so "don't do that". /:

            - tye (but my friends call me "Tye")
Re: Using # inside qw()
by wind (Priest) on Aug 16, 2014 at 08:04 UTC
    You can turn the warnings off for your usage of qw
    use strict; use warnings; my @c = do { no warnings 'qw'; qw' # % ( / 3 6 7 @ B C G Q R ^ s t ~ ' }; print $c[2];
    - Miller
      Hah, these days I dd()umper everything, no warnings either :)
      my @c = ( "#", "%", "(", "/", 3, 6, 7, "\@", "B", "C", "G", "Q", "R", "^", "s", "t", "~", );
      naturally I perltidy also