On Wed, Feb 27, 2002 at 04:24:48PM -0600, Garrett Goebel wrote: > From: Allison Randal > > Not just some value external to the switch, but the value in $_. > > I now see the DWIM aspect. Thanks BTW. > > But how often will people have non- C<when> statements within a C<given> > scope that'll need the special case handling so they can see a different $_ > than C<when>?
That's exactly what the non- C<when> statements will see currently. Are you asking the question in the context of Apocalypse 4 or in the context of the hypothetical "C<when> aliases to $_" discussion? I'll answer as if the former, because it seems to fit the best, but if you meant the latter the answer would be slightly different. I think we're bogged down in the "$_ is default" idea. We really have two entirely separate defaults, $_ and topic. Sometimes they're the same and sometimes they're not. Hmmmmm... pretend for a moment that there's a variable $topic (there isn't, but pretend). It's very similar to $_, but not quite. When you do a given $x { ... } then both $_ and $topic hold the value of $x. But, when you do a given $x -> $y { ... } $topic holds the value of $y (i.e. the value of $x), but $_ doesn't (it hasn't been affected at all). C<when> always defaults to $topic, it doesn't care about $_ (except that when $topic has no value at all, it will "steal" a value from $_). But everything else still defaults to $_, and pays no attention to $topic. (And remember, there is no $topic, it is merely for illustrating the existence of the abstract "topic"). So this is what the code would be doing: > $hi = 'hello'; > $x = 'burt'; > for $hi { > given $x -> $y { > when /burt/ { print "Go Away" }; # matches on $y, the topic > default { print }; # prints $_, not $y > } > } > > or without the special case: > > $hi = 'hello'; > $x = 'burt'; > for $hi -> $y { > given { > when /burt/ { print "Go Away" }; > default { print $y}; > } > } The second bit of code (with corrections in place) isn't going to do what you expect at all because the given { ... } is an "empty given" which has a special meaning of "make boolean comparisons". So /burt/ is being compared to "True" (I'm not sure if this would fail because the regex doesn't match "True", or succeed because "burt" is a true value, but it wouldn't have anything to do with $y). > The second is obviously more explict, but does but requires a few more keys > be typed. I wonder if the C<given>/C<when> special case is really going to > be used regularly enough to justify the loss of clarity, consistency, and > the additional obfuscation potential. > > $_ = 'foo'; > given 'bar' -> $z { > if /foo/ { ... } # true, $_ = foo > when 'bar' { # true, $_ = bar > if /foo/ { ... }; # true, $_ = foo > } > $_ = 'baz'; # $_ = baz > when 'bud' { # false, $_ = bar > if /baz/ { ... }; # true, $_ = baz > } > } So these lines are not "$_ = bar" but ... when 'bar' { # true, topic = bar ... when 'bud' { # false, topic = bar ... I think your more general question boils down to: "Is this whole notion of topic really worth the effort"? And the confusion about C<when> actually supports your argument. Perl gurus and newbies alike are going to have to do a little mental stretching for this one (just a tiny bit). But I do think it's worth it. Despite the details of consistency and clarity that still need to be worked out, it's a very dwim change that is a big part of the elegance of the switch statement. > I guess the next question in the context of the following is: > > Larry Wall wrote in Apocalypse 4: > > It should be possible to make user-extensible syntax look > > just like built-in syntax. > > How would I create a user-extensible construct that works like given/when? > I'm guessing the answer is: you don't. I sure hope you can. I intend to use it. Allison