UNIX,LINUX,WinのPerlで動きなおかつ、モジュール(lwpなど)を使わずhttpデータ取得したいのですが何かいいサンプルなどないでしょうか?
お手数おかけしますが、よろしくお願いします!

A 回答 (1件)

LWP を使用しないわけは何ですか?素直に使用して方がいいですよ。


面倒なコーディングをしなくていいので。とりあえず以下にサンプル
を付けますがエラー処理を省いています。
#! /usr/local/bin/perl
#webサーバ名の取得
($remotehost) = @ARGV;
if ($remotehost eq ''){
$remotehost = 'localhost';
}
#ソケットに与えるパラメータの用意
$AF_INET = 2;
$SOCK_STREAM = 1;
$sockaddr = 'S n a4 x8';
chop($localhost = "localhost");
($name, $aliases, $proto) = getprotobyname('tcp');
($name, $aliases, $port) = getservbyname('http', 'tcp');
($name, $aliases, $type, $len, $thisaddr) = gethostbyname($localhost);
($name, $aliases, $type, $len, $thataddr) = gethostbyname($remotehost);
$this = pack($sockaddr, $AF_INET, 0, $thisaddr);
$that = pack($sockaddr, $AF_INET, $port, $thataddr);
#ソケットの作成と接続
if (socket(S, $AF_INET, $SOCK_STREAM, $proto)){
print "socket ok\n";
} else {
die $!;
}
if (bind(S, $this)){
print "bind ok\n";
} else {
die $!;
}
if (connect(S, $that)){
print "onnect ok\n";
} else {
die $!;
}
#ソケットのフラッシュ
select(S); $| = 1; select(STDOUT); # flush S

print "GET /index.html\n\n";
print S "GET /index.html\n";
do {
$msg = <S>;
if(eof(S)){
exit;
}
print STDERR $msg;
} until $msg != "";
    • good
    • 0
この回答へのお礼

環境に依存するようなモジュールはできるだけ利用したくなかった
為、こういったものを探してました。

ありがとうございました。
無事解決できました!

お礼日時:2002/01/30 09:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QLinuxでforkやalarm,wait,waitpid,syscallなどを使ったサンプル

今までWindowsのPerlを使っていました。
forkやalarm,wait,waitpid,syscallなど使ったことがなく、
LinuxのPerl5.8でそれらの関数を習得したいのですが、
何か良いサンプルはありますか?
これに特化した書籍も探しています。

今作りたいものは、
forkで10個プロセスを作成して、ループし、
以下それぞれhello worldを表示させ終わったら、
1個目は終了しました。
2個目は終了しました。
・・・
10個目は終了しました。
終わり。
と表示させるプログラムが作りたいです。
fork,alarm,wait,waitpid,syscallなどプロセス操作、システムコール関数を全て使った良いサンプルも探しています。

------------------------------------
それぞれのhellow word
1個目は 5秒後に hello worldを表示させる
2個目は10秒後に hello worldを表示させる
...
10個目は50秒後にhello worldを表示させる



を使いますが、今まで

今までWindowsのPerlを使っていました。
forkやalarm,wait,waitpid,syscallなど使ったことがなく、
LinuxのPerl5.8でそれらの関数を習得したいのですが、
何か良いサンプルはありますか?
これに特化した書籍も探しています。

今作りたいものは、
forkで10個プロセスを作成して、ループし、
以下それぞれhello worldを表示させ終わったら、
1個目は終了しました。
2個目は終了しました。
・・・
10個目は終了しました。
終わり。
と表示させるプログラムが作りたいです。
fork,alarm,wait,waitp...続きを読む

Aベストアンサー

この質問の要求は 4つですね。
1.forkで10個プロセスを作成して、ループし、
 以下それぞれhello worldを表示させ終わったら、
 1個目は終了しました。
 2個目は終了しました。
 ・・・
 10個目は終了しました。

2.fork,alarm,wait,waitpid,syscallなどプロセス操作、システムコール関数を全て使った良いサンプル探している

3.これに特化した書籍も探しています。

4.hellow word
  1個目は 5秒後に hello worldを表示させる
  2個目は10秒後に hello worldを表示させる
  ...
  10個目は50秒後にhello worldを表示させる

違っていたらご指摘をお願いします

QPerlのC++の簡単なサンプルのモジュールを作成したいのですが

PerlのC++の簡単なサンプルのモジュールを作成したいのですが
以下で困っております。

【エラー内容】

nmake後のエラー


Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

cl -c -nologo -O1 -MD -Zi -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX -O1 -MD -Zi -DNDEBUG -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" -IC:\usr\lib\CORE Car.c
Car.c
car.hpp(4) : error C2061: 構文エラー : 識別子 'Car' がシンタックスエラーを起こしました。
car.hpp(4) : error C2059: 構文エラー : ';'
car.hpp(4) : error C2449: '{' を見つけました (関数のヘッダーがないかもしれません)。
car.hpp(8) : error C2059: 構文エラー : '}'
Car.c(52) : error C2065: 'XS_Car_new' : 定義されていない識別子です。
Car.c(52) : warning C4047: 'function' : 間接参照のレベルが 'void (__cdecl *)(struct interpreter *,struct cv *)' と 'int ' で異なっています。
Car.c(52) : warning C4024: 'Perl_newXS' : の型が 3 の仮引数および実引数と異なります。
NMAKE : fatal error U1077: 'cl' : リターン コード '0x2'
Stop.

PerlのC++の簡単なサンプルのモジュールを作成したいのですが
以下で困っております。

【エラー内容】

nmake後のエラー


Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

cl -c -nologo -O1 -MD -Zi -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX -O1 -MD -Zi -DNDEBUG -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" -IC:\u...続きを読む

Aベストアンサー

Perlで作ればいいのでは?

QPerlのフォームパラメータの受け取り方、モジュールのコンパイルなど

PHPではフォームのパラメータは $kosuu = $_POST['kosuu']で取得できますが、Perlでは一般的にどのように受け取るのでしょうか?
PHPは理解しやすい(方法が1つ)ですがPerlはいろいろとできそうで、誰が見てもわかるor信頼性が高い記述方法が知りたいです。

また、WindowsのActivePerlを使っているのですが、CPANでモジュール?をインストールする場合は、VisualC++6のインストールが必須でしょうか?
BoarlandC++5.5無料をインストールして、モジュールのコンパイルをしたいのですが可能でしょうか?

Aベストアンサー

CGIとして使うときのパラメータの取得は、CGIモジュールを使って
その paramメソッドを使うのがいわゆるPerl Hackerといわれる
人たちでは主流のように感じます。

モジュールのインストールですが、すべてがPerlで書かれていない、
Cで書かれた部分のモジュールであるなら VC++ 6が必要です
(別のバージョンでも大丈夫な場合もありますが)。
Borland Cを使うくらいなら VC++のExpress editionを使った方が
まだ正しく動く可能性が高いと思います。

あと、CPANモジュールではなく、ppmモジュールを使えば
コンパイル済みのパッケージを用意してあるものを
インストールできることが多いです。

ppmを使うとき、デフォルトのActiveStateへのリポジトリの参照を
無効にするか優先順位を下げておいて、
http://ppm.tcool.org/archives/package.xml
を上位に登録しておくとシアワセになれるかもしれません。

ppmの使い方は検索するなり、perldoc ppm でどうぞ、

CGIとして使うときのパラメータの取得は、CGIモジュールを使って
その paramメソッドを使うのがいわゆるPerl Hackerといわれる
人たちでは主流のように感じます。

モジュールのインストールですが、すべてがPerlで書かれていない、
Cで書かれた部分のモジュールであるなら VC++ 6が必要です
(別のバージョンでも大丈夫な場合もありますが)。
Borland Cを使うくらいなら VC++のExpress editionを使った方が
まだ正しく動く可能性が高いと思います。

あと、CPANモジュールではなく、ppmモジュールを使え...続きを読む

QPerl LWPでのIPv6エラー

Perl LWPでのIPv6接続がエラーでつながらず、原因がわかりません。

記載しているソースで、Localhostに接続すると、LWP::UserAgentはエラーとなりますが
HTTP::Tiny、wgetコマンドは、問題ありません。(IPv4の場合は、LWPも問題ありません)。

どなたか、よい解決へのお知恵をよろしくお願いします。

perl 5.16.1
CentOS 5.9

------ソース-----
#!/usr/bin/perl
use strict;
use Net::INET6Glue;

my $uri = 'http://[::1]';

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->get($uri);
print $res->content,"\n";

print "********************************\n";

use HTTP::Tiny;
my $http = HTTP::Tiny->new;
my $response = $http->get($uri);
print $response->{content}, "\n";


-----結果-----
Can't connect to ::1:80 (接続を拒否されました)

LWP::Protocol::http::Socket: connect: 接続を拒否されました at /usr/local/perl-5.16.2/lib/site_perl/5.16.2/LWP/Protocol/http.pm line 51.

********************************
<html><body><h1>It works!</h1></body></html>


---環境---
This is perl 5, version 16, subversion 2 (v5.16.2) built for x86_64-linux

cpan[1]> i /INET6/
Reading '/root/.cpan/Metadata'
Database was generated on Fri, 01 Mar 2013 03:17:03 GMT
Distribution SHLOMIF/IO-Socket-INET6-2.69.tar.gz
Distribution SULLR/Net-INET6Glue-0.5.tar.gz
Module = IO::Socket::INET6 (SHLOMIF/IO-Socket-INET6-2.69.tar.gz)
Module = Net::INET6Glue (SULLR/Net-INET6Glue-0.5.tar.gz)
Module = Net::INET6Glue::FTP (SULLR/Net-INET6Glue-0.5.tar.gz)
Module = Net::INET6Glue::INET_is_INET6 (SULLR/Net-INET6Glue-0.5.tar.gz)
Module < Net::Patricia::AF_INET6 (PHILIPP/Net-Patricia-1.19.tar.gz)
Module < Net::Whois::Object::Inet6Num (AASSAD/Net-Whois-RIPE-2.002.tar.gz)
8 items found

Perl LWPでのIPv6接続がエラーでつながらず、原因がわかりません。

記載しているソースで、Localhostに接続すると、LWP::UserAgentはエラーとなりますが
HTTP::Tiny、wgetコマンドは、問題ありません。(IPv4の場合は、LWPも問題ありません)。

どなたか、よい解決へのお知恵をよろしくお願いします。

perl 5.16.1
CentOS 5.9

------ソース-----
#!/usr/bin/perl
use strict;
use Net::INET6Glue;

my $uri = 'http://[::1]';

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->get($uri);...続きを読む

Aベストアンサー

モジュールの中の処理を追っていくとNet::HTTP::Methodsの中の
http_configureというルーチンが、おかしなことをしているようです。

http_configureの前
$VAR1 = {
'Proto' => 'tcp',
'PeerAddr' => '::1',
'SendTE' => 1,
'PeerPort' => 80,
'LocalAddr' => undef,
'KeepAlive' => ''
};

http_configureの後
$VAR1 = {
'Proto' => 'tcp',
'PeerAddr' => '::1',
'PeerPort' => 1,
'LocalAddr' => undef
};

となって、ポート番号が1にかわっています。IPv6のアドレス記法に使われるコロン(:)と
URLでポート番号を指定するときの記法(localhost:8080など)の
コロン(:)を区別していないようです。

Linuxを使っているのでしたら、/etc/hostsに
::1 ip6-localhost ip6-loopback
などが登録済みと思うので、http://ip6-localhostで試すといいかもしれません。

モジュールの中の処理を追っていくとNet::HTTP::Methodsの中の
http_configureというルーチンが、おかしなことをしているようです。

http_configureの前
$VAR1 = {
'Proto' => 'tcp',
'PeerAddr' => '::1',
'SendTE' => 1,
'PeerPort' => 80,
'LocalAddr' => undef,
'KeepAlive' => ''
};

http_configureの後
$VAR1 = {
'Proto' => 'tcp',
'PeerAddr' => '::1',
'PeerPort' => 1,
'LocalAddr' =>...続きを読む

Quse LWP::Simple get で、https:// は取得できない?

use LWP::Simple と get を使って、英訳ページなどを作るという記事を見ました。
私も似たような翻訳もどきを作って楽しんでいるのですが、
http:// は取得できても、https:// は取得できない
みたいなのです。
https:// は、いったいなんなのでしょうか?
これうまく取り込む方法はないでしょうか。

Aベストアンサー

httpsはSSLの技術を使用してブラウザとWebサーバが通信をする暗号化プロトコルです。
SSLについては
http://www.fc-lab.com/network/system/security/ssl.html
を参考に紹介いたします。
「ssl 公開鍵 仕組み」等で検索するとよいかもしれません。

次に、LWP::Simbple.pm をつかって https にアクセスする方法です。
openssl と Crypt::SSLeay.pm をインストールしてやれば、プログラムへの変更なしに自動的に http:// も https:// も LWP::Simple::get で取得できます。

参考URL:http://www.fc-lab.com/network/system/security/ssl.html


おすすめ情報