K1's ManiYac Blog
徹底的に無料で使えて実用的なフリーソフトの紹介です
随時更新が面倒なのでBlog形式で更新いたします

 
徹底的に無料で使えて実用的なフリーソフトの紹介です
k1s - Perl 覚書の記事
>>このカテゴリーの記事一覧

2010年 3月 19日 (金)

ブログの更新通知(Update.ping)を受信するperlのスクリプトです

by k1s

http://naoya.dyndns.org/~naoya/mt/archives/000423.html
に公開されているサンプルを参考に指定件数(30件)ほどpingを受信して
textファイルに保存するスクリプトをかきました。
rssファイルを読みに行かないとタイトル等まで拾えないのですが、
どなたか書き加えていただけないでしょうか?

みようみまねなのでperlの記述は綺麗にかけません。

##################################

#!/usr/bin/perl
#######################
# Ping 受信プログラム #
#######################
#txt file に保存する件数
my $max = 30;
my $guest_file = './ping.txt';
use strict;
use warnings;
use XMLRPC::Transport::HTTP;
XMLRPC::Transport::HTTP::CGI->dispatch_to('weblogUpdates')->handle;
package weblogUpdates;
sub ping {
my $self = shift;
my ($name, $url,$surl,$catname) = @_;
my $LT;
my $LLT;
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;
my $wday;
my $yday;
my $isdst;
my $month;
my $Xyear;
my $Xmon;
my $Xday;
my $Xmday;
my $count;
my $value;
my @DATA;

$LT = time;
$LLT = $LT +86400*$a;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($LLT);
$month = ($mon + 1);
$Xyear = $year + 1900;
if ($month < 10 ){$Xmon = "0".$month} else {$Xmon = $month}
if ($mday < 10 ){$Xday = "0".$mday} else {$Xday = $mday}
if ($hour < 10) { $hour = "0$hour"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }

open(NOTE,"$guest_file");
@DATA = ;
close(NOTE);

$count = @DATA;
if ($count > $max) { pop (@DATA); }
$value = "$Xyear/$Xmon/$Xday,$hour:$min:$sec,$name,$url,$surl,$catname\n";
unshift (@DATA,$value);
open (NOTE, ">$guest_file");
print NOTE @DATA;
close(NOTE);

# 書込み処理

return { flerror => XMLRPC::Data->type('boolean', 0),
message => "Thanks for the ping" };
exit;
}


2007年 8月 8日 (水)

cgi(perl)でのsort(ソート)記述の仕方

by k1s

しばらくすると忘れそうなのでperlでのsortする場合の記述をメモしておきます

頻繁に必要になりそうな形です
 2次配列で特定の項目で並べ替える場合

@LIST = ('A,7,佐藤',
'B,6,佐々木',
'A,4,高橋',
'C,5,田中',
'B,2,川口',
'C,1,雨宮',
'A,3,吉田');

2番目の要素(数字)で昇順で並べ替え
@LIST = map {$_->[0]} sort {$a->[2] <=> $b->[2]} map {[$_, split /,/]} @LIST;

3番目の要素(名前)で降順で並べ替え
@LIST = map {$_->[0]} sort {$b->[3] cmp $a->[3]} map {[$_, split /,/]} @LIST;

1番目の要素で昇順で並べ替えし,さらに2番目の要素(数字)で降順で並べ替えを行う
@LIST = map {$_->[0]} sort {$a->[1] cmp $b->[1] or $b->[2] <=> $a->[2]} map {[$_, split /,/]} @LIST;


以上の記述は Schwartzian Transform という方式だそおうです。
一番最初のスクリプトはデータ要素2番目の数字で並べ替えをおこなっております。
sort関数では配列の中全てを並べ変えしてしまうので要素ごとに分解し特定の要素のみを並べ替えします

@LIST = sort {
my ($class, $number, $name) = split(/,/, $a);
my ($class, $number, $name) = split(/,/, $b);
$number <=> $number;
} @LIST;

上記の記述を効率的に行うのがSchwartzian Transformだそうです












RSS


RingBlog v3.22