Inverted syntax for an if conditional

Inverted syntax for an if conditional

am 22.04.2006 20:07:27 von markhobley

I have some information that states that the if conditional can be be inverted
from the traditional syntax

if (EXPRESSION) BLOCK

to an alternative syntax:

if BLOCK (EXPRESSION);

I have a simple line of code:

if ($guess == 6) { print 'Wow! Lucky Guess!'; }

However, when I try to invert this, I get a syntax error:

{ print 'Wow! Lucky Guess!'; } if ($guess == 6); # Syntax error

Why does this not work?

The example is academic, and I don't intend to code with the inverted syntax.
I am just trying to get an understanding for the purpose of producing
documentation.

Thanks in advance to anyone who can help.

Regards,

Mark.

--
Mark Hobley
393 Quinton Road West
QUINTON
Birmingham
B32 1QE

Telephone: (0121) 247 1596
International: 0044 121 247 1596

Email: markhobley at hotpop dot donottypethisbit com

http://markhobley.yi.org/

Re: Inverted syntax for an if conditional

am 22.04.2006 20:17:26 von jurgenex

Mark Hobley wrote:
> I have some information that states that the if conditional can be be
> inverted from the traditional syntax
>
> if (EXPRESSION) BLOCK
>
> to an alternative syntax:
>
> if BLOCK (EXPRESSION);

Did you mean
BLOCK if (EXPRESSION);

Anyway, both are wrong. Why don't you check the documenation?
From "perldoc perlsyn":

Any simple statement may optionally be followed by a *SINGLE* modifier,
just before the terminating semicolon (or block ending). The possible
modifiers are:
if EXPR

I can only guess that this is what you were looking for.

> However, when I try to invert this, I get a syntax error:
> { print 'Wow! Lucky Guess!'; } if ($guess == 6); # Syntax error

Because a block is not a simple statement. Did you try
print 'Wow! Lucky Guess!' if ($guess == 6);

jue

Re: Inverted syntax for an if conditional

am 22.04.2006 20:41:54 von Justin C

On 2006-04-22, Mark Hobley wrote:
> I have some information that states that the if conditional can be be inverted
> from the traditional syntax
>
> if (EXPRESSION) BLOCK
>
> to an alternative syntax:
>
> if BLOCK (EXPRESSION);
>
> I have a simple line of code:
>
> if ($guess == 6) { print 'Wow! Lucky Guess!'; }
>
> However, when I try to invert this, I get a syntax error:
>
> { print 'Wow! Lucky Guess!'; } if ($guess == 6); # Syntax error
>
> Why does this not work?
>
> The example is academic, and I don't intend to code with the inverted syntax.
> I am just trying to get an understanding for the purpose of producing
> documentation.

This works for me:

#!/usr/bin/perl
my $guess=6;
print "Wow! Lucky guess!\n" if ( $guess == 6 ) ;

(followups set)


Justin.

--
Justin C, by the sea.

Re: Inverted syntax for an if conditional

am 22.04.2006 22:07:27 von markhobley

In alt.perl Mark Hobley wrote:
>
> { print 'Wow! Lucky Guess!'; } if ($guess == 6); # Syntax error
>
> Why does this not work?
>

I have also discovered some more weird behaviour, this time using the syntax:

STATEMENT [, STATEMENT ], if EXPRESSION;

If I use:

print 'I should be so lucky!', print 'Chucky!', print 'Mucky!', print
'Clucky!', if ($guess == 6);

The statements run in reverse order, and I get number ones inserted in the
output:

Clucky!Mucky!1Chucky!1I should be so lucky!1

Regards,

Mark.

--
Mark Hobley
393 Quinton Road West
QUINTON
Birmingham
B32 1QE

Telephone: (0121) 247 1596
International: 0044 121 247 1596

Email: markhobley at hotpop dot donottypethisbit com

http://markhobley.yi.org/

Re: Inverted syntax for an if conditional

am 22.04.2006 22:07:27 von markhobley

In alt.perl "Jürgen Exner" wrote:
> Mark Hobley wrote:

> Did you mean
> BLOCK if (EXPRESSION);

Oops, yes I did. That was a typing error.

> Anyway, both are wrong. Why don't you check the documenation?
> From "perldoc perlsyn":
>
> Any simple statement may optionally be followed by a *SINGLE* modifier,
> just before the terminating semicolon (or block ending). The possible
> modifiers are:
> if EXPR
>
> Because a block is not a simple statement. Did you try
> print 'Wow! Lucky Guess!' if ($guess == 6);
>

Yeah that works.

A professional programming guide tells me that the following forms of if
statement are legal in Perl:

STATEMENT if EXPRESSION;

STATEMENT, STATEMENT ... if EXPRESSION;

BLOCK if EXPRESSION;

Presumably there is a mistake in the text, and BLOCK if EXPRESSION should be
omitted from this list, because STATEMENT if EXPRESSION works, but
BLOCK if EXPRESSION appears not to.

Regards,

Mark.

--
Mark Hobley
393 Quinton Road West
QUINTON
Birmingham
B32 1QE

Telephone: (0121) 247 1596
International: 0044 121 247 1596

Email: markhobley at hotpop dot donottypethisbit com

http://markhobley.yi.org/

Re: Inverted syntax for an if conditional

am 22.04.2006 23:24:29 von jurgenex

Mark Hobley wrote:
> I have also discovered some more weird behaviour,
> print 'I should be so lucky!', print 'Chucky!', print 'Mucky!', print
> 'Clucky!', if ($guess == 6);
>
> The statements run in reverse order, and I get number ones inserted
> in the output:
>
> Clucky!Mucky!1Chucky!1I should be so lucky!1

Nothing weird at all.
If you add explicit paranthesis then it's obvious what's going on:

print ('I should be so lucky!',
(print 'Chucky!',
(print 'Mucky!',
print ('Clucky!')
)
)
)

The injected digits '1' are just the return value 'true' of the inner
print() statements, e.g. for the outmost you will get eventually

print ('I should be so lucky!', 1)

I suggest you read the documentation for the functions that you are using.
"perldoc -f print":

print Prints a string or a list of strings. Returns true if
successful.


jue

Re: Inverted syntax for an if conditional

am 22.04.2006 23:35:15 von merlyn

>>>>> "Mark" == Mark Hobley writes:

Mark> A professional programming guide tells me that the following forms of if
Mark> statement are legal in Perl:

Mark> STATEMENT if EXPRESSION;

Mark> STATEMENT, STATEMENT ... if EXPRESSION;

Mark> BLOCK if EXPRESSION;

Mark> Presumably there is a mistake in the text, and BLOCK if EXPRESSION should be
Mark> omitted from this list, because STATEMENT if EXPRESSION works, but
Mark> BLOCK if EXPRESSION appears not to.

That's really wrong.

It's:

EXPRESSION if EXPRESSION;

or

if (EXPRESSION) BLOCK

where BLOCK is:

{ STATEMENT STATEMENT ... STATEMENT }

and STATEMENT is:

EXPRESSION;

and many other things.

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095

Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
*** Posted via a free Usenet account from http://www.teranews.com ***

Re: Inverted syntax for an if conditional

am 23.04.2006 01:02:51 von Ch Lamprecht

Mark Hobley wrote:


> A professional programming guide tells me that the following forms of if
> statement are legal in Perl:
>
> STATEMENT if EXPRESSION;
>
> STATEMENT, STATEMENT ... if EXPRESSION;
>
> BLOCK if EXPRESSION;
>
> Presumably there is a mistake in the text, and BLOCK if EXPRESSION should be
> omitted from this list, because STATEMENT if EXPRESSION works, but
> BLOCK if EXPRESSION appears not to.

do BLOCK if EXPRESSION


perldoc -f do

Regards,
Christoph
--

perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"

Re: Inverted syntax for an if conditional

am 23.04.2006 07:36:52 von Paul Lalli

Mark Hobley wrote:
> I have also discovered some more weird behaviour, this time using the syntax:
>
> STATEMENT [, STATEMENT ], if EXPRESSION;
>
> If I use:
>
> print 'I should be so lucky!', print 'Chucky!', print 'Mucky!', print
> 'Clucky!', if ($guess == 6);
>
> The statements run in reverse order, and I get number ones inserted in the
> output:
>
> Clucky!Mucky!1Chucky!1I should be so lucky!1

Whenever Perl does something that contradicts your expectations, it's
often helpful to run your code with explicit parentheses enabled, so
you can see what Perl thinks the precedence is:

$ perl -MO=Deparse,-p
print 'I should be so lucky!', print 'Chucky!', print 'Mucky!', print
'Clucky!', if ($guess == 6);
( pressed...)
(($guess == 6) and print('I should be so lucky!', print('Chucky!',
print('Mucky!', print('Clucky!')))));

As you can see, each successive print was one of the arguments to the
print that came before it. That's clearly not what you wanted. Change
your code to:

print('I should be so lucky!'), print('Chucky!'), print('Mucky!'),
print('Clucky!') if ($guess == 6);

Paul Lalli