Perl でベンチマーク

Benchmark パッケージの timethese でベンチマークが取れる.

#!/usr/env/bin perl

use Benchmark;

$count = 1000;

timethese($count, {
    '$a = $a . "a"' => sub {
                           for ($i = 0; $i < 100; $i++) {
                               $a = $a . "a"
                           }
                       },
    '$a .= "a"    ' => sub {
                           for ($i = 0; $i < 100; $i++) {
                               $a .= "a"
                           }
                       },
});


出力

Benchmark: timing 10000 iterations of $a .= "a"    , $a = $a . "a"...
$a .= "a"    :  0 wallclock secs ( 0.17 usr +  0.00 sys =  0.17 CPU) @ 5882.35/s (n=1000)
$a = $a . "a": 85 wallclock secs (84.41 usr +  0.01 sys = 84.42 CPU) @ 11.85/s (n=1000)

・・・$a = $a . "a" はめたくそに遅い.

回数が少なすぎると

(warning: too few iterations for a reliable count)

と warning が出る

ISBN をアマゾンの URL に変換する chalow プラグイン

  (ISBN を引数として渡す)

sub amazon {
    my ($k) = @_;
    my $o = $k;
    $k =~ s/[^0-9a-zA-Z]//g;
    return qq(<a href="http://www.amazon.co.jp/o/ASIN/$k/">$o</a>);
}

Perl でファイルの行数を数える

$. が最後に入力したファイルハンドルの行数を格納している
ファイルハンドルを最後まで読み込み,$. を参照すると OK.

#!/usr/bin/env perl

open(FILE, 'hoge') or die;
print <FILE>;   # ファイル内容を出力する場合
# 1 for <FILE>; # ファイル内容を出力しない場合
print $. . '行\n';
close(FILE);

PHP で JPEG または TIFF から EXIF ヘッダを読みこむ方法

$exif = exif_read_data('image.jpg', 0, true);
foreach ($exif as $key => $section) {
    foreach ($section as $name => $val) {
        print "$key.$name: $val<br />\n";
    }
}

Perl で日付の処理

- 楽チン

print scalar(localtime);


  Thu May 15 10:22:54 2003

- 自由度高し

use POSIX qw(strftime);
print strftime "%Y-%m-%d %T\n", localtime;


  2003-05-15 10:22:54

Perl でどこで呼び出されたかを返す caller

open FILE, 'hoge' or error("can't open file\n");

sub error {
    print @_[0];
    my @call = caller;
    print "Package name: $call[0]\n";
    print "File name:    $call[1]\n";
    print "Line no:      $call[2]\n";
}


- エラー時の出力

can't open file
Package name: main
File name:    ./test.pl
Line no:      5

シェルスクリプトで root で実行しているか確認する方法

- その 1

UID=`id | sed 's/uid=\([0-9]*\)(.*/\1/'`
if [ $UID -ne 0 ]
then
    echo "Not root"
    exit 1
fi


- その 2

if [ "`id | grep root`" = "" ]
then
    echo "Not root"
    exit 1
fi

Perl による IMAP 認証

use Mail::IMAPClient;

$imap = Mail::IMAPClient->new(
    Server   => $server,
    User     => $user,
    Password => $password
) || die("Can not login.");

FTP をシェルスクリプトで自動運転する方法

- Solaris 8 で確認済み

#!/bin/sh

{
cat<<_EOF_
open hostname
user user password
bin
put filename
_EOF_
} | /bin/ftp -n

シェルエスケープ

sub shell_escape {
    $_ = shift;
    s/([\&\;\`\'\\\"\|\*\?\~\<\>\^\(\)\[\]\{\}\$\n\r ])/\\$1/g;
    return $_;
}