Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0331nobodyさん
皇紀2665/04/01(金) 14:44:13ID:XdlrhN9n0333328
皇紀2665/04/01(金) 15:34:10ID:???途中で書き込んだ為、誤って2スレ分になってしまいました。
語尾によって気分を害されたのであれば申し訳御座いません。
また御機会があれば宜しくお願い致します。
0336nobodyさん
皇紀2665/04/01(金) 18:00:41ID:???$_ = $hoge; # ←する理由がわからん
(ふつう $_ に意識的に代入するかなぁ…?)
$count ++ while ($hoge =~ m/-/g);
とかも可能
0337nobodyさん
皇紀2665/04/01(金) 19:13:27ID:???おそらく if (($hoge =~ s/-/-/g) > 10) と書けるとは知らなかったと思われ。
0338326
皇紀2665/04/01(金) 21:21:39ID:???うお、マジすか。
DBIが似たような仕組みらしいので、ちょいと中をのぞいてみても、
どのへんでこの問題を解決しているのかサッパリです。
ソースのどの辺りで解決しているのかおわかりの方はいませんか?
0339nobodyさん
皇紀2665/04/01(金) 22:48:38ID:ybs/IKbSDBIが読み込むドライバのことを言っているのかな。
どうせuseかrequireかdoを使ってるんだろうと
あたりをつけてサーチかませばDBI.pmのサブルーチン
install_driverの中でreqireしてごにょごにょしてる
ところはすぐ見つかると思われる。
ただドライバはDBI::DBDに説明されているような構成
になってることを要求されていて一般的なモジュール
とはちといえないから、参考になるかどうかはびみょー。
0340328
皇紀2665/04/01(金) 22:53:02ID:???ありがとです。度忘れしてました。
tr/-//採用させていただきます。
use Benchmark;
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと-なにぬねの-はひふへほ";
timethese(100000, {
sample1 => sub { if(($hoge =~ tr/-//) > 10){} },
sample2 => sub { if(($hoge =~ s/-/-/g) > 10){} },
});
Benchmark: timing 100000 iterations of sample1, sample2...
sample1: 0 wallclock secs ( 0.05 usr + 0.00 sys = 0.05 CPU) @ 2127659.57/s (n=100000)
sample2: 0 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @ 456621.00/s (n=100000)
0341nobodyさん
皇紀2665/04/02(土) 00:17:03ID:m1Urw5SAhttp://ex9.2ch.net/test/read.cgi/soccer/1112223516/
瓦斯スレ突破ゲーム
瓦斯サポの突破力をみんなで身につけよう!!
※瓦斯スレにメール欄「小鹿」本文「お疲れ様でーす」と書き込む
※5分間書き込みがなかったら「突破成功」と再書き込みで成立
※なんらしかレスがあったら失敗
※「フロント」か「朝日」の書き込みがあったら
シーチケ取り上げられるだけで済みます。
0342326
皇紀2665/04/02(土) 02:28:50ID:???仰せの通り、該当部を覗いてみると、
requireでドライバを読み込んで、
読み込まれたドライバはDynaloaderをuseして、
bootstrapで自分自身をロードしているらしい
……具体的にはワケワカメなのですが。
詰まるところ、これが動的なインポートというやつなのでしょうか?
まんまパクってやれば、いちいち「読み込まれる可能性のある(以下略」を書かなくても良いのかなぁ。
0343nobodyさん
2005/04/02(土) 13:44:50ID:BYWwUZK5環境変数の取得の仕方は分かります。
プロキシかどうかを判定すにはどうすれば良いのでしょうか?
0344nobodyさん
2005/04/02(土) 14:12:01ID:???0345nobodyさん
2005/04/02(土) 14:25:00ID:BYWwUZK5個人的には、できるだけ強力な制限にしたいのですが、
面倒くさいようでしたら、さわりだけでも教えて頂けると助かります。
ぐぐったんですけど、検索の仕方悪いのかサーバがどうのこうのってのばっかりで…。
0348nobodyさん
2005/04/02(土) 14:40:29ID:BYWwUZK5つまり、プロキシ鯖は80、8080は大抵空いているものなのですか?
0349nobodyさん
2005/04/02(土) 14:46:46ID:BYWwUZK5…ルータで弾いてるはずなのに。やばいっすかね?
0350nobodyさん
2005/04/02(土) 15:58:19ID:???$host = 'www.2ch.net'; #IPとかホスト名
$port = 80; #ポート番号
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp');
if($socket){ print 'ポート空いてるお^^'; }
else{ print '空いてないお^^'; }
0352343
2005/04/02(土) 17:18:11ID:jF3LdyJOでも、初心者の僕には頭が混乱してくる話で…w
皆さんの御厚意を無駄にしないよう、ぐぐりまくって勉強します。
最後に、クレクレで申し訳ないんですが、良い勉強サイトあったら紹介して頂けますでしょうか。
皆さんのように教えられる立場になれるようがんばります。ありがとうございました。
0353nobodyさん
2005/04/02(土) 17:46:33ID:???0354343
2005/04/02(土) 19:10:20ID:jF3LdyJOところで、
sub checkProxyList
{
my $RADDR = $ENV{'REMOTE_ADDR'};
$RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
my $query_addr = "$4.$3.$2.$1.niku.2ch.net";
my $addr = join('.', unpack('C*', gethostbyname($query_addr)));
if ($addr eq '127.0.0.2')
{
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
return 0;
}
って、勝手に使って良いんですか?
0355nobodyさん
2005/04/02(土) 21:39:07ID:???私的利用なら問題ないでしょ。多分。俺は詳しくないからわからんけど。
でも俺なら
my $req = join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net";
my $res = join(".", unpack("C*", gethostbyname($req)));
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)") if ($res eq '127.0.0.2');
とか、
if(join(".", unpack("C*", gethostbyname(join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net"))) eq '127.0.0.2'){
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
みたいに書くよ!
0356nobodyさん
2005/04/03(日) 00:25:49ID:???0357nobodyさん
2005/04/03(日) 01:52:06ID:???例えばサブルーチンcodeのリファレンスを作るとき
sub { &code('a','b') }とすると見栄え的にあまりよくないと思うので、
\&code('a','b') や \{&code('a','b')} としてみたらエラーとなりました。
何かうまい方法は無いのでしょうか。例えば次の単純なプログラムを実行したら
Not a CODE referenceと表示されます。
$ref = \&hoho(1,\&huhu('a','b'));
&$ref;
sub hoho {
&{$_[1]};
}
sub huhu {
print $_[0].$_[1];
}
0358nobodyさん
2005/04/03(日) 06:33:05ID:???そろそろオブジェクト指向にシフトする頃合かも。
あえてクロージャで書いてみる。
$ref = create_hoho(1, create_huhu('a', 'b'));
$ref->();
sub create_hoho {
my ($dummy_arg, $sub_ref) = @_;
return sub { $sub_ref->(); }
}
sub create_huhu {
my @args = @_;
return sub { print $args[0].$args[1]; }
}
0360nobodyさん
2005/04/03(日) 10:02:18ID:???# 処理
# のようなのは不可能なのですか?
# この中でディレクトリの内容を $_ に読み込んで処理したいのですが、
# 直前に処理されていた $_ の値が入ってしまいます。
}
よろしくお願いします。
0361nobodyさん
2005/04/03(日) 10:54:05ID:???}
0362nobodyさん
2005/04/03(日) 11:17:18ID:???}
0363343
2005/04/03(日) 12:13:17ID:2xmdAJbj豚クスです
0364360
2005/04/03(日) 17:40:14ID:???while(<FH>){
}
ならできるのにどうしてですか?
0365nobodyさん
2005/04/03(日) 19:23:25ID:???掲示板(2chではないです)に書き込みたいんですが、
何か参考になるサイトなどありましたらお教え願えないでしょうか。
該当掲示板のアドレスにパラメーターくっつけて送信したらいいだけってのはわかるんですが、
そこに至るまでの過程がわからなくて…。
何か良いサンプルプログラムとかありましたら何とぞよろしくお願いします。
0366nobodyさん
2005/04/03(日) 19:33:25ID:???while(<FH>) のときだけ特別にそう動くようになってるんだよ。
ちゃんとした本を読むのだ。書いてあるから。
0368nobodyさん
2005/04/03(日) 21:57:56ID:???http://homepage3.nifty.com/hippo2000/perltips/lwpcook.html#POST
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616
0369nobodyさん
2005/04/04(月) 17:27:56ID:soRFZIJA0370nobodyさん
2005/04/04(月) 20:50:32ID:???0371nobodyさん
2005/04/05(火) 13:02:19ID:ZNntFGGUフォーム内容A=フォーム内容B
でなければエラー
という簡単な方法があれば教えて頂けないでしょうか?
0372nobodyさん
2005/04/05(火) 13:37:44ID:???0373nobodyさん
2005/04/05(火) 13:52:34ID:???HTMLで擬似縮小するのではなく本当に画像を指定サイズに縮小する方法はありませんか
0374nobodyさん
2005/04/05(火) 13:58:23ID:???0376nobodyさん
2005/04/05(火) 14:13:05ID:CfOSbO/O育成?
0378nobodyさん
2005/04/05(火) 15:19:12ID:???出来ました。
ありがとうございました。
0381nobodyさん
2005/04/05(火) 16:21:48ID:ZNntFGGUPerlのフォームの入力確認の部分で
フォーム内容A=フォーム内容B
でなければエラー
という簡単な記述があれば教えて頂けないでしょうか?
0382nobodyさん
2005/04/05(火) 16:26:07ID:???0383nobodyさん
2005/04/05(火) 16:37:20ID:???%FORMにクエリーが入ってるとして
if($FORM{'formA'} ne $FORM{'formB'}){&error(エラールーチンとか);}
初歩的にも度が過ぎる・・・
0384nobodyさん
2005/04/05(火) 18:08:15ID:ZNntFGGUやっぱりうまくいきません。
フォーム1の名前:password1 タイプ:password
フォーム2の名前:password2 タイプ:password
if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); }
他に何か加えないといけないでしょうか?
問題点があったら、よろしくお願いします。
0385nobodyさん
2005/04/05(火) 18:14:00ID:???0386nobodyさん
2005/04/05(火) 18:17:26ID:ZNntFGGUよろしくお願いします。
0388nobodyさん
2005/04/05(火) 18:27:50ID:ZNntFGGUどこがわるいんでしょうか?
0389nobodyさん
2005/04/05(火) 18:31:59ID:ZNntFGGUクエリーを入れる→7件
my $q; #クエリーを入れる
my $method; #メソッドを入れる
↑はクエリーですか?
0391nobodyさん
2005/04/05(火) 18:37:46ID:ZNntFGGUフォーム1の名前:password1 タイプ:password
フォーム2の名前:password2 タイプ:password
if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); }
でやっても、上の入力は無視されて飛ばされてるみたいで、
一緒でなくてもそのまま送信されてしまいます。上級者の方、よろしくお願いします。
0392nobodyさん
2005/04/05(火) 18:39:32ID:ZNntFGGU要するにどこをどのように直せばよろしいのでしょうか?
0393nobodyさん
2005/04/05(火) 19:07:40ID:???>このように直せば動く、このように付け加えれば動く、
>という指摘がうれしいのですが・・・。
>初心者ではなく言語がわからない人です。
こいつWeb制作板でこんなこと書いとる
0394nobodyさん
2005/04/05(火) 19:28:53ID:ZNntFGGU$b=newpass2;
if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); }
if ($a==$b eq '') { &error('パスワードエラーです。',''); }
このようにifがいろいろ並んでいるのですが、
それに1行加えてみましたが、見事にエラーになりました。
よろしくお願いします。
0395nobodyさん
2005/04/05(火) 19:33:04ID:???0396nobodyさん
2005/04/05(火) 19:59:42ID:ZNntFGGU$b="passward2";
if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); }
if ($a ne $b) { &error('パスワードエラーです。',''); }
にしたら、「パスワードエラー」が表示されるようになりました。
しかし、A=BでもA=Bでなくても、エラーになってしまいます。
「パスワードエラー」までいくようになったので、あとはAとBの置き換えの問題だと思うのですが、
この記述は上の方に書いたのですが、フォーム上の
name="passward1"
を
$a="passward1"
と置き換えていいのでしょうか?
0397nobodyさん
2005/04/05(火) 20:25:29ID:???どうでもいいんだけどな。
0398nobodyさん
2005/04/05(火) 20:32:11ID:???sub get_form {
my %form;
seek(STDIN,0,0);
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach(split(/&/)){
my($name, $value) = split(/=/);
$value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg;
$form{$name} = $value;
}
return %form;
}
0399nobodyさん
2005/04/05(火) 20:46:00ID:???0400nobodyさん
2005/04/05(火) 20:57:55ID:???0401nobodyさん
2005/04/05(火) 21:22:59ID:???> CGIフォームをデコードするには?
> 標準のモジュール、多分CGI.pmを使うとよいでしょう。あなたが手作業で行うことは多分ありません!
使い方はこの辺りとか。
ttp://www.futomi.com/lecture/form/cgi-pm.html
0402nobodyさん
2005/04/05(火) 21:57:40ID:ZNntFGGUmy %form;
seek(STDIN,0,0);
read(STDIN,$_,$ENV{'CONTENT_LENGTH'});
foreach(split(/&/)){
my($name, $value) = split(/=/);
$value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg;
$form{$name} = $value;
}
return %form;
}
をデコード処理というところに貼ってみましたが、だめでした。
いろいろありがとうございました。
0403nobodyさん
2005/04/05(火) 22:31:15ID:???http://bird.dip.jp/computing/zive.html
ここを参考にしてみたんですがうまくアップロード出来ません。一応アクセスは出来てるようですが…。
もしかしてperlでアップロードする時は該当ファイルのパスが変わるのかなと思ったり。
以下に「全ソース」を貼らせてもらいます…。
アップロードしたいファイルはC:\Perl\test.txtの位置、このスクリプトを置いてる位置はC:\(直下)にあります。
どなたかアドバイスよろしくお願いします…。
# アップロード用
use constant URI => 'http://hoge.net';
use strict;
use LWP::UserAgent;
# POST parameters
my @param = ('hoge=1',
'MAX_FILE_SIZE=500000',
'uploadfile=C:\Perl\test.txt');
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST => URI);
$req->content_type('application/x-www-form-urlencoded');
$req->content(join('&', @param));
my $res = $ua->request($req);
open(OUT, ">> ./hoge.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;
結果はアップロード拒否用のページのソースが出力…。
0404nobodyさん
2005/04/05(火) 23:10:32ID:???http://hoge.net はアップローダじゃないようだが?
0405403
2005/04/05(火) 23:20:45ID:???一応、http://hoge.net/index.phpにしてみましたが駄目でした…。
0406nobodyさん
2005/04/05(火) 23:31:49ID:???http://hoge.net/index.php も存在しないようだが?
0407nobodyさん
2005/04/06(水) 07:29:51ID:???ファイルアップの場合のcontent-typeは普通multipart/formdata
CGI側でチェックしてないことが多いのでフォームパースはやってくれるかもしれないがPOSTの内容はmultipart/formdataの仕様に合わせないとだめ。
0408nobodyさん
2005/04/06(水) 08:36:24ID:???詳細はrfc2388
0409nobodyさん
2005/04/06(水) 18:15:00ID:cBYix7o3POST以外のデータ受け取りを拒否する方法ってありますか?
0410nobodyさん
2005/04/06(水) 18:26:17ID:???0411nobodyさん
2005/04/06(水) 18:54:05ID:cBYix7o30412nobodyさん
2005/04/06(水) 18:59:03ID:0ohpKdgApostgresql8.0
windowsXP
perl5.008
DBD::PgPP
の環境にて、perlからpostgresにデータインサートをおこなっているのですが、
DBIのトランザクションがなかなか理解できません。
使いかた、文法間違っていないかご教授お願いします。
$dbh= DBI->connect($DBname, $DBuser, $DBpass);
$dbh->{AutoCommit} = 0;
$dbh->{RaiseError} = 1;
eval {
#テーブル1にinsert
$SQL= "INSERT 〜";
$sth= $dbh->prepare($SQL);
$sth ->execute();
#テーブル2にinsert
$SQL= "INSERT 〜";
$sth= $dbh->prepare($SQL);
$sth ->execute();
$dbh->commit;
};
if ($@) {
$dbh->rollback;
}
$sth->finish();
$dbh->disconnect();
0413nobodyさん
2005/04/06(水) 21:11:07ID:cBYix7o3掲示板を作っているのですが、reverseを使わずに、
ログファイルの先頭に書き加えるにはどうしたらいいでしょうか?
なるべくリソースを使わないようにしたいです。
また、意中のレスを削除するために、
ログファイルから、その行だけを取得する方法はありますでしょうか?
よろしくお願いします。
0414nobodyさん
2005/04/06(水) 21:41:05ID:???>>408
色々と探した結果ここのページ参考にして
修正してみたんですが、どうもうまく動きません…。
一応アップロード用のphpファイルと接続出来ているようですが、
やはりフォームデータが正常に送信出来てないようです。
とりあえずアップロード用のモードでサーバーのphpが結果を出力してるので、
全てのフォームデータが送信されてないわけではないと思うんですが。
うーん。
use HTTP::Request::Common;
use strict;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->request(POST 'http://yomogiwakakusa.jog.buttobi.net/index.php',
Content_Type => 'form-data',
Content => [ upload=> '1',
MAX_FILE_SIZE => '500000',
userfile => "test.txt" #アップロード用ファイル、plスクリプトと同階層
]);
print $res->as_string;
open(OUT, ">> ./result.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;
0416nobodyさん
2005/04/06(水) 22:33:49ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
>>414
use LWP::Debug qw(+);
0417nobodyさん
2005/04/06(水) 23:15:15ID:???>>416
ありがとうございます。
アップロード用のphpの方をいじってファイル名がどういう風に送信されてるか表示させてみました。
で、同じようにこのコードで実行してみると、
my $userfile='C:\test.txt';
my $res = $ua->request(POST 'http://hoge.net/index.php',
Content_Type => 'form-data',
Content => [ upload_log => '1',
MAX_FILE_SIZE => '500000',
userfile => $userfile
]);
php側じゃ$userfileの値が「C:\\test.txt」と円マーク二つ返してきてます…。
これじゃアップロード出来ないですよね。
一応こちらのperlの方を「C:\\test.txt」と変更して実行すると、
返り値は同じ「C:\\test.txt」、
ヤケクソになって「C:\\\test.txt」と円マーク三つつけて実行すると、
「C:\\\\test.txt」と四つになって返ってきます。
perlってこんな仕様だったかな…。
すいません、そろそろ大詰めっぽいのでどなたか良きアドバイスを…。
0418nobodyさん
2005/04/06(水) 23:20:19ID:jUkFe3D60419nobodyさん
2005/04/06(水) 23:26:41ID:???0421414
2005/04/06(水) 23:45:15ID:???ああ、そんな簡単なことでよかったのか…、
ということでやってみましたが確かにファイル名はそのまま送信できましたけど、
結局アップロードは出来ず。
なぜだ…。
とりあえず>>416さんに教えてもらったコードでデバグしてみるとこんな感じでした。
LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST http://hoge.net/index.php
LWP::UserAgent::_need_proxy: Not proxied
LWP::Protocol::http::request: ()
LWP::Protocol::collect: read 860 bytes
LWP::Protocol::collect: read 1852 bytes
LWP::UserAgent::request: Simple response: OK
0422nobodyさん
2005/04/06(水) 23:49:36ID:???えと、ご存じかも知れませんがphpじゃアップロードされたファイルはこんな↓感じの形式で
サイズとかいろいろなデータを取得できるんですが、
$_FILES['userfile']['name']
$_FILES['userfile']['tmp_name']
中身がからっぽなのでとりあえず
$userfile= $_REQUEST['userfile'];
とただの変数扱い?にしてperlから送信されてくるファイル名を調べてみたんです。
0423414
2005/04/07(木) 00:14:05ID:???http://homepage3.nifty.com/hippo2000/perltips/HTTP/Request/Common.html
> これはおおむね以下のようなHTTP::Requestオブジェクトを作成します
> (バウンダリと~/.profileは違っていることでしょう):
ここがちょっと意味がわからない…。
0424nobodyさん
2005/04/07(木) 01:10:34ID:???普通、テーブル2へのinsertでエラーが発生したらrollbackさせる。
>>414
|Content-Type: multipart/form-data; boundary="6G+f"
や
| PATH=/local/perl/bin:$PATH
| export PATH
はそのとおりではないだろうという事。
0425nobodyさん
2005/04/07(木) 01:32:34ID:hZmAmpQN$, = '+'とした後、keys(%expect)をダブルクォートの中で配列として評価し展開したいんです。。
色々と試してみたのですが、結局やり方が分からなかったのでどなたか教えて頂けると嬉しいです。
0427414
2005/04/07(木) 01:42:28ID:???ああ、そういうことですか、なるほど…。
ひとつ気になった点。
普通にブラウザのフォームから「アップロードファイルの参照は空欄のままにして」submitした場合、
送信しようとしたアップロードファイルのデータをphpの側が
[userfile] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)
と出力するんですが、
ローカルのperlからデータ送信した場合なぜか
Array
(
)
と、根本的に何もかも空っぽになってしまいます。
これは何か怪しい…かな。
0428nobodyさん
2005/04/07(木) 01:43:18ID:???すいません。。返信ありがとうございます。
%expectにはいくつかのデータが入っていて、そのキーだけを取り出し+で繋げて$outに代入したいんです。
なので、
$, = '+';
my @tmp = keys(%expect);
$out = "@tmp";
とすれば出来るんですが、わざわざ@tmpを作るのが汚いので@tmpを作らずにこれが出来る方法を質問させて頂いた次第です。
0429nobodyさん
2005/04/07(木) 02:12:32ID:mpm+fGDU■ このスレッドは過去ログ倉庫に格納されています