Perlコーディング

インターネット上のファイル取得

2007年12月17日
Perlでは、外部ドメインのページを取得する関数がないので、処理を書かなければいけないようです。PHPでは内部も外部もfopenで取得できるのですが、Perlはそうはいかないようです。

URLからホスト名とファイルを分け、ソケットをオープンして接続して内容を取得しなければいけません。取得に成功したら、htmlの特殊文字をエスケープします。



呼び出し元
&gePage("取得したいURL")

サブ関数
sub getPage{
 use Socket;

 $url = shift @_;
 my $host;
 my $file_path;

 $host = $url;

 $host =~ s/http:\/\///g;
 $host =~ s/https:\/\///g;
 @domain = split(/\//, $host);

 $file_path = $host;
 $file_path =~ s/@domain[0]//g;

 $host0 = @domain[0];
 $port0 = getservbyname("http", "tcp");

 $ipaddr = inet_aton($host0) or return "ホスト名検出エラー($host0)<br>\n";
 $sock_addr = pack_sockaddr_in($port0, $ipaddr);
 socket(SOCK, PF_INET, SOCK_STREAM, 0) or return "ソケット作成エラー($ipaddr / $port0)<br>\n";
 connect(SOCK, $sock_addr) or return "サーバー接続エラー($ipaddr / $port0)<br>\n";

 select(SOCK);
 $|=1;
 select(STDOUT);

print SOCK << "END_OF_DOC";
GET $file_path HTTP/1.0
Host:$host0
Connection:close

END_OF_DOC


 while(<SOCK>){
  last if m/^\r\n$/;
 }
 while(<SOCK>){
  while(s/</</is){ };
  while(s/>/>/is){ };
  while(s/\r\n|\r|\n/<br>/is){ };
  $page .= $_;
 }
 close SOCK;

 # エスケープ
 $page =~ s/&/&/g;
 $page =~ s/"/"/g;
 $page =~ s/</</g;
 $page =~ s/>/>/g;
 $page =~ s/<br>/\r\n/g;
 $page =~ s/<br>/\r/g;
 $page =~ s/<br>/\n/g;

 return $page;
}