Skip Menu |
Report information
Id: 132485
Status: open
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: eda [at] waniasset.com
Cc:
AdminCc:

Operating System: Linux
PatchStatus: (no value)
Severity: low
Type: core
Perl Version: 5.22.2
Fixed In: (no value)



Subject: Old package separator syntax
Date: Wed, 22 Nov 2017 16:03:34 +0000
From: Ed Avis <eda [...] waniasset.com>
To: "'perlbug [...] perl.org'" <perlbug [...] perl.org>
Download (untitled) / with headers
text/plain 7.8k
Download (untitled) / with headers
text/html 16.2k

Message body is not shown because it is too large.

RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 7.7k
Repeating message text since not shown in web interface. For a long time the normal way to write the package separator in variable names has been :: but the older ' form is still accepted. (I believe that the newer form came in with Perl 5 but I am not sure; anyhow it certainly predates my first use of Perl twenty years ago.) A gotcha with ' has long been mentioned in the Camel book: "This is $owner's house" That parses the same as $owner::s and you get a warning at run time, so you can work out what is going on, but it is quite strange if you didn't know about the old ' package separator syntax. (I did know about it but I still fell into the trap of writing code like the above.) Might it be time to mark the old package separator as deprecated? That would allow a compile time (rather than run time) diagnostic on the use of it. Eventually, once the old syntax is removed, "$owner's house" would work as expected. The suggestion to deprecate things can trigger fierce discussion, so as a fallback position I would advocate a warning when the ' form is used inside a doublequote-interpolated string. --- Flags: category=core severity=low --- Site configuration information for perl 5.22.2: Configured by Red Hat, Inc. at Fri Nov 4 14:35:02 UTC 2016. Summary of my perl5 (revision 5 version 22 subversion 2) configuration: Platform: osname=linux, osvers=4.7.9-200.fc24.x86_64, archname=x86_64-linux-thread-multi uname='linux buildvm-12.phx2.fedoraproject.org 4.7.9-200.fc24.x86_64 #1 smp thu oct 20 14:26:16 utc 2016 x86_64 x86_64 x86_64 gnulinux ' config_args='-des -Doptimize=none -Dccflags=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Dldflags=-Wl,-z,relro -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro -Dlddlflags=-shared -Wl,-z,relro -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.22.2 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize' hint=recommended, useposix=true, d_sigaction=define useithreads=define, usemultiplicity=define use64bitint=define, use64bitall=define, uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', optimize=' -g', cppflags='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include' ccversion='', gccversion='5.3.1 20160406 (Red Hat 5.3.1-6)', 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='gcc', ldflags ='-Wl,-z,relro -fstack-protector-strong -L/usr/local/lib' libpth=/usr/local/lib64 /lib64 /usr/lib64 /usr/local/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib libs=-lpthread -lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat perllibs=-lpthread -lresolv -lnsl -ldl -lm -lcrypt -lutil -lc libc=libc-2.22.so, so=so, useshrplib=true, libperl=libperl.so gnulibc_version='2.22' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,--enable-new-dtags -Wl,-z,relro ' cccdlflags='-fPIC', lddlflags='-shared -Wl,-z,relro -L/usr/local/lib -fstack-protector-strong' Locally applied patches: Fedora Patch1: Removes date check, Fedora/RHEL specific Fedora Patch3: support for libdir64 Fedora Patch4: use libresolv instead of libbind Fedora Patch5: USE_MM_LD_RUN_PATH Fedora Patch6: Skip hostname tests, due to builders not being network capable Fedora Patch7: Dont run one io test due to random builder failures Fedora Patch15: Define SONAME for libperl.so Fedora Patch16: Install libperl.so to -Dshrpdir value Fedora Patch22: Document Math::BigInt::CalcEmu requires Math::BigInt (CPAN RT#85015) Fedora Patch26: Make *DBM_File desctructors thread-safe (RT#61912) Fedora Patch27: Make PadlistNAMES() lvalue again (CPAN RT#101063) Fedora Patch28: Make magic vtable writable as a work-around for Coro (CPAN RT#101063) Fedora Patch29: Fix duplicating PerlIO::encoding when spawning threads (RT#31923) Fedora Patch30: Do not let XSLoader load relative paths (CVE-2016-6185) Fedora Patch31: Avoid loading optional modules from default . (CVE-2016-1238) Fedora Patch32: Fix a crash in lexical scope warnings (RT#128597) Fedora Patch33: Do not mangle errno from failed socket calls (RT#128316) Fedora Patch34: Fix crash in "evalbytes S" (RT#129196) Fedora Patch35: Fix crash in "evalbytes S" (RT#129196) Fedora Patch36: Fix crash in "evalbytes S" (RT#129196) Fedora Patch37: Fix crash in splice (RT#129164, RT#129166, RT#129167) Fedora Patch38: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) Fedora Patch39: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) Fedora Patch40: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) Fedora Patch41: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) Fedora Patch42: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267) Fedora Patch43: Fix crash when matching UTF-8 string with non-UTF-8 substrings (RT#129350) Fedora Patch44: Fix parsing perl options in shell bang line (RT#129336) Fedora Patch45: Fix firstchar bitmap under UTF-8 with prefix optimization (RT#129950) Fedora Patch46: Avoid infinite loop in h2xs tool if enum and type have the same name (RT130001) Fedora Patch47: Fix stack handling when calling chdir without an argument (RT#129130) Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux --- @INC for perl 5.22.2: /home/eda/lib64/perl5/ /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 --- Environment for perl 5.22.2: HOME=/home/eda LANG=en_GB.UTF-8 LANGUAGE (unset) LC_COLLATE=C LC_CTYPE=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8 LC_MONETARY=en_GB.UTF-8 LC_NUMERIC=en_GB.UTF-8 LC_TIME=en_GB.UTF-8 LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/eda/bin:/home/eda/bin:/home/eda/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/sbin:/home/eda/.local/bin:/home/eda/bin:/sbin:/usr/sbin:/sbin:/usr/sbin PERL5LIB=/home/eda/lib64/perl5/ PERL_BADLANG (unset) SHELL=/bin/bash
Subject: Re: [perl #132485] Old package separator syntax
To: perl5-porters [...] perl.org
From: Glenn Golden <gdg [...] zplane.com>
Date: Wed, 22 Nov 2017 10:17:05 -0700
Download (untitled) / with headers
text/plain 1.3k
Ed Avis <perlbug-followup@perl.org> [2017-11-22 08:04:05 -0800]: Show quoted text
> > For a long time the normal way to write the package separator in > variable names has been :: but the older ' form is still accepted. > > (I believe that the newer form came in with Perl 5 but I am not sure; > anyhow it certainly predates my first use of Perl twenty years ago.) > > A gotcha with ' has long been mentioned in the Camel book: > > "This is $owner's house" > > That parses the same as $owner::s and you get a warning at run time, so > you can work out what is going on, but it is quite strange if you didn't > know about the old ' package separator syntax. (I did know about it but > I still fell into the trap of writing code like the above.) > > Might it be time to mark the old package separator as deprecated? > > The suggestion to deprecate things can trigger fierce discussion, so as > a fallback position I would advocate a warning when the ' form is used > inside a doublequote-interpolated string. >
+1 from the Moron Gallery for deprecation, or improving the emitted message ("Name 'owner::s' used only once: possible typo at..."). This is one of our favorite forms of periodic self-mystification: We do it juuust infrequently enough to exceed our recollection horizon as to the cause, but the message text isn't quite sufficient to (re)make the mental connection to the old syntax.
To: Perl5 Porteros <perl5-porters [...] perl.org>
From: Chad Granum <exodist7 [...] gmail.com>
Date: Wed, 22 Nov 2017 10:11:40 -0800
Subject: Re: [perl #132485] Old package separator syntax
CC: bugs-bitbucket [...] rt.perl.org
Download (untitled) / with headers
text/plain 9.8k
Download (untitled) / with headers
text/html 11.6k
I agree that it would be good to get rid of ' as a package separator, that said there are a few things that this will break, mostly ACME or other silly modules, but some serious.

Off the top of my head:

isn't (isn::t) as defined by Test::More since the dawn of time (I did not add this, it is legacy from before my time). At the very least Test::More would need a patch to define it without the ' on perl's that have no ' separator. I do not think isn't(...) ever saw widepsread usage, but it may have, so there could also be a ton of tests to clean up.

This also bring up the point that a lot of modules that take module names as arguments support ', that is not so much a problem, what is a problem is any tests they have to verify the support, those may break depending on how they are implemented.

Here is a silly one that will still work, but the intended usage form breaks (I wrote this one): https://metacpan.org/pod/Fuckin::Lazy#Fuckin'Lazy($var)

That said, I think the benefit of ditching the ' package separator outweighs the comedic benefit, and the trouble to fix things that currently use/recommend it.

Final note: I wonder if it something that can be turned off via a pragma? use strict 'separator'; perhaps (and maybe make it a default, where using strict makes it deprecated?)

-Chad

On Wed, Nov 22, 2017 at 8:04 AM, Ed Avis <perlbug-followup@perl.org> wrote:
Show quoted text
# New Ticket Created by  "Ed Avis"
# Please include the string:  [perl #132485]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=132485 >


For a long time the normal way to write the package separator in variable names has been :: but the older ' form is still accepted.

(I believe that the newer form came in with Perl 5 but I am not sure; anyhow it certainly predates my first use of Perl twenty years ago.)



A gotcha with ' has long been mentioned in the Camel book:



    "This is $owner's house"



That parses the same as $owner::s and you get a warning at run time, so you can work out what is going on, but it is quite strange if you didn't know about the old ' package separator syntax.  (I did know about it but I still fell into the trap of writing code like the

above.)



Might it be time to mark the old package separator as deprecated?

That would allow a compile time (rather than run time) diagnostic on the use of it.  Eventually, once the old syntax is removed, "$owner's house" would work as expected.



The suggestion to deprecate things can trigger fierce discussion, so as a fallback position I would advocate a warning when the '

form is used inside a doublequote-interpolated string.



---

Flags:

    category=core

    severity=low

---

Site configuration information for perl 5.22.2:



Configured by Red Hat, Inc. at Fri Nov  4 14:35:02 UTC 2016.



Summary of my perl5 (revision 5 version 22 subversion 2) configuration:



  Platform:

    osname=linux, osvers=4.7.9-200.fc24.x86_64, archname=x86_64-linux-thread-multi

    uname='linux buildvm-12.phx2.fedoraproject.org 4.7.9-200.fc24.x86_64 #1 smp thu oct 20 14:26:16 utc 2016 x86_64 x86_64 x86_64 gnulinux '

    config_args='-des -Doptimize=none -Dccflags=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches  -m64 -mtune=generic -Dldflags=-Wl,-z,relro  -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro  -Dlddlflags=-shared -Wl,-z,relro  -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.22.2 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallu
 srbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize'

    hint=recommended, useposix=true, d_sigaction=define

    useithreads=define, usemultiplicity=define

    use64bitint=define, use64bitall=define, uselongdouble=undef

    usemymalloc=n, bincompat5005=undef

  Compiler:

    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',

    optimize='  -g',

    cppflags='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include'

    ccversion='', gccversion='5.3.1 20160406 (Red Hat 5.3.1-6)', 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='gcc', ldflags ='-Wl,-z,relro  -fstack-protector-strong -L/usr/local/lib'

    libpth=/usr/local/lib64 /lib64 /usr/lib64 /usr/local/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib

    libs=-lpthread -lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat

    perllibs=-lpthread -lresolv -lnsl -ldl -lm -lcrypt -lutil -lc

    libc=libc-2.22.so, so=so, useshrplib=true, libperl=libperl.so

    gnulibc_version='2.22'

  Dynamic Linking:

    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,--enable-new-dtags -Wl,-z,relro '

    cccdlflags='-fPIC', lddlflags='-shared -Wl,-z,relro  -L/usr/local/lib -fstack-protector-strong'



Locally applied patches:

    Fedora Patch1: Removes date check, Fedora/RHEL specific

    Fedora Patch3: support for libdir64

    Fedora Patch4: use libresolv instead of libbind

    Fedora Patch5: USE_MM_LD_RUN_PATH

    Fedora Patch6: Skip hostname tests, due to builders not being network capable

    Fedora Patch7: Dont run one io test due to random builder failures

    Fedora Patch15: Define SONAME for libperl.so

    Fedora Patch16: Install libperl.so to -Dshrpdir value

    Fedora Patch22: Document Math::BigInt::CalcEmu requires Math::BigInt (CPAN RT#85015)

    Fedora Patch26: Make *DBM_File desctructors thread-safe (RT#61912)

    Fedora Patch27: Make PadlistNAMES() lvalue again (CPAN RT#101063)

    Fedora Patch28: Make magic vtable writable as a work-around for Coro (CPAN RT#101063)

    Fedora Patch29: Fix duplicating PerlIO::encoding when spawning threads (RT#31923)

    Fedora Patch30: Do not let XSLoader load relative paths (CVE-2016-6185)

    Fedora Patch31: Avoid loading optional modules from default . (CVE-2016-1238)

    Fedora Patch32: Fix a crash in lexical scope warnings (RT#128597)

    Fedora Patch33: Do not mangle errno from failed socket calls (RT#128316)

    Fedora Patch34: Fix crash in "evalbytes S" (RT#129196)

    Fedora Patch35: Fix crash in "evalbytes S" (RT#129196)

   Fedora Patch36: Fix crash in "evalbytes S" (RT#129196)

    Fedora Patch37: Fix crash in splice (RT#129164, RT#129166, RT#129167)

    Fedora Patch38: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)

    Fedora Patch39: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)

    Fedora Patch40: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)

    Fedora Patch41: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)

    Fedora Patch42: Fix string overrun in Perl_gv_fetchmethod_pvn_flags (RT#129267)

    Fedora Patch43: Fix crash when matching UTF-8 string with non-UTF-8 substrings (RT#129350)

    Fedora Patch44: Fix parsing perl options in shell bang line (RT#129336)

    Fedora Patch45: Fix firstchar bitmap under UTF-8 with prefix optimization (RT#129950)

    Fedora Patch46: Avoid infinite loop in h2xs tool if enum and type have the same name (RT130001)

    Fedora Patch47: Fix stack handling when calling chdir without an argument (RT#129130)

    Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux

    Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux



---

@INC for perl 5.22.2:

    /home/eda/lib64/perl5/

    /usr/local/lib64/perl5

    /usr/local/share/perl5

    /usr/lib64/perl5/vendor_perl

    /usr/share/perl5/vendor_perl

    /usr/lib64/perl5

    /usr/share/perl5



---

Environment for perl 5.22.2:

    HOME=/home/eda

    LANG=en_GB.UTF-8

    LANGUAGE (unset)

    LC_COLLATE=C

    LC_CTYPE=en_GB.UTF-8

    LC_MESSAGES=en_GB.UTF-8

    LC_MONETARY=en_GB.UTF-8

    LC_NUMERIC=en_GB.UTF-8

    LC_TIME=en_GB.UTF-8

    LD_LIBRARY_PATH (unset)

    LOGDIR (unset)

    PATH=/home/eda/bin:/home/eda/bin:/home/eda/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/sbin:/home/eda/.local/bin:/home/eda/bin:/sbin:/usr/sbin:/sbin:/usr/sbin

    PERL5LIB=/home/eda/lib64/perl5/

    PERL_BADLANG (unset)

    SHELL=/bin/bash


Subject: Re: [perl #132485] Old package separator syntax
To: perl5-porters [...] perl.org
Date: Wed, 22 Nov 2017 19:42:52 +0000
From: Zefram <zefram [...] fysh.org>
Download (untitled) / with headers
text/plain 495b
Ed Avis wrote: Show quoted text
>Might it be time to mark the old package separator as deprecated?
It's an the fuzzy boundary of what we consider deprecatable. It's rarely used, and sane affected code can be easily updated to continue working. We wouldn't be too bothered about the cute hacks like "isn't()" and "don't {}". But it doesn't really stand in the way of actual improvement to the Perl language or perl interpreter. The motivation of accidental usage is mild; those bugs show up quickly. -zefram
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 700b
On Wed, 22 Nov 2017 11:43:11 -0800, zefram@fysh.org wrote: Show quoted text
> Ed Avis wrote:
> >Might it be time to mark the old package separator as deprecated?
> > It's an the fuzzy boundary of what we consider deprecatable. It's rarely > used, and sane affected code can be easily updated to continue working.
I have continued to use it, because it’s shorter and quicker to type than ::. I would be all in favour of the proposed warning, though, if only to allay the threat of deprecation. Show quoted text
> [I]t doesn't really stand in the way of actual improvement > to the Perl language or perl interpreter. The motivation of accidental > usage is mild; those bugs show up quickly.
I agree. -- Father Chrysostomos
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 498b
On Wed, 22 Nov 2017 10:11:50 -0800, exodist7@gmail.com wrote: Show quoted text
> Final note: I wonder if it something that can be turned off via a > pragma? > use strict 'separator'; perhaps (and maybe make it a default, where > using > strict makes it deprecated?)
I looked into that several years ago. Making it dependent on a pragma would add more conditions to fairly hot code (gv_fetchsv). It would probably slow things down (and cause bugs at the same time) without much benefit. -- Father Chrysostomos
From: Chad Granum <exodist7 [...] gmail.com>
Date: Wed, 22 Nov 2017 13:11:12 -0800
CC: Perl5 Porteros <perl5-porters [...] perl.org>
To: Max Maischein <perlbug-followup [...] perl.org>
Subject: Re: [perl #132485] Old package separator syntax
Download (untitled) / with headers
text/plain 773b


On Wed, Nov 22, 2017 at 1:03 PM, Father Chrysostomos via RT <perlbug-followup@perl.org> wrote:
Show quoted text
On Wed, 22 Nov 2017 10:11:50 -0800, exodist7@gmail.com wrote:
> Final note: I wonder if it something that can be turned off via a
> pragma?
> use strict 'separator'; perhaps (and maybe make it a default, where
> using
> strict makes it deprecated?)

I looked into that several years ago.  Making it dependent on a pragma would add more conditions to fairly hot code (gv_fetchsv).  It would probably slow things down (and cause bugs at the same time) without much benefit.

--

Father Chrysostomos


---
via perlbug:  queue: perl5 status: open
https://rt.perl.org/Ticket/Display.html?id=132485

Thanks, sounds like it is not worth it then.
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.9k
Show quoted text
>But it doesn't really stand in the way of actual improvement >to the Perl language or perl interpreter.
Viewed in abstract terms of language design, the ' package separator is rather weird. The ' character, almost everywhere in Unix and in Perl, is part of a matched delimiter. For it to sometimes appear solo is strange. Moreover, the need to parse it as a package separator sometimes affects its use as a string delimiter. sub foo { say $_[0] } foo"hi"; # works foo'hi'; # doesn't work foox"hi"; # String found where operator expected foo'"hi"; # Bad name after foo' (huh?) It's not that hot as a synonym for :: either: sub foo' {} # Illegal declaration of subroutine main::foo sub foo:: {} # OK sub 'foo { say $_[0] } 'foo 5; # Can't find string terminator "'" ::foo 5; # OK At the very least, this argues for forbidding the ' syntax at the start and end of identifiers. (I would also say that foo'hi' not working is a bug, when foo"hi" is fine.) But the more important point is, this syntactic weirdness and possible ambiguity is another one to combine with all the other idiosyncrasies to result in crazy-sounding syntax errors or bizarre parses of a fairly simple typo. We've all had these WTF moments when writing Perl code; a simple change causes the parser to spew out error messages over several seemingly unrelated lines of code, with a bit of headscratching required (especially for the novice) to work out that it was all down to a bit of misplaced punctuation a couple of lines earlier. A lot of this is inevitable. A lot of the ambiguities in the grammar are the price we pay for richness, expressivity and concision. But this particular one doesn't enrich the language or (except for golfing) let you write shorter code. To regularize ' so that it follows broadly the same rules as " would be a small but noticeable improvement.
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 910b
On Wed, 22 Nov 2017 13:03:28 -0800, sprout wrote: Show quoted text
> On Wed, 22 Nov 2017 10:11:50 -0800, exodist7@gmail.com wrote:
> > Final note: I wonder if it something that can be turned off via a > > pragma? > > use strict 'separator'; perhaps (and maybe make it a default, where > > using > > strict makes it deprecated?)
> > I looked into that several years ago. Making it dependent on a pragma > would add more conditions to fairly hot code (gv_fetchsv). It would > probably slow things down (and cause bugs at the same time) without > much benefit.
I have added this warning in commit 2cb35ee: $ ./perl -cwe '$name = <>; print "I visited $name'\''s house.\n"' Old package separator used in string at -e line 1. (Did you mean "$name\'s"?) at -e line 1. Name "name::s" used only once: possible typo at -e line 1. Name "main::name" used only once: possible typo at -e line 1. -e syntax OK -- Father Chrysostomos
From: Chad Granum <exodist7 [...] gmail.com>
Subject: Re: [perl #132485] Old package separator syntax
Date: Sun, 26 Nov 2017 15:09:43 -0800
CC: Perl5 Porteros <perl5-porters [...] perl.org>
To: Max Maischein <perlbug-followup [...] perl.org>
Download (untitled) / with headers
text/plain 1.2k
What type of warning category is it? I have at least 1 test file where I need to add a `no warnings '...'` for this.

On Sun, Nov 26, 2017 at 1:42 PM, Father Chrysostomos via RT <perlbug-followup@perl.org> wrote:
Show quoted text
On Wed, 22 Nov 2017 13:03:28 -0800, sprout wrote:
> On Wed, 22 Nov 2017 10:11:50 -0800, exodist7@gmail.com wrote:
> > Final note: I wonder if it something that can be turned off via a
> > pragma?
> > use strict 'separator'; perhaps (and maybe make it a default, where
> > using
> > strict makes it deprecated?)
>
> I looked into that several years ago.  Making it dependent on a pragma
> would add more conditions to fairly hot code (gv_fetchsv).  It would
> probably slow things down (and cause bugs at the same time) without
> much benefit.

I have added this warning in commit 2cb35ee:

$ ./perl -cwe '$name = <>; print "I visited $name'\''s house.\n"'
Old package separator used in string at -e line 1.
        (Did you mean "$name\'s"?) at -e line 1.
Name "name::s" used only once: possible typo at -e line 1.
Name "main::name" used only once: possible typo at -e line 1.
-e syntax OK

--

Father Chrysostomos


---
via perlbug:  queue: perl5 status: open
https://rt.perl.org/Ticket/Display.html?id=132485

RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 217b
On Sun, 26 Nov 2017 15:10:45 -0800, exodist7@gmail.com wrote: Show quoted text
> What type of warning category is it? I have at least 1 test file where I > need to add a `no warnings '...'` for this.
syntax -- Father Chrysostomos
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 657b
Thanks for adding this warning, Father C. That will explain a longstanding gotcha, although it doesn't remove it. If the perl5-porters think it is worthwhile to move towards removing the old package separator syntax, I suggest that a first step would be to issue a deprecation warning when used in variable names, but continue to allow it for barewords. $foo'bar; # deprecated "hello $foo'bar"; # deprecated foo'bar(); # OK for now I also suggest that at some point in the future when the ' is deprecated altogether, even in subroutine names, modules providing cute names like C<isn't> could do so with a simple source filter.
From: Kent Fredric <kentfredric [...] gmail.com>
CC: pp Porters <perl5-porters [...] perl.org>
To: Lukas Mai via RT <perlbug-followup [...] perl.org>
Date: Tue, 28 Nov 2017 03:30:53 +1300
Subject: Re: [perl #132485] Old package separator syntax
Download (untitled) / with headers
text/plain 288b
On 28 November 2017 at 02:55, Ed Avis via RT <perlbug-followup@perl.org> wrote: Show quoted text
> modules providing cute names like C<isn't> could do so with a simple source filter.
Please no. That is far worse than leaving this feature in place. -- Kent KENTNL - https://metacpan.org/author/KENTNL
From: Leon Timmermans <fawaka [...] gmail.com>
Subject: Re: [perl #132485] Old package separator syntax
To: perlbug <perlbug-followup [...] perl.org>
CC: Perl5 Porters <perl5-porters [...] perl.org>
Date: Mon, 27 Nov 2017 16:22:01 +0100
On Mon, Nov 27, 2017 at 2:55 PM, Ed Avis via RT <perlbug-followup@perl.org> wrote:
Show quoted text
Thanks for adding this warning, Father C.  That will explain a longstanding gotcha, although it doesn't remove it.

If the perl5-porters think it is worthwhile to move towards removing the old package separator syntax, I suggest that a first step would be to issue a deprecation warning when used in variable names, but continue to allow it for barewords.

    $foo'bar;         # deprecated
    "hello $foo'bar"; # deprecated
    foo'bar();        # OK for now

I also suggest that at some point in the future when the ' is deprecated altogether, even in subroutine names, modules providing cute names like C<isn't> could do so with a simple source filter.

For what benefit?

I see a benefit in removing them in quoted strings, because of the odds it's used by mistake. I don't see any such problem in any other form of single-quote as package separator. This sounds like breaking things for the sake of breaking them.

Leon
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 564b
As I say, it's "if". If people think that the older package separator syntax should be deprecated and eventually removed. That is something I would support, and I gave some arguments for it earlier. but there are certainly arguments for keeping it around. *If* the perl5-porters do want to put the old syntax on the deprecation path, I suggest that the first step would be in variable names like C<$a'b>. The use in subroutine names could be left as a later step, partly because of existing code with isn't and perhaps other apostrophized names (Acme::Don't).
Subject: Re: [perl #132485] Old package separator syntax
Date: Mon, 27 Nov 2017 17:42:37 +0100
To: Leon Timmermans <fawaka [...] gmail.com>
CC: perlbug <perlbug-followup [...] perl.org>, Perl5 Porters <perl5-porters [...] perl.org>
From: demerphq <demerphq [...] gmail.com>
Download (untitled) / with headers
text/plain 1.2k
On 27 November 2017 at 16:22, Leon Timmermans <fawaka@gmail.com> wrote: Show quoted text
> On Mon, Nov 27, 2017 at 2:55 PM, Ed Avis via RT <perlbug-followup@perl.org> > wrote:
>> >> Thanks for adding this warning, Father C. That will explain a >> longstanding gotcha, although it doesn't remove it. >> >> If the perl5-porters think it is worthwhile to move towards removing the >> old package separator syntax, I suggest that a first step would be to issue >> a deprecation warning when used in variable names, but continue to allow it >> for barewords. >> >> $foo'bar; # deprecated >> "hello $foo'bar"; # deprecated >> foo'bar(); # OK for now >> >> I also suggest that at some point in the future when the ' is deprecated >> altogether, even in subroutine names, modules providing cute names like >> C<isn't> could do so with a simple source filter.
> > > For what benefit? > > I see a benefit in removing them in quoted strings, because of the odds it's > used by mistake. I don't see any such problem in any other form of > single-quote as package separator. This sounds like breaking things for the > sake of breaking them.
If it's worth removing them from quoted strings then it's worth removing them altogether. Yves -- perl -Mre=debug -e "/just|another|perl|hacker/"
CC: Leon Timmermans <fawaka [...] gmail.com>, perlbug <perlbug-followup [...] perl.org>, Perl5 Porters <perl5-porters [...] perl.org>
To: demerphq <demerphq [...] gmail.com>
Date: Mon, 27 Nov 2017 20:25:52 +0100
Subject: Re: [perl #132485] Old package separator syntax
From: Andreas Koenig <andreas.koenig.7os6VVqR [...] franz.ak.mind.de>
Download (untitled) / with headers
text/plain 473b
Show quoted text
>>>>> On Mon, 27 Nov 2017 17:42:37 +0100, demerphq <demerphq@gmail.com> said:
Show quoted text
>> I see a benefit in removing them in quoted strings, because of the odds it's >> used by mistake. I don't see any such problem in any other form of >> single-quote as package separator. This sounds like breaking things for the >> sake of breaking them.
Show quoted text
> If it's worth removing them from quoted strings then it's worth > removing them altogether.
And your argument is? -- andreas
Date: Tue, 28 Nov 2017 00:02:26 +0100
To: Andreas Koenig <andreas.koenig.7os6VVqR [...] franz.ak.mind.de>
CC: Leon Timmermans <fawaka [...] gmail.com>, Perl RT Bug Tracker <perlbug-followup [...] perl.org>, Perl5 Porters <perl5-porters [...] perl.org>
Subject: Re: [perl #132485] Old package separator syntax
From: demerphq <demerphq [...] gmail.com>
Download (untitled) / with headers
text/plain 714b
On 27 Nov 2017 20:25, "Andreas Koenig" <andreas.koenig.7os6VVqR@franz.ak.mind.de> wrote:
Show quoted text
>>>>> On Mon, 27 Nov 2017 17:42:37 +0100, demerphq <demerphq@gmail.com> said:

 >> I see a benefit in removing them in quoted strings, because of the odds it's
 >> used by mistake. I don't see any such problem in any other form of
 >> single-quote as package separator. This sounds like breaking things for the
 >> sake of breaking them.

  > If it's worth removing them from quoted strings then it's worth
  > removing them altogether.

And your argument is?

Consistency. Either apostrophe is a valid replacement for colon-colon or it's not. We don't need more special cases in perl, we have enough already.

Yves

Yves
From: Leon Timmermans <fawaka [...] gmail.com>
Subject: Re: [perl #132485] Old package separator syntax
Date: Tue, 28 Nov 2017 00:46:05 +0100
To: demerphq <demerphq [...] gmail.com>
CC: Andreas Koenig <andreas.koenig.7os6VVqR [...] franz.ak.mind.de>, Perl RT Bug Tracker <perlbug-followup [...] perl.org>, Perl5 Porters <perl5-porters [...] perl.org>
Download (untitled) / with headers
text/plain 414b
On Tue, Nov 28, 2017 at 12:02 AM, demerphq <demerphq@gmail.com> wrote:
Show quoted text
Consistency. Either apostrophe is a valid replacement for colon-colon or it's not. We don't need more special cases in perl, we have enough already. 

Consistency is useful when one needs to explain people how something works, but as far as I'm concerned the only consistency we need is telling people to please avoid it entirely.

Leon
From: demerphq <demerphq [...] gmail.com>
CC: "Andreas J. Koenig" <andreas.koenig.7os6VVqR [...] franz.ak.mind.de>, Perl RT Bug Tracker <perlbug-followup [...] perl.org>, Perl5 Porters <perl5-porters [...] perl.org>
To: Leon Timmermans <fawaka [...] gmail.com>
Date: Tue, 28 Nov 2017 09:11:09 +0100
Subject: Re: [perl #132485] Old package separator syntax
Download (untitled) / with headers
text/plain 548b
On 28 Nov 2017 00:46, "Leon Timmermans" <fawaka@gmail.com> wrote:
Show quoted text
On Tue, Nov 28, 2017 at 12:02 AM, demerphq <demerphq@gmail.com> wrote:
Consistency. Either apostrophe is a valid replacement for colon-colon or it's not. We don't need more special cases in perl, we have enough already. 

Consistency is useful when one needs to explain people how something works, but as far as I'm concerned the only consistency we need is telling people to please avoid it entirely.

And if that's our policy we should just deprecate and remove it.

Yves
From: Sawyer X <xsawyerx [...] gmail.com>
To: perl5-porters [...] perl.org
Date: Tue, 28 Nov 2017 14:29:14 +0200
Subject: Re: [perl #132485] Old package separator syntax
Download (untitled) / with headers
text/plain 1.3k
I think this captures my thoughts on this at the moment. Deprecating is a fragile process with which we should be judicious. We should consider syntax or features (or misfeatures) that break other features, stand in our way of further advancements and fixes, confuse users far too much for their benefit, and that weighed with the inevitable breakage that could ensure in CPAN and DarkPAN. My perspective here is that, while this is not valuable syntax, it is not in the way of anything. This means the concerns here are the mishaps in the style of "$person's dog" v. the breakage that could ensue. I would rather we minimize that single use-case rather than breaking things. This is achieved by Chrysostomos' new warning. Regarding Yves' comment on consistency, I think Ed showed it is already inconsistent, so that door is already open. On 11/22/2017 09:42 PM, Zefram wrote: Show quoted text
> Ed Avis wrote:
>> Might it be time to mark the old package separator as deprecated?
> It's an the fuzzy boundary of what we consider deprecatable. It's rarely > used, and sane affected code can be easily updated to continue working. > We wouldn't be too bothered about the cute hacks like "isn't()" and > "don't {}". But it doesn't really stand in the way of actual improvement > to the Perl language or perl interpreter. The motivation of accidental > usage is mild; those bugs show up quickly. > > -zefram
From: Tomasz Konojacki <me [...] xenu.pl>
To: perl5-porters [...] perl.org
Date: Sat, 02 Dec 2017 05:03:00 +0100
Subject: Re: [perl #132485] Old package separator syntax
Download (untitled) / with headers
text/plain 787b
On Tue, 28 Nov 2017 14:29:14 +0200 Sawyer X <xsawyerx@gmail.com> wrote: Show quoted text
> My perspective here is that, while this is not valuable syntax, it is > not in the way of anything. This means the concerns here are the mishaps > in the style of "$person's dog" v. the breakage that could ensue. I > would rather we minimize that single use-case rather than breaking > things. This is achieved by Chrysostomos' new warning.
Existence of ' package separator sometimes causes extremely misleading error messages. For example, the following code crashes with "Bad name after Int' at foo.pl line 10.": use Moose; has erdef => ( isa => 'Int', is => 'ro, default => sub { 1 } ); has cxxc => ( isa => 'Int', is => 'ro', default => sub { 1 } ); Can you spot the real error?
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 688b
On Fri, 01 Dec 2017 20:03:28 -0800, me@xenu.pl wrote: Show quoted text
> Existence of ' package separator sometimes causes extremely misleading > error messages. For example, the following code crashes with "Bad name > after Int' at foo.pl line 10.": > > use Moose; > > has erdef => ( > isa => 'Int', > is => 'ro, > default => sub { 1 } > ); > > has cxxc => ( > isa => 'Int', > is => 'ro', > default => sub { 1 } > ); > > Can you spot the real error?
Yes, I saw it immediately. But what you have pointed out is not a problem with ' per se. There is a logic error in toke.c (a separate bug), causing this error to suppress others. We can fix that. -- Father Chrysostomos
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.6k
On Fri, 01 Dec 2017 20:03:28 -0800, me xenu.pl wrote: Show quoted text
> On Tue, 28 Nov 2017 14:29:14 +0200 > Sawyer X <xsawyerx gmail.com> wrote: >
> > My perspective here is that, while this is not valuable syntax, it is > > not in the way of anything. This means the concerns here are the mishaps > > in the style of "$person's dog" v. the breakage that could ensue. I > > would rather we minimize that single use-case rather than breaking > > things. This is achieved by Chrysostomos' new warning.
> > Existence of ' package separator sometimes causes extremely misleading > error messages. For example, the following code crashes with "Bad name > after Int' at foo.pl line 10.": > > use Moose; > > has erdef => ( > isa => 'Int', > is => 'ro, > default => sub { 1 } > ); > > has cxxc => ( > isa => 'Int', > is => 'ro', > default => sub { 1 } > ); > > Can you spot the real error?
Try this example: use Moose; our $subpackage = "Bar"; has erdef => ( isa => "Int", is => "ro, default => sub { 1 } ); has cxxc => ( isa => "Foo::$subpackage", is => "ro", default => sub { 1 } ); It does the same unhelpful thing. (Bad name after Foo::.) It’s not specific to '. In bleadperl, as of commit 76b3530 (just committed), your example gives: Bareword found where operator expected at - line 10, near "isa => 'Int" (Might be a runaway multi-line '' string starting on line 5) (Do you need to predeclare isa?) Bad name after Int' at - line 10. That ‘Do you need to predeclare’ message is not helpful, but all I did was switch around the ‘Bareword found’ and ‘Bad name’ error messages. -- Father Chrysostomos
Date: Tue, 05 Dec 2017 00:54:16 +0100
To: perlbug-followup [...] perl.org
Subject: Re: [perl #132485] Old package separator syntax
From: Tomasz Konojacki <me [...] xenu.pl>
Download (untitled) / with headers
text/plain 575b
On Mon, 04 Dec 2017 15:47:22 -0800 "Father Chrysostomos via RT" <perlbug-followup@perl.org> wrote: Show quoted text
> In bleadperl, as of commit 76b3530 (just committed), your example gives: > > Bareword found where operator expected at - line 10, near "isa => 'Int" > (Might be a runaway multi-line '' string starting on line 5) > (Do you need to predeclare isa?) > Bad name after Int' at - line 10. > > That ‘Do you need to predeclare’ message is not helpful, but all I did was switch around the ‘Bareword found’ and ‘Bad name’ error messages.
Thank you, now it's much better!


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org