Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using "my" in "until" statement modifier resetting lexicals from outer scope #17103

Open
p5pRT opened this issue Jul 23, 2019 · 3 comments
Open

Comments

@p5pRT
Copy link

p5pRT commented Jul 23, 2019

Migrated from rt.perl.org#134303 (status was 'open')

Searchable as RT134303$

@p5pRT
Copy link
Author

p5pRT commented Jul 23, 2019

From choroba@matfyz.cz

Created by @choroba

As stated in the Subject​: using "my" in the "until" statement modifier resets
the lexical of the same name from outer scope.

See also https://www.perlmonks.org/?node_id=11103184 and especially
the reply https://www.perlmonks.org/?node_id=11103204 for more
details.

  #!/usr/bin/perl
  use warnings;
  use strict;

  warn $];

  our $our = 1;
  warn 'never' until $our = 6;
  warn "<< $our >>"; # 6

  my $mine = 1;
  warn 'never' until $mine = 6;
  warn "<< $mine >>"; # 6

  our $nil = 1;
  warn 'never' until my $nil = 6; # my !
  warn "<< $nil >>"; # undef

  my $null = 1;
  warn 'never' until my $null = 6; # my !
  warn "<< $null >>"; # undef

When using "if" instead of "until", the output is always "6".

Thanks to LanX who is normally to busy/lazy to report perlbugs

Ch.

Perl Info

Flags:
     category=core
     severity=medium

Site configuration information for perl 5.31.1:

Configured by choroba at Tue Jun 18 09:46:42 CEST 2019.

Summary of my perl5 (revision 5 version 31 subversion 1) configuration:
   Commit id: fa068f6da2218ae85bae1e26ee7591c15276555f
   Platform:
     osname=linux
     osvers=4.4.179-99-default
     archname=x86_64-linux-thread-multi
     uname='linux lenonovo 4.4.179-99-default #1 smp tue may 14 18:07:16 utc 2019 (c775d39) x86_64 x86_64 x86_64 gnulinux '
     config_args='-rdes -Dusethreads -Dprefix=~/blead -Dusedevel'
     hint=recommended
     useposix=true
     d_sigaction=define
     useithreads=define
     usemultiplicity=define
     use64bitint=define
     use64bitall=define
     uselongdouble=undef
     usemymalloc=n
     default_inc_excludes_dot=define
     bincompat5005=undef
   Compiler:
     cc='cc'
     ccflags ='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2'
     optimize='-O2'
     cppflags='-D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
     ccversion=''
     gccversion='4.8.5'
     gccosandvers=''
     intsize=4
     longsize=8
     ptrsize=8
     doublesize=8
     byteorder=12345678
     doublekind=3
     d_longlong=define
     longlongsize=8
     d_longdbl=define
     longdblsize=16
     longdblkind=3
     ivtype='long'
     ivsize=8
     nvtype='double'
     nvsize=8
     Off_t='off_t'
     lseeksize=8
     alignbytes=8
     prototype=define
   Linker and Libraries:
     ld='cc'
     ldflags =' -fstack-protector -L/usr/local/lib'
     libpth=/usr/local/lib /usr/lib64/gcc/x86_64-suse-linux/4.8/include-fixed /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib /lib64 /usr/lib64 /usr/local/lib64
     libs=-lpthread -lnsl -lgdbm -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
     perllibs=-lpthread -lnsl -ldl -lm -lcrypt -lutil -lc
     libc=libc-2.22.so
     so=so
     useshrplib=false
     libperl=libperl.a
     gnulibc_version='2.22'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs
     dlext=so
     d_dlsymun=undef
     ccdlflags='-Wl,-E'
     cccdlflags='-fPIC'
     lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'



@INC for perl 5.31.1:
     /home/choroba/blead/lib/perl5/site_perl/5.31.1/x86_64-linux-thread-multi
     /home/choroba/blead/lib/perl5/site_perl/5.31.1
     /home/choroba/blead/lib/perl5/5.31.1/x86_64-linux-thread-multi
     /home/choroba/blead/lib/perl5/5.31.1


Environment for perl 5.31.1:
     HOME=/home/choroba
     LANG=en_US.utf8
     LANGUAGE (unset)
     LC_CTYPE=en_US.UTF-8
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
     PATH=/home/choroba/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/home/jan.stepanek/perl5/bin:/home/jan.stepanek/opensource/worktime/bin:.
     PERL_BADLANG (unset)
     SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jul 31, 2019

From @tonycoz

On Tue, 23 Jul 2019 08​:00​:01 -0700, choroba@​matfyz.cz wrote​:

As stated in the Subject​: using "my" in the "until" statement modifier
resets
the lexical of the same name from outer scope.

See also https://www.perlmonks.org/?node_id=11103184 and especially
the reply https://www.perlmonks.org/?node_id=11103204 for more
details.

#!/usr/bin/perl
use warnings;
use strict;

warn $];

our $our = 1;
warn 'never' until $our = 6;
warn "<< $our >>"; # 6

my $mine = 1;
warn 'never' until $mine = 6;
warn "<< $mine >>"; # 6

our $nil = 1;
warn 'never' until my $nil = 6; # my !
warn "<< $nil >>"; # undef

my $null = 1;
warn 'never' until my $null = 6; # my !
warn "<< $null >>"; # undef

When using "if" instead of "until", the output is always "6".

Thanks to LanX who is normally to busy/lazy to report perlbugs

newLOOPOP() calls op_scope() to wrap the statement in an enter/leave pair, and since padsv does a save_clearsv() for the my variable, it's cleared by the leave.

Tony

@p5pRT
Copy link
Author

p5pRT commented Jul 31, 2019

The RT System itself - Status changed from 'new' to 'open'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants