warning: Creating default object from empty value in /var/www/drupal-5.23/modules/taxonomy/taxonomy.module on line 1418.

Perl で、住所から緯度経度を取得する方法

Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}
Geo::Google モジュールを利用する (米国)。住所を渡せばコーディング的にはほとんど 1行で緯度経度を返してくれる。Google Maps にアクセスしにいって緯度経度を取ってきていてるので、地図データベースは Google Maps のものである。以前紹介した PHP のときのように SOAP も何もいらない (Geo::Google は、内部で LWP::Simple を利用している)。PHP の Geocoder 版は、Geocoder のデータベースに SOAP 経由でアクセスする。少し使ってみた結果、Geocoder のデータベースは少しズレが生じるようである (米国の場合)
use utf8;
use Encode;
use Geo::Google;
use XML::Parser;
#!/usr/bin/perl

use utf8;
use Encode;
use Geo::Google;
use XML::Parser;

my $lng, $lat;
my $address1 = 'your address part 1 here';
my $address2 = 'your address part 2 here';


my ($degree) = getDegrees("$address1 $address2");

if($degree) {

    $lng = $degree->longitude;
    $lat = $degree->latitude;

} else {

    $lng = ''; $lat = '';
}

sub getDegrees {    #  住所から緯度経度を検索

    return $GEO->location( address => Encode::encode_utf8(shift));
                                                        # shift = address / リファレンスを返す
}

Perl で、アップロードしたファイルを処理する

Perl の場合は、CGI として動作させる場合は、必ず
print qq|Content-type: text/html\n\n|;
という行が必要な以外は、PHP とほとんど同じである。 アップロードには、いつも使っているおなじみの CGI モジュールを使う。
use CGI;
そうすると、以下のようにアクセスできる。
our $CGI = new CGI;
...
my $xml = $CGI->param('file');
$xml はファイルポインタが入っている。通常は open(IN, "..."); などするときの IN にあたるものである。以下は、コード。アップロードする側の HTML ファイルは PHP でアップロードファイルを処理するで紹介したのと同じ。
#!/usr/bin/perl

use strict;
use CGI;

our $CGI = new CGI;

print qq|Content-type: text/html\n\n|;
init();

sub init() {

    # XMLパーサー作成 ('UTF-8')
    my $xml_parser = new XML::Parser(    ProtocolEncoding => 'UTF-8',
                                        Handlers=>{    Start=>\&startElement,
                                                    End  =>\&endElement,
                                                    Char =>\&dataHandler    });
    # ファイルのオープンはいらない。input タグで指定した name 属性がそのままファイルハンドルになる
    my $xml = $CGI->param('file');

    # XMLパース処理
    $xml_parser->parse($xml) or    die "XML error: $xml_parser";

    # ファイルクローズ
    close($xml);
}

1;
Perl の場合は、CGI として動作させる場合は、必ず
print qq|Content-type: text/html\n\n|;
という行が必要な以外は、PHP とほとんど同じである。 アップロードには、いつも使っているおなじみの CGI モジュールを使う。
use CGI;
そうすると、以下のようにアクセスできる。
our $CGI = new CGI;
...
my $xml = $CGI->param('file');
$xml はファイルポインタが入っている。通常は open(IN, "..."); などするときの IN にあたるものである。以下は、コード。アップロードする側の HTML ファイルは PHP でアップロードファイルを処理するで紹介したのと同じ。
#!/usr/bin/perl

use strict;
use CGI;

our $CGI = new CGI;

print qq|Content-type: text/html\n\n|;
init();

sub init() {

    # XMLパーサー作成 ('UTF-8')
    my $xml_parser = new XML::Parser(    ProtocolEncoding => 'UTF-8',
                                        Handlers=>{    Start=>\&startElement,
                                                    End  =>\&endElement,
                                                    Char =>\&dataHandler    });
    # ファイルのオープンはいらない。input タグで指定した name 属性がそのままファイルハンドルになる
    my $xml = $CGI->param('file');

    # XMLパース処理
    $xml_parser->parse($xml) or    die "XML error: $xml_parser";

    # ファイルクローズ
    close($xml);
}

1;

Perl で、HTML 文書中にあるリンクを置換する

以下は、HTML 文書中にあるリンクを任意の文字列に置換するスクリプトであるが、他のタグでもいろいろと応用が利くと思われる。
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Status;
use HTTP::Response;

our $URL = 'https://perltips.twinkle.cc/'; # アクセスする URL

my $proxy = new LWP::UserAgent;
$proxy->agent('your own created browser name here');
$proxy->timeout(60);

my $response = $proxy->request(HTTP::Request->new('GET' => $URL));
my $content = $response->content;

my %tags = (

    'img'  => 'src',
    'a'    => 'href',
    'link' => 'href',
    'td'   => 'background',
    'form' => 'action'
);

my $data = $content;

skip_others: while($data =~ s/<([^>]*)>// && $i++ < 10000) { # 無限ループに陥るのを防ぐ

    my $in_brackets = $1;

    foreach $key (keys %tags) {

        if($in_brackets =~ /^\s*$key\s+/i) {

            if($in_brackets =~ /\s+$tags{$key}\s*=\s*["']([^"']*)["']/i
            || $in_brackets =~ /\s+$tags{$key}\s*=\s*([^\s]+)/i        ) {

                my $link =  $1;

                $link =~ s/[\n\r]//g;
                $link =~ s/\./\\./g;
                $link =~ s/\?/\\?/g;

                $content    =~
                    s/\s*=\s*["']*$link["']*/=<<<ここに置換文字列を書く>>>/
                    if $link !~ m/mailto:/i
                    && $link !~ m/javascript/i;

                next skip_others;
            }
        }
    }
}

1;
以下は、HTML 文書中にあるリンクを任意の文字列に置換するスクリプトであるが、他のタグでもいろいろと応用が利くと思われる。
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Status;
use HTTP::Response;

our $URL = 'https://perltips.twinkle.cc/'; # アクセスする URL

my $proxy = new LWP::UserAgent;
$proxy->agent('your own created browser name here');
$proxy->timeout(60);

my $response = $proxy->request(HTTP::Request->new('GET' => $URL));
my $content = $response->content;

my %tags = (

    'img'  => 'src',
    'a'    => 'href',
    'link' => 'href',
    'td'   => 'background',
    'form' => 'action'
);

my $data = $content;

skip_others: while($data =~ s/<([^>]*)>// && $i++ < 10000) { # 無限ループに陥るのを防ぐ

    my $in_brackets = $1;

    foreach $key (keys %tags) {

        if($in_brackets =~ /^\s*$key\s+/i) {

            if($in_brackets =~ /\s+$tags{$key}\s*=\s*["']([^"']*)["']/i
            || $in_brackets =~ /\s+$tags{$key}\s*=\s*([^\s]+)/i        ) {

                my $link =  $1;

                $link =~ s/[\n\r]//g;
                $link =~ s/\./\\./g;
                $link =~ s/\?/\\?/g;

                $content    =~
                    s/\s*=\s*["']*$link["']*/=<<<ここに置換文字列を書く>>>/
                    if $link !~ m/mailto:/i
                    && $link !~ m/javascript/i;

                next skip_others;
            }
        }
    }
}

1;

Perl で、ライブラリのパスを指定する方法

いくつか方法がある。
方法1:

use lib 'ライブラリのあるパス';
use Foo::Bar;
...
方法2:

unshift @INC, 'ライブラリのあるパス';
use Foo::Bar;
...

とかして、強制的に @INC に入れる。
方法3:

スクリプト中で強制的にインクルードするライブラリへのパスを含めちゃう

(スクリプトの先頭、おなじみ #!/usr/bin/perl の部分に -I オプションを付ける)

#!/usr/bin/perl -I/home/yourdir/lib

方法4:

perl -e shell -MCPAN じゃなくてアーカイブのやつをインストールするには、<br />ライブラリの tar.gz を解凍して

# perl Makefile.PL PREFIX=/home/yourname/yourdir/lib
# make install

とかする。PREFIX= でインストール先を指定できる。
Perl のライブラリには必ず Makefile.PL というファイルが入っているから<br />PREFIX オプションを指定してダメだった場合、このファイルの中身をチェックする必要がある。
いくつか方法がある。
方法1:

use lib 'ライブラリのあるパス';
use Foo::Bar;
...
方法2:

unshift @INC, 'ライブラリのあるパス';
use Foo::Bar;
...

とかして、強制的に @INC に入れる。
方法3:

スクリプト中で強制的にインクルードするライブラリへのパスを含めちゃう

(スクリプトの先頭、おなじみ #!/usr/bin/perl の部分に -I オプションを付ける)

#!/usr/bin/perl -I/home/yourdir/lib

方法4:

perl -e shell -MCPAN じゃなくてアーカイブのやつをインストールするには、<br />ライブラリの tar.gz を解凍して

# perl Makefile.PL PREFIX=/home/yourname/yourdir/lib
# make install

とかする。PREFIX= でインストール先を指定できる。
Perl のライブラリには必ず Makefile.PL というファイルが入っているから<br />PREFIX オプションを指定してダメだった場合、このファイルの中身をチェックする必要がある。
Posted on 2005-11-21 by yas |