Syntactic Confectionery Delight PerlMonks

### Re: Assign multiple scalars the same value

by Tanktalus (Canon)
 on Jan 24, 2005 at 21:58 UTC ( #424711=note: print w/replies, xml ) Need Help??

in reply to Assign multiple scalars the same value

```my (\$a, \$b, \$c) = ('TRUE') x 3;

Always many ways of doing it ;-)

Replies are listed 'Best First'.
Re^2: Assign multiple scalars the same value
by diotalevi (Canon) on Jan 24, 2005 at 22:55 UTC
This solution is less good than simply assigning the value to each variable separately in my \$a = my \$b = my \$c = 'TRUE' because it avoids having to count how many variables you have. In your code, if you got the number wrong then the trailing variables will be left undefined which is far and away from the intent to leave them with a true value. You're making it easy to write in a bug later.

Good point. One could always do this:

```use Want 'howmany';
my (\$a, \$b, \$c) = &{ sub{ (1) x howmany } };

Not sure if that's shorter/better than other solutions (plus requires Want), but it's another way of keeping the number of variables in sync.

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Re^2: Assign multiple scalars the same value
by dimar (Curate) on Jan 24, 2005 at 22:30 UTC

Jeepers! the 'x' operator works on lists too!?

Looks like time to refactor out all ...

```my (\$a,\$b,\$c) = map {'TRUE'}(0 .. 2);

Yep, it does. Note the difference between these, though:

```\$,= " "; \$\ = "\n";
print( map { int rand 10 } 0 .. 6 );
print( ( int rand 10 ) x 7 );

The x operator only evaluates the list expression once. So you can't always substitute one for the other.

Makeshifts last the longest.

scooterm,
Not only that, but if the what the list contains is a reference, the reference is replicated as well. The first useful application I remember seeing of this is in tye's Algorithm::Loops. I found a useful variation that looked a little something like:
```my @signal = qw(ABRT STOP TERM INT);
@SIG{ @signal } = (sub { kill 9, \$pid; exit }) x @signal;
Incidently, diotalevi makes a good point concerning ensuring that you have the same number of things on both sides of the assignment which is not an issue in my example.

Cheers - L~R

Create A New User
Node Status?
node history
Node Type: note [id://424711]
help
Chatterbox?
 [oiskuu]: Hm. that depends on kernel compiled with CONFIG_AUDITSYSCAL L [tye]: apropos my several mentions of audit [Corion]: At least my (non-SELinux) Debian has that config thing set. I don't have non-Debian machines handy (except Android) [Corion]: My Android phone also has /proc/self/ loginuid, but that displays -1 (resp. 4GB). That might be because the phone is rooted. [tye]: -1 means nobody logged in or the process was started before audit got booted

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (9)
As of 2017-06-23 19:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
How many monitors do you use while coding?

Results (554 votes). Check out past polls.