Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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+fGDU0431nobodyさん
2005/04/07(木) 02:29:36ID:???0432nobodyさん
2005/04/07(木) 02:30:05ID:???特殊変数 $, と $" を勘違いしている。
my %hash = (foo => 2, bar => 3, baz => 4);
{ local $, = '+'; print 1, sort(values %hash), 5, "\n" }
{ local $" = '+'; print "1+@{[ sort values %hash ]}+5" }
0433428
2005/04/07(木) 02:35:39ID:???思いっきり勘違いしてました。。$"ですね。ご指摘ありがとうございます。>>429さんすみません。
>>431
なるほどー。全然思いつきませんでした。。それでいきたいと思います。ありがとうございました。
0434nobodyさん
2005/04/07(木) 12:06:08ID:2qkaRxVD先輩に怒鳴られました。何が悪かったのでしょう?
0435nobodyさん
2005/04/07(木) 12:12:29ID:dowco4wM「スカタン」と聞き間違えたんじゃないかな。
0436nobodyさん
2005/04/07(木) 12:14:18ID:???スカラーコンテスト -> スカラーコンテキスト
0437nobodyさん
2005/04/07(木) 12:27:59ID:2qkaRxVDなるほど!って、それはないですよ。うち関西じゃなし
>>436
あ、スカラーコンテキストです。へへ
0438nobodyさん
2005/04/07(木) 13:32:24ID:???共通の認識の無い略語を使われると意味が通じないということでしょう。
スカコンは一般的に使われている略語とは思えない
0439nobodyさん
2005/04/08(金) 00:23:01ID:???hoge.pl
lib
└----hoge.pm
hoge
└----test.pm
という構造で、test.pmのsub{ }の中から
hoge.plの中のグローバル変数の値を取得するにはどういうコードを書けばいいんでしょうか。
よろしくお願いします。
0440nobodyさん
2005/04/08(金) 00:35:08ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html
但し普通そんな行儀の悪い受け渡し方はしない。
0441nobodyさん
2005/04/08(金) 00:47:06ID:???ありがとうございます。
ついでにもう一つ行儀の悪いことかと思うのですが、
同じくtest.pmの中にあるサブメソッドから、
hoge.plの中で定義してあるサブメソッドを呼び出すにはどうしたらよいのでしょうか。
実はお教え頂いたページはgoogle検索で見ていたのですが、
自分ではまだ不勉強な部分が多くほとんど要領を得ませんでした、無念。
よろしければ、簡単なコードを示して頂ければ嬉しいです。
横着を言ってすいません。
0442nobodyさん
2005/04/08(金) 02:47:20ID:???やっとわかりました。
しかし、ネストされたモジュールの中のサブルーティンからメインに置いてある
サブルーティンを呼ぶ方法が未だにわかりません。
どなたかよろしくお願いします。
0445nobodyさん
2005/04/08(金) 12:10:49ID:???スカラー変数のプレフィクスは $
配列のプレフィクスは @
ハッシュのプレフィクスは %
サブルーチンのプレフィクスは &
型グロブのプレフィクスは *
print map "$_ => [$main::{$_}]\n", sort keys %main::;
0446nobodyさん
2005/04/08(金) 15:30:24ID:???できました!ありがとうございます
0447nobodyさん
2005/04/08(金) 20:51:39ID:RsQcEeNJ読みましたが、同じくタブ文字(\t)も含まれていないのでしょうか?
日本語のデータをeuc-jpで保存していて、そのフィールドの区切りを
タブ文字にしているので、これで絶対に大丈夫なのか、不安に
思いました。
0448nobodyさん
2005/04/08(金) 20:55:43ID:j5c3p0G/最近のperlではinet_aton()の仕様が変わったのでしょうか?
nslookupが複数のIPアドレスを返すホストを引数に与えると
inet_aton()が失敗します。最初のIPアドレスを返すのが仕様だと
思ったのですが。バージョンは以下のとおりです。
perl --version
This is perl, v5.8.2 built for sun4-solaris
0449nobodyさん
2005/04/08(金) 21:02:13ID:???http://www.din.or.jp/~ohzaki/perl.htm#Character
0450nobodyさん
2005/04/08(金) 22:02:13ID:???何に対して「最近」か知らんけど、OS 側のライブラリにも依るんじゃないの。
http://search.cpan.org/src/NWCLARK/perl-5.8.2/ext/Socket/Socket.xs
http://search.cpan.org/src/NWCLARK/perl-5.8.6/ext/Socket/Socket.xs
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlhist.pod
0451448
2005/04/08(金) 22:56:06ID:???ありがとうございます。
OSのライブラリgethostbyname()に依存している可能性が
あるわけですね。
CGIを書いているのですが、CGIに関しては質問を受け付けないと
言っているISPなので困ったなあ。
0452nobodyさん
2005/04/08(金) 23:08:49ID:OhDnlIyMopendir(DIR, "./$folder");
@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
これってopendir(DIR, "ls-t./$folder");
で済むと言われたのですが
UNIXでのOS環境でのことですよね?
コーディングでOSのコマンドを利用するようなやり方は
あまりよく知らないもので。
0453nobodyさん
2005/04/08(金) 23:31:30ID:???0454nobodyさん
2005/04/08(金) 23:44:12ID:OhDnlIyMなんか疑問に感じた。
ディレクトリのなかのファイルを新しい日付順に降順で並び換える
プログラムなのですが、、、
そもそもlsって表示コマンドだし、-tオプションは昇順表示だし。
OSのコマンドを使うにしても並び換えのコマンドだと
思うのだが。
よくわからんが負荷が高いからこのほうがいい、と言われた。
0455nobodyさん
2005/04/08(金) 23:54:12ID:OhDnlIyMじゃなかった。
opendir(DIR, "ls-t./$folder|");
だった。
そもそもこの場合の|の意味がわからんのですが、、、
0456nobodyさん
2005/04/09(土) 00:11:56ID:gYWC+2uysort -rだと思うのだが、、、
0457nobodyさん
2005/04/09(土) 00:34:17ID:gYWC+2uyそれなら並び換えはいらんのだが
しかしlsコマンドでいいのかわからん。
0458nobodyさん
2005/04/09(土) 00:52:37ID:???ls -t の出力をパイプで自分に流し込む話
0459nobodyさん
2005/04/09(土) 00:58:37ID:gYWC+2uy加工させるスクリプトに持っていくのかな。
しかし初心者ながらこういうやり方まで頭がいかんかった。
つまりファイル操作ならOSのコマンドで代用すればいいじゃない。
ということが。
0460nobodyさん
2005/04/09(土) 01:07:49ID:gYWC+2uy@dir = readdir(DIR);
closedir(DIR);
for($i=0;$dir[$i];$i++){
#$ts = ($dir[$i] =~ /^\d+\.html/) ?
(stat("./$folder/$dir[$i]"))[9] - 800000000 : ' ';
$dir[$i] = "$ts,$dir[$i]";
}
@dir = sort {$b cmp $a;} @dir;
for($i=$next - 21;$i < $next+100-21 && $dir[$i];$i++){
($ts, $file) = split(/,/, $dir[$i]);
last if $ts eq ' ';
open(R, "./$folder/$file");
$_ = <R>;
close(R);
/<b>([^\<]*)<\/b>/;
$j = $i+1;
print W " $j<a href=\"$file\">$1</a>\n";
}
こういう構造でのスクリプトは古いのだろうか。
open(DIR, "ls -t ./$folder |") で
やればあきらかに負荷軽減になるのだろうか。
0461nobodyさん
2005/04/09(土) 01:13:06ID:???0462nobodyさん
2005/04/09(土) 01:34:53ID:gYWC+2uyopen(DIR, "dir -d ./$folder|");
ということになるのだろうか?
そもそもソースにOSコマンド書いたからといって
OSがどう連動してくれてるか
わからないのだが。
0463nobodyさん
2005/04/09(土) 01:53:22ID:gYWC+2uy0464nobodyさん
2005/04/09(土) 02:38:31ID:???OSコマンドって言ってる時点で(ry
まずは自分が何を知りたいのか整理しろ。
そして質問は分かりやすく謙虚に書け。
0465nobodyさん
2005/04/09(土) 02:45:27ID:gYWC+2uy謙虚もクソもあるか。
てめえの言い方も横柄だろうが。
わからねえならそれでいいんだよ。
クソが。
0466nobodyさん
2005/04/09(土) 02:56:29ID:???0467nobodyさん
2005/04/09(土) 03:02:18ID:???パイプを open するとプロセスが別に生成されて
場合によっては shell まで呼び出されたりして
かえって負荷が高くなる場合も多いと思う
まあ結局はケースバイケースだが
0468nobodyさん
2005/04/09(土) 03:35:06ID:???ちょこちょこI/O負荷をかけるよりは。
0469nobodyさん
2005/04/09(土) 06:49:56ID:???fork自体のコストが高いから、CGIには向かないかも。
windowsなら、これ入れておけばそこそこunix環境に近くなる。
http://unxutils.sourceforge.net/
0470nobodyさん
2005/04/09(土) 11:44:26ID:???どうすればいいんですか?
0471nobodyさん
2005/04/09(土) 12:16:31ID:???0472nobodyさん
2005/04/09(土) 12:46:24ID:???0473nobodyさん
2005/04/09(土) 13:04:45ID:???感謝!助かりました!
0476nobodyさん
2005/04/09(土) 13:38:10ID:???0477nobodyさん
2005/04/09(土) 13:41:18ID:???0478nobodyさん
2005/04/09(土) 14:26:27ID:???0479nobodyさん
2005/04/09(土) 14:39:34ID:???■ このスレッドは過去ログ倉庫に格納されています