Difference between revisions of "Perl"

From dbawiki
Jump to: navigation, search
(Difference in hours between two dates)
(Difference in hours between two dates)
Line 13: Line 13:
  
  
 +
===Send an email from perl without needing any external modules===
 +
but it only works on Unix :(
 +
<pre>
 +
# Simple Email Function
 +
# ($to, $from, $subject, $message)
 +
sub sendemail
 +
{
 +
    my ($to, $from, $subject, $message) = @_;
 +
    my $sendmail = '/usr/lib/sendmail';
 +
    open(MAIL, "|$sendmail -oi -t");
 +
    print MAIL "From: $from\n";
 +
    print MAIL "To: $to\n";
 +
    print MAIL "Subject: $subject\n\n";
 +
    print MAIL "$message\n";
 +
    close(MAIL);
 +
}
 +
</pre>
 +
Using the function is straightforward. Simply pass it the data in the correct order.
 +
<pre>
 +
sendemail ( "toemail\@mydomain.com", "fromemail\@mydomain.com", "Simple email.", "This is a test of the email function." );
 +
</pre>
 
===Difference in hours between two dates===
 
===Difference in hours between two dates===
 
<pre>
 
<pre>
Line 42: Line 63:
  
 
</pre>
 
</pre>
 +
 
===Slurp an external file into a variable===
 
===Slurp an external file into a variable===
 
The idea is to read an SQL file into a variable to prepare and execute it<pre>
 
The idea is to read an SQL file into a variable to prepare and execute it<pre>

Revision as of 18:00, 5 November 2013

Some one liners: socher.org

A one-line web server!

perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 ? "./$1 |" : $1) if /^GET \/(.*) / })'
  • First we accept a socket and fork the server. Then we overload the new socket as a code ref. This code ref takes one argument, another code ref, which is used as a callback.
  • The callback is called once for every line read on the socket. The line is put into $_ and the socket itself is passed in to the callback.
  • Our callback is scanning the line in $_ for an HTTP GET request. If one is found it parses the file name into $1. Then we use $1 to create an new IO::All file object... with a twist. If the file is executable("-x"), then we create a piped command as our IO::All object. This somewhat approximates CGI support.
  • Whatever the resulting object is, we direct the contents back at our socket which is in $_[0].

From: commandlinefu.com


Send an email from perl without needing any external modules

but it only works on Unix :(

#	Simple Email Function
#	($to, $from, $subject, $message)
sub sendemail
{
    my ($to, $from, $subject, $message) = @_;
    my $sendmail = '/usr/lib/sendmail';
    open(MAIL, "|$sendmail -oi -t");
    print MAIL "From: $from\n";
    print MAIL "To: $to\n";
    print MAIL "Subject: $subject\n\n";
    print MAIL "$message\n";
    close(MAIL);
}

Using the function is straightforward. Simply pass it the data in the correct order.

sendemail ( "toemail\@mydomain.com", "fromemail\@mydomain.com", "Simple email.", "This is a test of the email function." );

Difference in hours between two dates

use Time::localtime;
use DateTime::Format::Strptime qw();

        my $parser = DateTime::Format::Strptime->new (
            pattern  => '%d-%b-%y %H:%M:%S',
            locale   => 'en',   # 'Mon', 'Jul' are English
            on_error => 'croak'
        );
        my $timethen = $parser->parse_datetime( $started );
        my $timenow  = DateTime->now( time_zone => 'local' )->set_time_zone('floating');
        my $timediff = $timenow->subtract_datetime($timethen);

print ('<!-- HOURS: ',$timediff->hours(),' -->',"\n");

or, without using any external modules...


        my ($host,$sid,$dbid,$timethen,$recid,$stamp,$started,$duration,$size,$status,$type) = split (/\|/);

        # ----------------------------
        # work out how old the file is
        # ----------------------------
        my $timenow    = time();
        my $difference = $timenow - $timethen;  # in seconds
        my $hours      = $difference/60/60;

Slurp an external file into a variable

The idea is to read an SQL file into a variable to prepare and execute it
#!/usr/bin/perl -w
use strict;
my $stmt;
my $quoted_stmt;
$quoted_stmt = 7;
open (FH,"<","test.sql") or die $!;
local $/='';
$stmt = <FH>;
close FH;
$quoted_stmt = eval('q('.$stmt.')');
print $quoted_stmt."\n";