Sunday, 17 December 2017

Moo: One approach to terminating the process when attributes of a dynamically assigned role are missing

The value of a role’s required attribute is only checked on object creation. This article provides one way of enforcing it when applying the role to an object on the fly.

Picture of a Dalek

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

http://act.yapc.eu/lpw2017/talk/7224

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

Where?

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

https://www.westminster.ac.uk/about-us/visit-us/directions/cavendish

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
foofoofoofoofoofoofoofoofoofoo
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!