Saturday 28 October 2017

Perl course in London

On Saturday November 25, 2017 I'll be running a 2 hour Introduction to Perl for developers of other languages

Please make sure you register so that I can set you up with a free 2 week enrolment at Geekuni.


Cavendish Campus, University of Westminster
115 New Cavendish Street London W1W 6UW

Perl string concatenation and repetition

One of the first Perl operators to learn is the "dot" concatenation operator (.) for strings. For example:

my $string = 'foo' . 'bar';
# $string is 'foobar'.

On the other hand, if you have an array of strings @arr, then you can concatenate them by joining them with an empty string in-between:
my $string = join('', @arr);
But what if you just want 10 "foo"s in a line? You might try the Python approach with 'foo' * 10 but Perl with its type conversion on the fly will try to convert 'foo' into a number and say something like:
 Argument "foo" isn't numeric in multiplication (*) at...

Instead you should use the repetition operator (x) which takes a string on the left and a number on the right:

my $string = 'foo' x 10;
and $string is then
Note that even if you have integers on both sides, the 'x' repetition operator will cast the left operand into a string so that:

my $str = 20 x 10;
# $str is "2020202020202020202020"

Now this isn't all the repetition operator is good for - it can also be used for repetition of lists. For example:
('x','y','z') x 10

evaluates as:

('x','y','z','x','y','z','x','y', ...)

But be warned: if the left operand is not enclosed in parentheses it is treated as a scalar.
my @arr = ('x', 'y', 'z');
my @bar =  @arr  x 10;

is equivalent to
my @bar = scalar(@arr) x 10;
# @bar is an array of a single integer (3333333333)
while, turning the array into a list of its elements by enclosing it in parentheses:

my @foo = (  (@arr)  x 10 );
# then @foo is ('x','y','z','x','y','z','x','y', ...)

In summary, if you remember that 'x' is different to '*' and lists are treated differently to scalars, it's less likely your code will give you an unpleasant surprise!