On Wed, Jul 21, 2004 at 04:37:29PM -0700, Larry Wall wrote:

>     No          Yes
>     --          ---
>     @foo        @foo[1]
>     %bar        %bar{"a"} or %bar«a»
>     $foo.bar    $foo.bar()
>     &foo      &foo(1)
> 
> In this worldview, $foo is an exception only because it doesn't naturally
> have a form that ends with some kind of bracket.

In an ideal universe, here's what I would like to see:

Scalars and things ending in brackets are interpolated.  Things
starting with '@' are interpolated if there is an array of that name,
otherwise they are treated as literals.


$foo = 'apple';
%bar = ('a', 1, 'b', 2);
@foo = <<a b c>>;
sub foo { my $param = shift // 7; return $param +2; }

# attached to object $baz which stringifies to '^object baz^'
method bar { return 'quux'; } 

print "$foo";       # apple
print "\$foo";      # $foo
print "%bar";       # %bar
print "$baz.bar";   # ^object baz^.bar
print "$baz.bar()"; # quux
print "$baz\.bar()";# ^object baz^.   with WARNING: no function bar()...
print "&foo";       # &foo
print "foo()";      # 9
print "&foo()";     # 9
print "&foo(1)";    # 
print "@foo[1]";    # a
print "%bar{'a'}";  # 1
print "%bar«a»";    # 1

print "@foo";       # a b c      [1]
undef @foo; 
print "@foo";       # @foo       [2]


[1]  Variable @foo exists, so it is interpolated.  Separator character
might or might not be space, null string, whatever.

[2]  Variable @foo does not exist, so is used as literal value,
possibly with warning.  I don't know if there would be a difference
between these:
        undef @foo 
        delete ::{'@foo'}  # Perl5 syntax...still correct?
If there is, then probably the latter is required.

-- 
[EMAIL PROTECTED]

Reply via email to