http://www.perlmonks.org?node_id=1005848


in reply to Perl allows package names consisting entirely of colons

Seems to work only when the colons come in pairs:

#! perl use strict; use warnings; package ::::: { sub x { printf "(%s)\n", __PACKAGE__; } } package main; :::::::x();

Produces:

23:01 >perl 405_Obfu.pl Bareword "::::::" refers to nonexistent package at 405_Obfu.pl line 27 +. Invalid version format (non-numeric data) at 405_Obfu.pl line 17, near + "package ::::" syntax error at 405_Obfu.pl line 17, near "package :::::" Execution of 405_Obfu.pl aborted due to compilation errors. 23:02 >
“Curiouser and curiouser!” cried Alice.

Update: D’oh! (slaps forehead). Of course! :: is a synonym for main, and so is ::main and therefore ::::, likewise ::::::, etc., etc. (See Packages.) This “insight” is wrong — see reply by tobyink, below.

Athanasius <°(((><contra mundum

Replies are listed 'Best First'.
Re^2: Perl allows package names consisting entirely of colons
by tobyink (Canon) on Nov 27, 2012 at 13:33 UTC

    In terms of the package keyword itself, :: and main are distinct packages, and :::: is another package entirely...

    $ perl -Mstrict -Mwarnings -E'package main; say __PACKAGE__' main $ perl -Mstrict -Mwarnings -E'package ::main; say __PACKAGE__' main $ perl -Mstrict -Mwarnings -E'package ::; say __PACKAGE__' :: $ perl -Mstrict -Mwarnings -E'package ::::; say __PACKAGE__' ::::
    { package main; sub xxx { 0 }; package ::; sub xxx { 1 }; package ::::; sub xxx { 2 }; } use 5.010; say ::xxx(); # 0 say ::::xxx(); # 1 say ::::::xxx(); # 2
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'