in reply to Re^2: Is { } an empty block or a bug in perl?
in thread Is { } an empty block or a bug in perl?

But my point is that it isn't valid code, and that even if it was valid code, it would would be useless, despite what people would tell you.

update: If you really want 2 empty blocks, do something like

{ ; } { ; }

Replies are listed 'Best First'.
Re^4: Is { } an empty block or a bug in perl?
by davidrw (Prior) on Jul 06, 2005 at 14:25 UTC
    warning: nerdy nitpick ahead :)

    I would argue that {;} is not an empty block. I think it's analagous to a set that contains the empty set as it's only element.

    but i don't think the compiler makes the distinction.. perl -MO=Terse -e 'if(1){;}' and perl -MO=Terse -e 'if(1){}' given identical output.
        I wasn't commenting on your perl usage in any way -- in {;} the semicolon does make it clear that it is not supposed to be a hashref.

        I was just making a dumb point of comparing it to set logic, where if you have a set w/nothing in it, then there's something in it.

        In set logic, there's the EmptySet which I'll represent as 0. 0 is {}. So a set {} is the empty set. A set {1,2,3} has 3 elements in it and is non-empty. The set { 0 } is also non-empty, even though its only element is the empty set.

        So the parallel i had in my mind was something like this:
        PerlSet LogicDescription
        {} (or ;){} (or 0)Emtpy set/statement
        {;}{ 0 }A set containing the empty set; therefore non-empty

        I guess you could use the exampe of /dev/null -- that's really a nothing file, but the array @f = ( '/dev/null' ) is non-empty. Blah--now that i typed it, i don't like that example.

        Anyways, i'll stop rambling now.. ;)
      Using if here is a poor example, since since a block is required by if's syntax. (This ins't C.) Also, compare
      { print '!'; redo; }
      to
      if (1) { print '!'; redo; }
Re^4: Is { } an empty block or a bug in perl?
by cog (Parson) on Jul 06, 2005 at 16:36 UTC
    it would would be useless

    That doesn't matter.

    despite what people would tell you

    That doesn't matter either.

    IMHO, it is valid code. Look at it this way:

    # block #1 { } # block #2 { }

    See? Two empty blocks waiting for code. It is valid.

    Just because no one in their perfect state of mind would use that doesn't make it invalid.

      You are mistaken:

      /////
      is valid,
      {}{}
      is not :-)

      The fact that it looks valid doesn't make it valid. The perl interpreter gets to decide. There is no ANSI perl :-) Now, I agree that your construct could be made valid, but there are other situations to consider:

      # hash #1 { }

      What about this? Is this a block or a hash? Current semantics say it's a hashref, your interpretation says its a block. Or do you really want this to be an empty block only when it's followed by another block? Would that help catch typos or would it confuse people even more than the current semantics? I must say I'm not sure.

      Well if you feel that strongly about it, submit a patch to make it legal, explaining your reasons and showing it breaks nothing else in perl extensive test harness, then wait for it to be accepted.

      ...it is better to be approximately right than precisely wrong. - Warren Buffet