Difference between revisions of "Perl"

From Leaky
Jump to: navigation, search
(Added a tip about buffering)
(Modules: Added installation of custom perl)
Line 11: Line 11:
 
* http://search.cpan.org/~ironcamel/Dancer-Plugin-DBIC/lib/Dancer/Plugin/DBIC.pm
 
* http://search.cpan.org/~ironcamel/Dancer-Plugin-DBIC/lib/Dancer/Plugin/DBIC.pm
 
* http://search.cpan.org/~flora/DBIx-Class-PassphraseColumn-0.02/lib/DBIx/Class/PassphraseColumn.pm
 
* http://search.cpan.org/~flora/DBIx-Class-PassphraseColumn-0.02/lib/DBIx/Class/PassphraseColumn.pm
 +
 +
== Custom Perl ==
 +
 +
Installing a custom version of Perl just for a single user (e.g a project) without breaking the system-wide Perl.
 +
 +
As the unprivileged user:
 +
 +
$ curl -L https://install.perlbrew.pl | bash
 +
$ source ~/perl5/perlbrew/etc/bashrc
 +
$ perlbrew install perl-5.20.1
 +
$ perlbrew switch perl-5.20.1
 +
$ perlbrew install-cpanm
 +
$ echo 'source /home/plates/perl5/perlbrew/etc/bashrc' >> ~/.bashrc
 +
 +
After this you should be always using Perl 5.20.1 as this user (that's what the perlbrew switch does). To install modules, simply use ''cpanm'' followed by the module name.
  
 
== Tips ==
 
== Tips ==

Revision as of 14:36, 27 June 2016

Frameworks

Modules

DBIx::Class modules

Custom Perl

Installing a custom version of Perl just for a single user (e.g a project) without breaking the system-wide Perl.

As the unprivileged user:

$ curl -L https://install.perlbrew.pl | bash
$ source ~/perl5/perlbrew/etc/bashrc
$ perlbrew install perl-5.20.1
$ perlbrew switch perl-5.20.1
$ perlbrew install-cpanm
$ echo 'source /home/plates/perl5/perlbrew/etc/bashrc' >> ~/.bashrc

After this you should be always using Perl 5.20.1 as this user (that's what the perlbrew switch does). To install modules, simply use cpanm followed by the module name.

Tips

Mixing STDOUT and STDERR output in the right order

STDOUT and STDERR are block buffered when there is no terminal, or line buffered when there is a terminal. This has the unfortunate side effect of making output from print/warn mess up when running a script from cron when the same script works perfectly run from the command line.

Redirect STDERR to the same stream as STDOUT (equiv to 2>&1 in bash) - this isn't essential, but makes it easier to pipe the output through tail/mail/etc, or redirect the output to a logfile.

close(STDERR);
open(STDERR, ">&STDOUT");

Make both streams non-buffering

select(STDERR);
$| = 1;
select(STDOUT);
$| = 1;

Alternatively, instead of the select() above, you can use IO::Handle

use IO::Handle;
STDERR->autoflush(1);
STDOUT->autoflush(1);