For Programmers: Free Programming Magazines  


Home > Archive > PERL Programming > April 2006 > Inverted syntax for an if conditional









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Inverted syntax for an if conditional
Mark Hobley

2006-04-22, 6:58 pm

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/

Jürgen Exner

2006-04-22, 6:58 pm

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


Justin C

2006-04-22, 6:58 pm

On 2006-04-22, Mark Hobley <markhobley@hotpop.deletethisbit.com> 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.
Mark Hobley

2006-04-22, 6:58 pm

In alt.perl Mark Hobley <markhobley@hotpop.deletethisbit.com> 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/

Mark Hobley

2006-04-22, 6:58 pm

In alt.perl "Jürgen Exner" <jurgenex@hotmail.com> 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/

Jürgen Exner

2006-04-22, 6:58 pm

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


Randal L. Schwartz

2006-04-22, 6:58 pm

>>>>> "Mark" == Mark Hobley <markhobley@hotpop.deletethisbit.com> 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
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
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 ***
Ch Lamprecht

2006-04-22, 6:58 pm

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/"
Paul Lalli

2006-04-25, 9:57 pm

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);
(<CTRL-D> 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

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com