Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How exactly does Perl handle operator chaining?

Tags:

perl

So I have this bit of code that does not work:

print $userInput."\n" x $userInput2; #$userInput = string & $userInput2 is a integer

It prints it out once fine if the number is over 0 of course, but it doesn't print out the rest if the number is greater than 1. I come from a java background and I assume that it does the concatenation first, then the result will be what will multiply itself with the x operator. But of course that does not happen. Now it works when I do the following:

$userInput .= "\n";
print $userInput x $userInput2;

I am new to Perl so I'd like to understand exactly what goes on with chaining, and if I can even do so.

like image 658
Andy Avatar asked Dec 07 '22 09:12

Andy


1 Answers

You're asking about operator precedence. ("Chaining" usually refers to chaining of method calls, e.g. $obj->foo->bar->baz.)

The Perl documentation page perlop starts off with a list of all the operators in order of precedence level. x has the same precedence as other multiplication operators, and . has the same precedence as other addition operators, so of course x is evaluated first. (i.e., it "has higher precedence" or "binds more tightly".)

As in Java you can resolve this with parentheses:

print(($userInput . "\n") x $userInput2);

Note that you need two pairs of parentheses here. If you'd only used the inner parentheses, Perl would treat them as indicating the arguments to print, like this:

# THIS DOESN'T WORK
print($userInput . "\n") x $userInput2;

This would print the string once, then duplicate print's return value some number of times. Putting space before the ( doesn't help since whitespace is generally optional and ignored. In a way, this is another form of operator precedence: function calls bind more tightly than anything else.

If you really hate having more parentheses than strictly necessary, you can defeat Perl with the unary + operator:

print +($userInput . "\n") x $userInput2;

This separates the print from the (, so Perl knows the rest of the line is a single expression. Unary + has no effect whatsoever; its primary use is exactly this sort of situation.

like image 195
Eevee Avatar answered Jan 07 '23 00:01

Eevee