| 
                     
                      2010年 3月 19日 (金)
                     
                    
                      
                      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日 (水)
                     
                    
                      
                      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だそうです
                      
                      
                      
 
                      
                     
                   | 
                 
                
                  | 
                   | 
                 
               
             
          
                  
         |