インターネット

Perl で、URL を抽出したい。

URI::Find で URL を抜き出して、さらに正規表現を使って正確に取得している。

使用するモジュール


use URI::Find
#/usr/bin/perl my $text = 'https://twinkle.cc/i/'; my $url = getURL($text); sub getURL {
use URI::Find;
my $text = shift;

my $finder = URI::Find->new(
    sub {
        my($uri, $orig_uri) = @_;
            return $uri;
    });

$finder->find(¥$text);
    my $http_URL_regex =
q{¥b(?:https?|shttp)://(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])} .
q{?¥.)*[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?¥.?|[0-9]+¥.[0-9]+¥.[0-9} .
q{]+¥.[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-F} .
q{a-f][0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0} .
q{-9A-Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-} .
q{Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])} .
q{*)*)*(?:¥?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f} .
q{])*)?)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-} .
q{f])*)?(?![-_.!~*'()a-zA-Z0-9;/?:@&=+$,#])}; #}}

return $text =~ /($http_URL_regex)/ ? $1 : '';
} 1;
続きを読む

Perl で、セッション管理をしたい。 (Apache::Session)

Apache::Session を使う。 パフォーマンスを少し測ってみたら CGI::Session よりも若干速いようである。

このモジュールは eval {...}; とセットで使うとよい。 - Perl で、例外処理をするような感じのもの。if($@) {...} のセットで使う。eval にはセミコロン(;) を忘れないこと。

例では、%session を $session としてハッシュで返している。
このモジールを使う利点は、ID の長さを自由に変えられることである。CGI::Session の場合は、ID の長さを変えたければ、自分で書かなければならない。一方で短所は、セッションの有効期限を設定できないこと。そのため、MySQL 中のsessions テーブルに timestamp フィールドを独自に追加して、自身の CGI の中か cron で適宜 reap する必要がある。また、セッションオブジェクト中の個別のデータにも有効期限を設けることはできない (CGI::Session はできる)。それでもこのモジュールが良いのは、パフォーマンスが CGI::Session よりも若干良いのと、ID の長さを変えられるからである。


use DBI;
use Apache::Session;

このモジュールは永続ストレージ (要はセッション情報をずっと溜めておけるデータベース) の種類によっていろいろな種類がある。


Apache::Session::MySQL
Apache::Session::Postgres
Apache::Session::File
Apache::Session::Oracle
Apache::Session::Sybase
Apache::Session::DB_File
Apache::Session::Flex 	実行時にすべてのパラメータを指定する

以下の例では Apache::Session::Flex を使っている。

use DBI; use Apache::Session::Flex; $session = _getSession; print $session->{_sessin_id} sub _getSession {
my $db;
my ($database, $username, $password);
# 以上の変数には値を入れること。

$db = DBI->connect("DBI:mysql:$databasename",
                             $username,
                             $password
                             ) || die 'Cannot connect db';
eval {
tie %session, 'Apache::Session::Flex', $sid, {

    Store      => 'MySQL',
    Lock       => 'MySQL',
    Generate   => 'MD5',
    IDLength   => 32,
    Serialize  => 'Storable',
    Handle     => $db,
    LockHandle => $db,
};
}; # セミコロンを忘れないこと if($@) { # $@: error message of eval
return undef;
} # セッション ID の取得に成功。ここに処理を書く。
return \%session;
}
続きを読む

Perl で、URL の自動リンクをしたい

以前私は正規表現を使っていたが、 URI::Find とそれにピッタリのモジュールを発見。以来こちらに移行。

使用するモジュール


use URI::Find;
#!/usr/bin/perl sub urlToLink {
use URI::Find;
my $text = shift;

my $finder = URI::Find->new(
    sub {
        my($uri, $orig_uri) = @_;
        return qq|<a href="$uri">$orig_uri</a>|;
    });
$finder->find(¥$text);

return $text;
} 1;
続きを読む
インターネット を購読