【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0558nobodyさん
02/10/01 14:58ID:???>>481
殊にネットワーク関係は中途半端なことしてると
よそ様に迷惑かけまくるから、
基礎をみっちり勉強してからトライしてね。
0561nobodyさん
02/10/01 15:41ID:???まったくそうですねすいません、
ところでinet_atonにはホスト名をいれるより
直接IPを入れたほうが処理は早いですよね?
0562nobodyさん
02/10/01 16:18ID:???ファイルの受け取りにcgi-lib.plというのを使ってるみたいなんですけど
それを使わないと無理なんでしょうか。
あと、use CGIも無しで。
use CGIを使った場合って
read( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );
で受け取るのが無効になってしまいますか?
hiddenの受け取りにread( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );を使って
ファイルの受け取りに$file = $query->parama('file);
をやったらhiddenが受け取れませんでしたので・・・。
0564552
02/10/01 17:01ID:???これが使えそうな気がします。
# Webブラウザスクリプト
# browser.pl
# モジュールの仕様宣言
use IO::Socket;
# URLを入力
print "URLを指定してください。:";
$url = <STDIN>;
# URLをホスト名とファイルパスに分割
chomp($url);
if($url =~ /http:\/\/([^\/]+)(\/.*)/){
$host = $1;
$file = $2;
}else{
die "そのURLには対応していません。\n";
}
0565552
02/10/01 17:02ID:???# ソケットオブジェクト作成
$client_socket = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => 'http',
Proto => 'tcp',
Timeout => '5');
unless($client_socket){
print "Socket Error:$!\n";
}
# 入力をサーバーに送信
print "$host $file" . "\n";
print $client_socket "GET $file HTTP/1.0\n\n";
open (DATA, ">>data.html") || &error("開けません。");
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
close(DATA);
# ソケットを閉じる
$client_socket->close();
これが全文です。ですが動きますがhtmlソースが出てきません。どこか間違っていますか。
0566552
02/10/01 17:03ID:???コマンド プロンプトから試しました。
0567nobodyさん
02/10/01 17:03ID:???0568nobodyさん
02/10/01 17:21ID:???LWPは使えんの?IO::Socketでも別にかまわんけど。
>htmlソースが出てきません。
data.htmlに出力されているんじゃないかと思うが、
ソース見ると開けて閉じてるだけかよ。
0569552
02/10/01 19:00ID:ydYlCK0mopen (DATA, ">>data.html") || &error("開けません。");
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
close(DATA);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
# 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ)
while($receive = <$cilent_socket>){
print $receive;
}
実際はこうやって実験しました。
指定されたhtmlのソースが表示されていくはずなんですけどね・・・。
0570nobodyさん
02/10/01 22:01ID:???unless($client_socket){
print "Socket Error:$!\n";
}
$client_socket->autoflush(1); # これ追加
# 入力をサーバーに送信
...
でどうよ?
while($receive = <$cilent_socket>)
これは綴り間違い?
0571552
02/10/01 22:50ID:ydYlCK0mすごい!出来ました。
下の文がはじめに付いてくるんですがこれって自動で取ったり出来ないんでしょうか。
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Tue, 01 Oct 2002 22:34:16 GMT
Connection: Keep-Alive
Content-Length: 39683
Content-Type: text/html
Set-Cookie: inkid=n92b0EDMgACIgMEZL2zSjaAAVvoH; expires=Wed, 01-Dec-2010 00:00:00 GMT; domain=goo.ne.jp; path=/
Set-Cookie: ASPSESSIONIDGGGQQGED=MMBNNELBNKGNJBKCPGNLGLCG; path=/
Cache-control: private
あと、ローカルではうまくいったんですけど、サーバーにアップしたら、
Your script produced this error: Can't locate IO/Socket.pm in @INC (@INC contains: .) at ./aaa.cgi line 5. BEGIN failed--compilation aborted at ./aaa.cgi line 5.
という風に「use IO::Socket;」の行でエラーが出てしまいました。
0572ヽ( ゚Д゚)丿 ◆1ZwOwwBE
02/10/01 23:40ID:???もうなにからなにまで全然だめみたいだから
ちゃんと本かってある程度勉強したほうがいいよ。
まず、IO::Socketはレンタルサーバーに入ってるのはまれだろ
よくてSocket.pm
つかえても制限ありとかそんなもんだ。
0573ヽ( ゚Д゚)丿 ◆1ZwOwwBE
02/10/01 23:43ID:???こんな感じのをいれる
if(/\r\n/){
next;
}
s/\r\n//o;
0574nobodyさん
02/10/02 00:06ID:???↑のようなことを表示できるようにするCGIってありますか?
0577nobodyさん
02/10/02 01:29ID:???>>488
>っていうかこれは相手サーバに渡す物だから、
>自分の環境がWinかどうかは関係無いんじゃないんですか?
ファイルハンドルが「テキストモード」の時,"\r\n"は
Winだと, 0x0D 0x0D 0x0A に
Unix系だと 0x0D 0x0A になる
っつーことで。
0578nobodyさん
02/10/02 12:31ID:6nY1Hcfpその場合
$mon = sprintf("%02d",$mon);
と書くのと
$mon = "0$mon" if ($mon < 10);
と書くの
どっちがいいと思いますか?
何か二極端になってるような気がして、、、自分は前者です。
0581nobodyさん
02/10/02 13:01ID:???#print "HOST:$host\n";
#print "FILE:$file\n";
print $client_socket "GET $file HTTP/1.0\n\n";
これだと単純に$fileで指定されたファイルが返ってくるんですけど、
$fileがcgiだった場合、例えば掲示板とかの場合に、
掲示板内の投稿内容を入力する<input type="text" name="message">
の値もサーバーに送ることってできますか?掲示板のformのmethodはpostです。
結果的に投稿後のhtmlが返ってくるようにしたいんです。
0582nobodyさん
02/10/02 13:08ID:6nY1Hcfp($mon,$mday,$hour,$min,$sec) = (split(/,/,sprintf "%02d,%02d,%02d,%02d,%02d",$mon,$mday,$hour,$min,$sec));
0584578 , 582
02/10/02 13:40ID:6nY1Hcfpお、忘れてた。サンクス。
0585nobodyさん
02/10/02 15:15ID:JLnBuPbJ1:RS-232Cに繋がったモデムに、ATコマンドを送ってリザルトを受け取りたい
2:googleを「perl RS-232C」で調べてみた
3:そうした事例がでて来ない
perlを使って、RS-232C通信は出来ないでしょうか?
簡単なATコマンドを送って、結果を見るだけなのですが、minicomで手打ち
は面倒くさいので、自動化したいのです。
でも、googleで事例が出ないので、もしかして、perlではRS-232C制御は
出来ないのでしょうか?
もし可能なら、組み込む必要のあるpmや、スクリプト例など教えてください。
環境は、RedHat Linux 7.3
perlのバージョンは、5.6.1です。
0586nobodyさん
02/10/02 15:27ID:???ATコマンド打つにはpppdがいるだろ
Perlだけじゃむりだ
0587585
02/10/02 15:39ID:JLnBuPbJpppdというのと組み合わせるんですか?
今は、minicom -s から手打ちして、結果を見ています。
出来たら、自動でAT打って、返ってきた結果でif分岐して、おかしいときだけ
メールとかで知らせるという風にしたいんですよね。
まず、pppdというのをgoogleしに行って来ます。
何か過不足あったら、教えてください。
0589578 , 582
02/10/02 17:30ID:6nY1Hcfp\$scalar とか \%hash とか、リファレンス参照ですよね
時々見る *scalar とかは一体何者なんでしょうか
おそらくリファレンスと同じようなもんだと思うんですが
いまいち挙動がつかめません。
0590585
02/10/02 17:37ID:JLnBuPbJあ、ほんとですね。/usr/sbin/pppdでありました。
さて、これをどうperlから呼んで、任意のATコマンドを出力させるのか、
調べてみなくてわ。
ただ、googleであたったところ、pppdってどうもインターンット接続のソフト
みたいなんですけど?
0591nobodyさん
02/10/02 17:50ID:???ATコマンドも打てるんじゃ!ぼけぇ!
Linuxさわったのはじめてでperlも分らんようなら帰れ!
どうせ厨だろ。/dev とかわからんだろ
おとなしくじーーーーーーーーーーーっくりしらべてから来い!
0593585
02/10/02 18:09ID:JLnBuPbJはは、いや、Linux/perl、1年くらい使ってるんですよ(笑)
ただねぇ、ルータが最初からあって、接続はLANでって環境でインターネット
に入ったもんで、ATコマンドって、つい最近まで、使ったことも見たことも無
かったのよん。
#Windowsも「ダイヤルアップなんたら」というの、使ったことまったくない。
だから困ってるのさ。
0594nobodyさん
02/10/02 18:31ID:???おめでたい香具師だな。
0595nobodyさん
02/10/02 18:34ID:???だから初心者なんだろ(w
0596nobodyさん
02/10/02 20:11ID:???> print $client_socket "GET $file HTTP/1.0\n\n";
この行の GET を POST にすることを気付かなかったのなら、
まず Socket と HTTP について勉強しる。
>>582
$_ = sprintf '%02d', $_ for ($mon,$mday,$hour,$min,$sec);
こう書いておけば、変数が増えても
一箇所書き換えるだけで済む。
>>585
「Linux perl シリアル通信」辺りでググってみてはどうか?
>>589
* は型グロブ。黒豹本 (O'REILLY「実用 Perl プログラミング」)
の三章に、実際の使用例と共に詳しく解説されている。
0597nobodyさん
02/10/02 20:56ID:???Sheet1.csv 〜 Sheet10.csvまで10枚のファイルがあります。
ファイルのそれぞれの1〜9行目、1列目〜4列目
を個々に加算してresult_11.cvs ファイルの1〜9行目、1列目〜4列目
に和を挿入したいのですが、awkとbc とpaste を使っていますが、
perlなら一発で出来そうです。何かいいアイディアはありませぬか?
% cat sum.array.awk
BEGIN {
OFS=FS=","
}
{
for (i=1;i<=4;i++)
sum[FNR,i]+=$i
}
END {
for (r=1;r<=9;r++)
print sum[r,1]"\n"sum[r,2]"\n"sum[r,3]"\n"sum[r,4]
}
0598597
02/10/02 20:57ID:???% awk -f sum.array.awk Sheet2.csv|sed -e 's/$/+/'>ac2.dat
% paste ac1.dat ac2.dat
55+ 59+
77+ 81+
36+ 40+
66+ 70+
111+ 115+
3+ 7+
39+ 43+
77+ 81+
(略)
0599597
02/10/02 21:03ID:???perlのwhile(<FIFO>){ほにゃらら;}とかで処理できないかなー。
0600nobodyさん
02/10/02 22:29ID:???データは
4,5,44124,1324\n
45,2345,44124,1324\n
45,2345,44124,1324\n
こんな感じで
324424124\n
424148124\n
423213131\n
(適当)
↑みたいににしたいってことですか?
0601nobodyさん
02/10/02 22:55ID:77XrC79cそこで質問なんですが無料のサーバー?ソフトみたいなのは無いんでしょうか?
0602597
02/10/02 22:57ID:???1,33,55,77,99,121,143,165
2,36,66,111,222,223,147,225
3,39,77,145,345,346,151,348
4,42,88,179,468,469,155,471
5,45,99,213,591,592,159,594
6,48,110,247,714,715,163,717
みたいなファイルが10枚あって、
ココの行列ごとに和をとって11番目のファイルに出力したい、ということです。
串刺し、といったイメージでファイルを横断して加算を取るということです。
この部分だけ、excelに頼っているのですが、
他の計算が全てUnix上なので、この計算もperlなどで行いたいなと。
0603nobodyさん
02/10/02 23:09ID:???=commentout
CGIとかを動くかどうか試したいんですがまだHPスペースの承諾メールがきてなく確認できません
そこで質問なんですが無料のサーバー?ソフトみたいなのは無いんでしょうか?
=cut
次。
0604nobodyさん
02/10/03 00:07ID:???0605nobodyさん
02/10/03 00:15ID:???>$_ = sprintf '%02d', $_ for ($mon,$mday,$hour,$min,$sec);
( ´,_ゝ`) プッ ネタかよ
0606578 , 582
02/10/03 01:38ID:uOd1wswNどんな機会に使うのでしょうか??
いまいちリファレンスより速度的に早いとか
何か利点があるのでしょうか??
0607nobodyさん
02/10/03 02:17ID:???そのくらいのデータ量だったら、値を全て読み込んでから
処理しちゃっても大丈夫/楽じゃないですかね。
use constant FIRSTFILENUM => 1;
use constant LASTFILENUM => 10;
my @data; #$data[ファイル名の数字部分]->[列][行]
for (my $fileno = FIRSTFILENUM; $fileno <= LASTFILENUM ; $fileno++){
open (FILE, "Sheet$fileno\.csv") or die;
for(my $n = 0; <FILE>; $n++){
chomp;
$data[$fileno]->[$n] = [split (/,/)]
};
close (FILE) or die;
}
こんな感じで、データを一気に読み込んで、あとは適当に
ループを回して足すなり引くなりするというのはどうでしょ?
my $sum; #各ファイルの列ごとの和
for (my $col = 0;$col < 6; $col++){
for (my $fileno = 1; $fileno <= 10; $fileno++){
for(my $row = 0;$row < 8; $row++){
$sum += $data[$fileno]->[$col][$row];
}
}
print $col + 1 . ":$sum\n";
}
たとえばこんな感じで。
0608602
02/10/03 02:52ID:l9L39VMS>そのくらいのデータ量だったら、値を全て読み込んでから
よく判らないのですが、2000行400列ぐらいに集めてしまった巨大ファイルも
処理する場合、
512Mのメモリー積んでれば(OSはLinux)大丈夫でしょうか?
今までは、excelに食わせるために一旦小さいファイルに分けるなどしてましたが。
一気にできるとなるとどれくらいのファイルまでならOKなのでしょうか?
今、手元の一番大きいので、7.3Mだから大丈夫なのかな?
0609602
02/10/03 03:05ID:l9L39VMS50枚も逝かないと思うけど……。けど、こういう場合、単純計算で512Mのうち
どれくらい残しておけばいいのかな。
基本的に表立ってはあまり使わない。
普通は、ファイルハンドルを使うときと、エイリアスを作成する時くらいじゃないかな。
0611nobodyさん
02/10/03 10:16ID:HWMUanwi本 or サイト どっちでも可
0612nobodyさん
02/10/03 10:42ID:???どっちでもいいんでしょうか。時と場合で使い分けるんでしょうか。
0613nobodyさん
02/10/03 10:54ID:xHS0Gcl+シフトジスの場合に文字化けエラーに気をつければ
どっちでもいい
0614nobodyさん
02/10/03 11:16ID:Co/qm2Ti配列名の中に変数をエラーってしまいます。
#!/usr/bin/perl
$num =0;
@ary = qw(a b c d e f);
foreach (@ary) {
push (@new_ary_$num,$_);
++$num;
}
この場合、
aを@new_ary_0
bを@new_ary_1
・
・
fを@new_ary_5
に入れたいのですが、push (@new_ary_$num,$_);で
引っ掛かってしまいます。
@new_ary_${num}など、いろいろ試してみたのですが
どうにもだめでした・・。
配列名の中に変数は使えないのでしょうか?
宜しくお願いします。
0615nobodyさん
02/10/03 11:18ID:???配列名の中に変数をエラーってしまいます。
↓
配列名の中に変数を使うとエラーってしまいます。
でした。すんません
0616nobodyさん
02/10/03 11:18ID:???<form action="aaa.cgi" method="post"><input type="text" name="text" value="aiueo"></form>
-----------------
# aaa.cgi
$post_name = "text";
$post_value = $FORM{text};
print "Location: http://xxx.yyy.zzz/hoge.cgi\n\n";
---------------
こうやってhoge.cgiへ自ら用意したpostデータ(name=text value=あらかじめ用意した値)
を送り付けたいのですが可能ですか?
getの時は引数を付ければいいだけですが・・・。
0617578 , 582
02/10/03 11:21ID:v6OPXcCdご回答ありがとうございます、胸のつっかえが取れました。
0618nobodyさん
02/10/03 12:46ID:???ところで UNIX板のシェル、オークスレにまったく同じ質問があるように見えるのは気のせいですか?
いや,マルチだとは思わないんだけどね,それぞれのやり方が知りたいのかもしれないし
0619581
02/10/03 13:38ID:???こうしたらおかしくないですか?
postのデータはどうやって送ってるんですか?
0620nobodyさん
02/10/03 13:48ID:???push (@{"new_ary_$num"},$_);
>>616
いったん全部hiddenにしたform出力してjavascriptで勝手にsubmitするとかダメ?
0621nobodyさん
02/10/03 14:44ID:V3RvumoZ0622nobodyさん
02/10/03 14:53ID:???これってなにしてるんですか?ただの代入?
0623nobodyさん
02/10/03 15:59ID:l7EfCAGl@_にデータがあればその先頭のデータを代入。なければ'あ'を代入。
0624n
02/10/03 16:08ID:KXoffugq0625nobodyさん
02/10/03 16:54ID:???0626607
02/10/03 17:36ID:???あー、ファイルでかいですかー。
じゃあ一行ずつ読み込んで処理してテンポラリに書き出すのは?
たとえば、Sheet1.csvからSheet10.csvの同位置の要素を串刺しに
足していくスクリプトだとこんな感じでどうでしょ。
0627607
02/10/03 17:38ID:???use File::Copy;
copy ('Sheet1.csv', 'Result.csv');
for (my $fileno = 2; $fileno <= 10 ; $fileno++){
open (DATA, "Sheet$fileno\.csv") or die;
open (SUM, '<Result.csv' ) or die;
open (TEMP, '>TEMP') or die;
while(<DATA>){
my @data = split(/,/);
my @sum = split(/,/, <SUM>);
my @result = map {$data[$_] + $sum[$_]} 0..$#data;
print TEMP join (',', @result) . "\n";
}
close (TEMP) or die;
close (SUM) or die;
close (DATA) or die;
unlink ('Result.csv');
rename ('TEMP', 'Result.csv');
}
うーん。もっとカコイイ方法ないかなあ。
あ、それと、607の書き込みの下のコード、間違ってました。ゴメン
0628ふとした疑問
02/10/03 18:28ID:v6OPXcCd&subname();
の形ですよね?
で、普段は&は省略して書いてるんですが
&が無いと動かないサブルーチンとかも在ってチンプンカンプンです
そもそも&はどんな場合に必須となるのでしょうか?
0629nobodyさん
02/10/03 18:54ID:bjQ5Yi4RRegisterClassExに渡すwndClassEx構造体の中で
ウィンドウプロシージャの指定はどうすればいいんでしょう?
Perlでユーザ関数(サブルーチン)を作ってそのリファレンスを渡せばいいのでしょうか?
0630nobodyさん
02/10/03 19:11ID:???○ hogehoge()
× \hogehoge
× \hogehoge()
○ \&hogehoge
0632nobodyさん
02/10/03 19:54ID:FetdaLGe省略記述って言うんだけど、実際の所省略しないほうが手っ取り早くていいぞ。
省略が通るかどうかは、他に前方宣言されているとかそうゆうのも関係ある。
ちゃんと正式に書けばどんな時も困った事にならない。
0633628
02/10/03 20:57ID:v6OPXcCdありがとうございました
自分には省略せずに書くのが見やすいし迷わなくていいかも。
0634nobodyさん
02/10/03 21:10ID:???0635nobodyさん
02/10/03 21:31ID:Wit0Sk8Mprint TXT "\n";
としただけなのに
TXTファイルの改行コードがCRCFになっています。なぜ?
0638nobodyさん
02/10/03 21:50ID:???0639nobodyさん
02/10/03 21:51ID:???0640nobodyさん
02/10/03 21:52ID:???0642nobodyさん
02/10/03 21:54ID:???0644nobodyさん
02/10/03 21:58ID:???0645nobodyさん
02/10/03 21:58ID:???LF(らいん・ふぃーど)
0647nobodyさん
02/10/03 22:34ID:G7kyuSYC本 or サイト どっちでも可
0648nobodyさん
02/10/03 22:44ID:???0651nobodyさん
02/10/04 00:00ID:???感じの言語だね。
0652nobodyさん
02/10/04 00:09ID:???0653nobodyさん
02/10/04 01:36ID:???for($i = 0; $i < 200000; $i++) {
$array1[$i] = 1;
}
#2
$#array2 = 199999;
for($i = 0; $i < 200000; $i++) {
$array2[$i] = 1;
}
先に領域の確保をしておく#2の方が速いと思ったら#1の方が速くなった。なぜ?
http://www.need4xxx.net/asian/hamedori/data/099/dir/index.html
おんなじのコピーしてつくろうとしたけど不可能
0656nobodyさん
02/10/04 08:04ID:iu1Ymefg心ある人は、rubyスレにお礼参りしてください。
■ このスレッドは過去ログ倉庫に格納されています