SlideShare a Scribd company logo
The WTFish side  of using Perl Lech Baczyński http://perl.baczynski.com
Thanks, Hurra I would like to thank Hurra Communications, the company that sponsored my trip here, probably the most Perl-ish company in Poland www.hurra.com
What do I mean by WTF Strange unexpected results of Perl code: developer's inexperience, or
Perl's strange behaviour (both seem to be the same after a while :-) ) Examples: foreach variable localization, “zero but true”, dangers of omitting brackets, lazy  print ... Some are for beginners (not-beginners – have patience!), some may puzzle intermediate programmers.
Lazy print Let's say you would like to see progress of a long computing... foreach my $element (@array) { # ..... long time operations ... $i++; if ( $i % 100 == 0) {  print ".";  }; Will it print dot every 100th iteration?  No. It will print all of them at once at the end.
Lazy print - continued $|++ WTF is $|++ ? It is incrementing one of Perl's strange variables (magic punctuation variables). $| If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel.  Using $|++ is not perl best practice. Solution:  use English; # '-no_match_vars'; then use the $OUTPUT_AUTOFLUSH  variable
Who needs brackets Omitting brackets – both convenient and dangerous $a="Hello"; $b="world"; print $a . " " . $b . "\n"; print "Found ". scalar @arr ." elements\n";
Who needs brackets - continued $a = 'Hello'; print ( length ( $a ) ); print length $a; output: 5 - ok print length $a . " letters\n" ; output: 14 – WTF?? Length was calculated of concatenated strings $a and "letters\n", thus length returned 14.  So beware - sometimes you may ignore brackets, sometimes you may not.
Regexps: {n,m} Let's say you want to match three to five small letters : /[a-z]{3,5}/ And now any number not less than three /[a-z]{3,}/ And now, analogically, any number not more than five /[a-z]{,5}/   # WRONG It works only one way - {n,}, not {,n} - the explanation is easy: you can easily write 0, but it not so easy to write infinity
Regexps: Minus (-) sign in character classes [ ] Beware of matching "-" in regexps. If you want to match letters a,b,c and minus sign: Good:  [-abc] Good:  [abc-] Bad: [a-bc] Good: [a\-bc]
Regexps: delimiters Only if you use // then m is optional.  Some need to be closed other way than opened. /abc/  - ok |abc|  - wrong m|abc|  - will work m/abc/  - will work, m is optional m#abc#  - will work, not a comment m(abc) m{abc} m[abc]  - ok Perl Bast Practices: Don't use any delimiters other than // or m{}
Foreach  var localization  my @array = (1,2,3); my $var = 'foo'; foreach $var (@array) {  # note - no "my $var"  print $var . "\n"; } print 'Value after the loop: ' . $var . "\n"; Value of $var after loop is “foo”. It is the same as before loop! WTF?
Foreach  var localization - continued The same example but with $_  $_ = 'foo'; print; foreach (@array) { print; } print; And again, the $_ is the same as before loop! This behavior can be observed in "foreach" loops, but not in "while" loops. So be careful.
So, you would like to create two dimensional array? @array = ( (1,2,3), (4,5,6), (7,8,9)); Wrong. It makes @aray = (1,2,3,4,5,6,7,8,9);.  This is caled array flattening.  @array = ( [1,2,3], [4,5,6], [7,8,9]); You do not get exactly array of arrays - you get the array of references to array.
Autodefining var my $var;   # $var is not defined if (defined $var) { warn "yes"; } else {  warn "no"; } # warns: "no" if (defined $var->{'foo'}) {  warn "yes"; } else { warn "no"; } # well, it is not defined. But  "if (defined $var->{'foo'})" made our $var defined! if (defined $var) {  warn "yes"; } else { warn "no"; }  # warns: "yes"! print ref $var;   # HASH! Analogically, if ($var->[0]) makes an empty arrayref.
Fun with counting months, years and weekdays ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); Month day: from  1  to  31 Month:  0  to  11.  WTF? Explanation: This makes it easy to get a month name from a list: my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );  print "$abbr[$mon] $mday";
Fun with counting months, years and weekdays $year  is the number of years since 1900, not just the last two digits of the year. That is,  $year  is 123 in year 2023. We have seen using last two digits for year, and Y2K problems it made. We have seen counting time from 1970. We have seen counting time from begining of A.D. (like: 2009). So why 1900? It is strange, but it is the same in C and Java. Perl inherited it from C libs. It neither have the possiblility to store year in two digits, nor the possiblility not force  programmers to count year in special way. $year += 1900;
Fun with counting months, years and weekdays $wday is the day of the week, with 0 indicating Sunday and 3 indicating Wednesday. Monday is 1st, Saturday is 5th, Sunday is zeroth. Beware that Sunday is not 7th, nor 1st, as most people would thought. This solution is good for both groups of people - those that think that Monday is first day of weeks (as it is 1st) and those that Sunday is at the beginning of the week (as it is zeroth) ;-) Just be aware of those little traps in localtime.
Three ways of calling subroutine sub my_subroutine {... my_subroutine;  The subroutine need to be declared earier
my_subroutine();  No need to declare earlier
&my_subroutine;  No need to declare earlier, too, but it passes the content of @_ to called subroutine! If you call subroutine with the "&" at beginning, you get an implicit argument list passed that you probably did not intend.
last  in function Imagine you have a loop and call a function (sub) in it – your, or from some module. And someone by mistake left there  last . It terminates your loop. for … { something…; function(); something… that would not be executed… }; For some people it is a WTF, for some it is very logical way, that it should work like.
The truth is out there What is false? 0

More Related Content

ODP
Red Flags in Programming
ODP
Anacronia on speed
PDF
RubyConf Portugal 2014 - Why ruby must go!
PPT
Falcon初印象
PDF
perl 6 hands-on tutorial
PPT
Learning Ruby
PPT
CGI With Object Oriented Perl
PDF
A Whirlwind Tour of Perl
Red Flags in Programming
Anacronia on speed
RubyConf Portugal 2014 - Why ruby must go!
Falcon初印象
perl 6 hands-on tutorial
Learning Ruby
CGI With Object Oriented Perl
A Whirlwind Tour of Perl

Similar to WTFin Perl (20)

PPT
Dealing with Legacy Perl Code - Peter Scott
PPT
LPW: Beginners Perl
PDF
PDF
Perl intro
PPT
You Can Do It! Start Using Perl to Handle Your Voyager Needs
PPTX
Lecture 3 Perl & FreeBSD administration
ODP
Introduction to Perl
ODP
Introduction to Perl - Day 1
PDF
Good Evils In Perl
DOCX
Simple perl scripts
PDF
Scripting3
ODP
Beginning Perl
ODP
Intermediate Perl
ODP
Advanced Perl Techniques
ODP
Perl Introduction
PPT
Perl Presentation
PDF
Our Friends the Utils: A highway traveled by wheels we didn't re-invent.
PDF
Cs3430 lecture 15
PPTX
Perl slid
ODP
Introduction to Perl - Day 2
Dealing with Legacy Perl Code - Peter Scott
LPW: Beginners Perl
Perl intro
You Can Do It! Start Using Perl to Handle Your Voyager Needs
Lecture 3 Perl & FreeBSD administration
Introduction to Perl
Introduction to Perl - Day 1
Good Evils In Perl
Simple perl scripts
Scripting3
Beginning Perl
Intermediate Perl
Advanced Perl Techniques
Perl Introduction
Perl Presentation
Our Friends the Utils: A highway traveled by wheels we didn't re-invent.
Cs3430 lecture 15
Perl slid
Introduction to Perl - Day 2
Ad

Recently uploaded (20)

PPTX
A Presentation on Touch Screen Technology
PDF
Zenith AI: Advanced Artificial Intelligence
PPTX
Chapter 5: Probability Theory and Statistics
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PDF
WOOl fibre morphology and structure.pdf for textiles
PPTX
Tartificialntelligence_presentation.pptx
PDF
Enhancing emotion recognition model for a student engagement use case through...
PPTX
OMC Textile Division Presentation 2021.pptx
PPTX
TLE Review Electricity (Electricity).pptx
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Approach and Philosophy of On baking technology
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
August Patch Tuesday
PDF
MIND Revenue Release Quarter 2 2025 Press Release
A Presentation on Touch Screen Technology
Zenith AI: Advanced Artificial Intelligence
Chapter 5: Probability Theory and Statistics
Univ-Connecticut-ChatGPT-Presentaion.pdf
Group 1 Presentation -Planning and Decision Making .pptx
Programs and apps: productivity, graphics, security and other tools
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
WOOl fibre morphology and structure.pdf for textiles
Tartificialntelligence_presentation.pptx
Enhancing emotion recognition model for a student engagement use case through...
OMC Textile Division Presentation 2021.pptx
TLE Review Electricity (Electricity).pptx
Accuracy of neural networks in brain wave diagnosis of schizophrenia
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Approach and Philosophy of On baking technology
cloud_computing_Infrastucture_as_cloud_p
August Patch Tuesday
MIND Revenue Release Quarter 2 2025 Press Release
Ad

WTFin Perl

  • 1. The WTFish side of using Perl Lech Baczyński http://perl.baczynski.com
  • 2. Thanks, Hurra I would like to thank Hurra Communications, the company that sponsored my trip here, probably the most Perl-ish company in Poland www.hurra.com
  • 3. What do I mean by WTF Strange unexpected results of Perl code: developer's inexperience, or
  • 4. Perl's strange behaviour (both seem to be the same after a while :-) ) Examples: foreach variable localization, “zero but true”, dangers of omitting brackets, lazy print ... Some are for beginners (not-beginners – have patience!), some may puzzle intermediate programmers.
  • 5. Lazy print Let's say you would like to see progress of a long computing... foreach my $element (@array) { # ..... long time operations ... $i++; if ( $i % 100 == 0) { print "."; }; Will it print dot every 100th iteration? No. It will print all of them at once at the end.
  • 6. Lazy print - continued $|++ WTF is $|++ ? It is incrementing one of Perl's strange variables (magic punctuation variables). $| If set to nonzero, forces a flush right away and after every write or print on the currently selected output channel. Using $|++ is not perl best practice. Solution: use English; # '-no_match_vars'; then use the $OUTPUT_AUTOFLUSH variable
  • 7. Who needs brackets Omitting brackets – both convenient and dangerous $a="Hello"; $b="world"; print $a . " " . $b . "\n"; print "Found ". scalar @arr ." elements\n";
  • 8. Who needs brackets - continued $a = 'Hello'; print ( length ( $a ) ); print length $a; output: 5 - ok print length $a . " letters\n" ; output: 14 – WTF?? Length was calculated of concatenated strings $a and "letters\n", thus length returned 14. So beware - sometimes you may ignore brackets, sometimes you may not.
  • 9. Regexps: {n,m} Let's say you want to match three to five small letters : /[a-z]{3,5}/ And now any number not less than three /[a-z]{3,}/ And now, analogically, any number not more than five /[a-z]{,5}/ # WRONG It works only one way - {n,}, not {,n} - the explanation is easy: you can easily write 0, but it not so easy to write infinity
  • 10. Regexps: Minus (-) sign in character classes [ ] Beware of matching "-" in regexps. If you want to match letters a,b,c and minus sign: Good: [-abc] Good: [abc-] Bad: [a-bc] Good: [a\-bc]
  • 11. Regexps: delimiters Only if you use // then m is optional. Some need to be closed other way than opened. /abc/ - ok |abc| - wrong m|abc| - will work m/abc/ - will work, m is optional m#abc# - will work, not a comment m(abc) m{abc} m[abc] - ok Perl Bast Practices: Don't use any delimiters other than // or m{}
  • 12. Foreach var localization my @array = (1,2,3); my $var = 'foo'; foreach $var (@array) { # note - no "my $var" print $var . "\n"; } print 'Value after the loop: ' . $var . "\n"; Value of $var after loop is “foo”. It is the same as before loop! WTF?
  • 13. Foreach var localization - continued The same example but with $_ $_ = 'foo'; print; foreach (@array) { print; } print; And again, the $_ is the same as before loop! This behavior can be observed in "foreach" loops, but not in "while" loops. So be careful.
  • 14. So, you would like to create two dimensional array? @array = ( (1,2,3), (4,5,6), (7,8,9)); Wrong. It makes @aray = (1,2,3,4,5,6,7,8,9);. This is caled array flattening. @array = ( [1,2,3], [4,5,6], [7,8,9]); You do not get exactly array of arrays - you get the array of references to array.
  • 15. Autodefining var my $var; # $var is not defined if (defined $var) { warn "yes"; } else { warn "no"; } # warns: "no" if (defined $var->{'foo'}) { warn "yes"; } else { warn "no"; } # well, it is not defined. But "if (defined $var->{'foo'})" made our $var defined! if (defined $var) { warn "yes"; } else { warn "no"; } # warns: "yes"! print ref $var; # HASH! Analogically, if ($var->[0]) makes an empty arrayref.
  • 16. Fun with counting months, years and weekdays ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); Month day: from 1 to 31 Month: 0 to 11. WTF? Explanation: This makes it easy to get a month name from a list: my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); print "$abbr[$mon] $mday";
  • 17. Fun with counting months, years and weekdays $year is the number of years since 1900, not just the last two digits of the year. That is, $year is 123 in year 2023. We have seen using last two digits for year, and Y2K problems it made. We have seen counting time from 1970. We have seen counting time from begining of A.D. (like: 2009). So why 1900? It is strange, but it is the same in C and Java. Perl inherited it from C libs. It neither have the possiblility to store year in two digits, nor the possiblility not force programmers to count year in special way. $year += 1900;
  • 18. Fun with counting months, years and weekdays $wday is the day of the week, with 0 indicating Sunday and 3 indicating Wednesday. Monday is 1st, Saturday is 5th, Sunday is zeroth. Beware that Sunday is not 7th, nor 1st, as most people would thought. This solution is good for both groups of people - those that think that Monday is first day of weeks (as it is 1st) and those that Sunday is at the beginning of the week (as it is zeroth) ;-) Just be aware of those little traps in localtime.
  • 19. Three ways of calling subroutine sub my_subroutine {... my_subroutine; The subroutine need to be declared earier
  • 20. my_subroutine(); No need to declare earlier
  • 21. &my_subroutine; No need to declare earlier, too, but it passes the content of @_ to called subroutine! If you call subroutine with the "&" at beginning, you get an implicit argument list passed that you probably did not intend.
  • 22. last in function Imagine you have a loop and call a function (sub) in it – your, or from some module. And someone by mistake left there last . It terminates your loop. for … { something…; function(); something… that would not be executed… }; For some people it is a WTF, for some it is very logical way, that it should work like.
  • 23. The truth is out there What is false? 0
  • 26. undef
  • 27. () empty list what about "0.0"? And "0E0"? "0.0", "0E0", "0 but true","false","foo" are all true. 0.0 is false (number, not string)
  • 28. The truth is out there “0 but true” - self documenting WTF :) It is true, but when treated as a number it is zero. print "0 but true" ? "true\n" : "false\n"; print "0 but true" + 0 ? "true\n" : "false\n"; First is true, second is false. You can add it to number: print "0 but true" + 7; As most other strings: print "foo" + 7; Beware of strings starting with inf... nad nan...
  • 29. Comparing apples to oranges if ("apple" == "orange") { .... True! Beware of "==" and "eq" difference. "==" is for numbers, "eq" for strings. perl 5.10 and later: $scalar ~~ $scalar; If both look like numbers, do "==", otherwise do "eq"
  • 30. That's all folks! Thank you.