in reply to Re^4: foreach $1
in thread foreach $1

Hello choroba,

I dont see or understand how this last example demonstrate that $\ cant be used this way. I see all special variables working in the very same way as expected: how many we have seen foreach $a... dont use $a pattern?

All special vars have the same behaviour:

use strict; use warnings; while (<DATA>){ my $var = (split)[0]; { my $eval = "for $var ('OK '){ print $var }"; local $@; eval $eval; print "$eval\n"; if ( $@ ){ print "\nEVAL ERROR: $@\n"; } } } # data (with some modifications) from https://www.perlmonks.org/?node_ +id=353259 __DATA__ $NOT_AVAILABLE # A NON EXISTING SPECIAL VARIABLE $_ The default or implicit variable. $a sort comparison routine variables. $b sort comparison routine variables. $1 Regexp parenthetical capture holders. $2 Regexp parenthetical capture holders. $31 # JUST TO EXAGERATE $& Last successful match (degrades performance). ${^MATCH} Similar to $& without performance penalty. Requires /p mo +difier. $` Prematch for last successful match string (degrades performance) +. ${^PREMATCH} Similar to $` without performance penalty. Requires /p + modifier. $' Postmatch for last successful match string (degrades performance +). ${^POSTMATCH} Similar to $' without performance penalty. Requires / +p modifier. $+ Last paren match. $^N Last closed paren match (last submatch). $^R Last regexp (?{code}) result. ${^RE_DEBUG_FLAGS} Current value of regexp debugging flags. See use + re 'debug'; ${^RE_TRIE_MAXBUF} Control memory allocations for RE optimizations +for large alternations. ${^ENCODING} The object reference to the Encode object, used to con +vert the source code to Unicode. ${^OPEN} Internal use: \0 separated Input / Output layer informatio +n. ${^UNICODE} Read-only Unicode settings. ${^UTF8CACHE} State of the internal UTF-8 offset caching code. ${^UTF8LOCALE} Indicates whether UTF8 locale was detected at startu +p. $. Current line number (or record number) of most recent filehandle +. $/ Input record separator. $| Output autoflush. 1=autoflush, 0=default. Applies to currently s +elected handle. $, Output field separator (lists) $\ Output record separator. $" Output list separator. (interpolated lists) $; Subscript separator. (Use a real multidimensional array instead. +) $% Page number for currently selected output channel. $= Current page length. $- Number of lines left on page. $~ Format name. $^ Name of top-of-page format. $: Format line break characters $^L Form feed (default "\f"). $^A Format Accumulator $? Child error. Status code of most recent system call or pipe. $! Operating System Error. (What just went 'bang'?) $^E Extended Operating System Error (Extra error explanation). ${^CHILD_ERROR_NATIVE} Native status returned by the last pipe clos +e, backtick (`` ) command, successful call to wait() or waitpid(), or + from the system() operator. $$ Process ID $< Real user id of process. $> Effective user id of process. $( Real group id of process. $) Effective group id of process. $0 Program name. $^O Operating System name. $] Old: Version and patch number of perl interpreter. Deprecated. $^C Current value of flag associated with -c switch. $^D Current value of debugging flags $^F Maximum system file descriptor. $^I Value of the -i (inplace edit) switch. $^M Emergency Memory pool. $^P Internal variable for debugging support. $^R Last regexp (?{code}) result. $^S Exceptions being caught. (eval) $^T Base time of program start. $^V Perl version. $^W Status of -w switch ${^WARNING_BITS} Current set of warning checks enabled by use warni +ngs; $^X Perl executable name. ${^GLOBAL_PHASE} Current phase of the Perl interpreter. $^H Internal use only: Hook into Lexical Scoping. ${^TAINT} Taint mode read-only flag. ${^WIN32_SLOPPY_STAT} If true on Windows stat() won't try to open t +he file.

My personal opinion is that this behaviour is correct and no errors nor warnings should be raised: such vars are always present and are somthing like super globals (is for such reason we localize $@ if needed) and if someone doesnt know about special vars and is so fool to use them this way is not a perl problem.

I like special variables and I will even add more to the list (to obtain switches passed to perl like -l )

L*

There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

Replies are listed 'Best First'.
Re^6: foreach $1 -- all special variables
by LanX (Saint) on Jun 07, 2020 at 19:43 UTC
    > I dont see or understand how this last example demonstrate that $\ cant be used this way.

    Look at the output, a b c should show up as "line delimiters" when $\ is iterating thru but are ignored.

    OTOH when setting $" it does effect the internal delimiter of the array interpolation.

    It's hard to understand why iterating with one special var has an effect while the other doesn't. This is the opposite of orthogonal behavior.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      Hello LanX I probably miss the point.. but $\ becomes an alias of a b c d elements as in all previous cases, no?

      for $\ (qw( a b c d )) { print "@{[1, 2, 3]}"; } print $/; for $_ (qw( a b c d )) { print "@{[1, 2, 3]}"; } #output 1 2 31 2 31 2 31 2 3 1 2 31 2 31 2 31 2 3

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
        Please try $" not $_
        for $" (qw( a b c d )) { print "@{[1, 2, 3]}"; }

        I'm mobile so I can't show it myself

        Edit

        ... Wait, termux to the rescue :)

        $ perl for $" (qw( a b c d )) { print "@{[1, 2, 3]}"; } __END__ 1a2a31b2b31c2c31d2d3$

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery