トップページ⇒php
1001コメント343KB

【Perl】初心者コーナー Part13

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/05/30 13:06ID:R2kt1mTx
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【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あたりを見よう。
068568102/07/07 08:45ID:???
>>684さん
おはようございますっ♪
あ〜感謝!うれしいです。

0686nobodyさん02/07/07 12:56ID:xpVArwn6
「http://サーバー名/CGIスクリプト名?データ」で実行し、
データの受け渡しをするプログラムを作っているんですが、
他のURLへジャンプさせるときに、
<A HREF="http://***/CGIスクリプト名?ジャンプ先URL">ジャンプ</A>
としたいんですが、ジャンプ先URLをフルパスで出せるようにするには
どうしたらいいですか?以下がつくった内容です。
my($encoding) = @_;
my($method) = $ENV{'REQUEST_METHOD'};
if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; }
elsif ($method eq 'POST') { read(STDIN, $query,
$ENV{'CONTENT_LENGTH'}); }
local(@query) = split(/&/, $query);
foreach (@query) {
tr/+/ /;
($key, $val) = split(/=/);
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/\r\n/\n/g;
$in{$key} = $val;
}
my $req = new HTTP::Request POST => $val;
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
my $res = $ua->request($req);
if ($res->is_success) {
$myd = $res->content;
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
print $myd;
} else {
print "No!";
}

今の状態ですと、
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
をやると、
<A HREF=test.cgi?test/index.html> というような感じになって
<A HREF=test.cgi?http://www.***.co.jp/test/index.html>;
というような形になりません。
0687nobodyさん02/07/07 16:41ID:???
入力データをハッキリと明示しないと答えようがないだろ。
入力データをハッキリさせたら正規表現スレで質問すべき問題だろ。
0688nobodyさん02/07/07 20:52ID:ZrDEUCOM
> 687
686です。
<A HREF="http://www.test.co.jp/test.cgi?http://www.test.co.jp/next.html">ジャンプする</A>
正規表現スレでやればいいんですか?
それ以前のヴァカなもので、初心者スレで書き込んだんですが、
それも場違い?
答えも見つからず、困っていたのに(泣)
0689nobodyさん02/07/07 21:33ID:???
リンクを表示させるだけなら
$link= qq(<A href="CGIのURL?$ENV{'QUERY_STRING'}">XXXへのリンク</A>);
0690nobodyさん02/07/08 16:37ID:???
フォームから入力された文字の最大数を制限するとか、
半角数字以外が入力されたらエラーメッセージを返すとか

どう呼ぶのかわからないのですが、
よく使われる処理のモジュールというかライブラリーと言うのか
そんな感じのものを探すにはどうしたら良いですか?
googleしてみましたがキーワードが甘いらしく見つかりませんでした

0691nobodyさん02/07/08 16:38ID:ZsVGz1/q
age忘れました
0692nobodyさん02/07/08 16:41ID:???
文字数を制限するなら、$ENV{'CONTENT_LENGTH'}の値を見るとか。
 送られてきたデータが /[^0-9a-zA-Z}/ 以外なら die とか。
0693nobodyさん02/07/08 16:45ID:ZsVGz1/q
超即レス thank you!です。
0694nobodyさん02/07/08 17:12ID:E09xqBbE
たとえば(3,3,10,6,1)という配列があって、コレをソートすると
1 3 6 10と返ってきてしまうのを、どうにかして
1 3 3 6 10にできないものでしょうか・・・?
0695nobodyさん02/07/08 17:31ID:???
>>694

@data = (3,3,10,6,1);

@sort_data = sort
{
$a <=> $b;
} @data;
0696nobodyさん02/07/08 22:12ID:Hy1uHDxp
> 689
それだと、受け取ったURLそのまま出ちゃうんじゃないかい?
0697nobodyさん02/07/08 23:54ID:HDd0iUwW
ARGVって何?どうやって読むの?アーグブイ?
0698nobodyさん02/07/09 00:04ID:???
ARGment Value
0699nobodyさん02/07/09 00:05ID:???
argument だた。。。
0700nobodyさん02/07/09 00:06ID:???
麻酔をせずに歯を削られているような気分で、
「アァァァーグヴィ!」

じゃなかったっけ?
0701nobodyさん02/07/09 00:11ID:???
なるほど納得!
0702 02/07/09 00:21ID:???
SOCKET使って外部のCGIにPOSTしてみたいのですがなかなかうまくいきません。

FORMを取得して
$post_mes="[email protected]&wcomment=test";
って感じにして(多分ここが違う?)

# POST
print SOCKET "POST $check_host HTTP/1.1\r\n";
#HTTP_REFERERを送信
print SOCKET "REFERER: $referer \r\n";
#User-Agentを送信
print SOCKET "User-Agent: $agent \r\n";
print SOCKET "X_FORWARDED_FOR: $xfor \r\n";
print SOCKET "Accept: */* \r\n";
print SOCKET "Accept-Language: ja \r\n";
print SOCKET "Accept-Encoding: gzip \r\n";
print SOCKET "\r\n";
print SOCKET "Content-Type: application/x-www-form-urlencoded\r\n";
print SOCKET "Content-Length: $length\r\n";
print SOCKET "\r\n";

print SOCKET "$post_mes\r\n";

みたいな感じでやってみたんですが駄目でした。
なんの反応もないみたいです。

なお、いたずら目的ではありません。Perlも自分のPCで動かしてます。
0703 02/07/09 00:23ID:???
>>702
犯罪の悪寒・・・
0704nobodyさん02/07/09 00:25ID:???
>>703に禿げ同
070570202/07/09 00:27ID:???
ひょっとして外部からPOSTしては駄目なのでしょうか?
すいません。よく知らなくて・・・
0706nobodyさん02/07/09 00:31ID:???
>>702
lwp 使った方が楽だと思われ。使えない環境?
070770202/07/09 00:39ID:???
>>706
lpwってのはよくわからないです・・・
環境はWinでPerl5です。
0708.02/07/09 00:41ID:???
掲示板荒氏用のスクリプトでも参考にしなさい。
0709.02/07/09 00:42ID:???
>>707
検索ぐらい汁。
もっとも、"lpw" ではないが。
071070202/07/09 00:45ID:???
>>708
dukeとか言うのですよね。探してみます
>>709
すいません。
lpwで検索してもよくわかんないと思ったらlwpだったんですね・・
0711nobodyさん02/07/09 01:01ID:???
何の反応も無いじゃ解らん
print while(<SOCK>);

ってして、どんなレスポンス帰って来てるのか読んでみ
071270202/07/09 04:02ID:???
教えて下さった方、ヒント下さった方、ありがとうございました。
なんとかPOSTできました。
0713nobodyさん02/07/09 04:31ID:???
>>698違う

ARGV = ARGuments Variable

だろ。

Value = 値
Variable = 変数

少しは勉強しろ
0714nobodyさん02/07/09 04:50ID:???
>>713
..... argument vector
071512102/07/09 21:35ID:7t2WvFst
ココ最高でした。サンプルとかタダだし、ネタとしては使えると思います。
ちなみに僕はロリです、同士な人はいってください。
http://muke.up.to
0716nobodyさん02/07/09 22:15ID:jsAirJtA
@data=(1,2,3,11,34)の様な配列が、あった場合
0〜99の数字で(1,2,3,11,34)を含まない、配列を得るにはどうしたら良いのでしょうか?
例えば、(4、5、12)
0717nobodyさん02/07/09 22:19ID:lugOGira
GETかPOSTかメソッドを判別し、
& と = をsplitして文字コードを変換したんですが、

local(@query) = split(/&/, $query);
foreach (@query) {
tr/+/ /;
($key, $val) = split(/=/);
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/\r\n/\n/g;
$in{$key} = $val;
}

送られてくるデータの引数が複数ある場合は、このほかに
何かつけ加えなければならない?

0718nobodyさん02/07/09 22:22ID:???
local($pair,$buffer);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
local(@pairs) = split(/&/,$buffer);
foreach $pair (@pairs) {
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
0719nobodyさん02/07/09 22:25ID:???
=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg;
0720nobodyさん02/07/09 22:34ID:???
>>716答え教えるの面白くないからヒントね


@data = (1, 2, 3, 11, 34);

for ( 0..99 )
{
 foreach ( @data )
 {
  push
 }
}
0721nobodyさん02/07/09 22:38ID:???
>>716
4, 5, 12を除いてみた.

%exclude = (4 => 1, 5 => 1, 12 => 1);
@data = grep { !$exclude{$_} } 0 .. 99;
072272102/07/09 22:39ID:???
>>720
スマソ…
0723nobodyさん02/07/09 22:40ID:lugOGira
> 719
それってどういうこと?
よくわかんない…、スマソ

0724nobodyさん02/07/09 22:45ID:???
=~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
より、
=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg;
の方が早いって言いたいんじゃない?
072571602/07/09 22:51ID:???
>>720
>>721
 こんなに、すぐレスくれるなんて思っていませんでした。
有り難う御座います。

これから、考えてみます。なにせ初心者な物でチンプンカンプンです。
0726ヽ(`Д´)ノ  ウワァァン02/07/09 23:29ID:gcNlx8b2
Win2000pro上でwwwサーバーを起動するところまではできたのに
CGIファイルをエクスプローラーで見ようとすると文字化け! ヽ(`Д´)ノ  ウワァァン
レンタルサーバー上にアップしたら文字化けしないのに! ヽ(`Д´)ノ  ウワァァン
0727nobodyさん02/07/09 23:45ID:???
>>726
print "Content-type: text/html; charset=Shift_JIS\n\n"; ヽ(´∀` )ノ
0728 02/07/10 00:48ID:Q4ccJnsM
パールって、
$a = 10;
だと
$a2 で 20 になるのですか?
0729 02/07/10 00:51ID:???
>>728
するどいな。だれにおそわった?
0730 .02/07/10 01:09ID:???
ソース見てたらなんとなくそう思ったのです。

本当なの?
$a2 って変数は使えないの?
0731nobodyさん02/07/10 01:13ID:fQbDc9qZ
パスワード入力みたいのでさ
入力した文字を****と表示して
さらにクッキーにも****と記録するにはどうすればいいの?

…別に使う訳じゃないんだけど興味。
0732nobodyさん02/07/10 01:13ID:???
$a + 2 足し算
$a - 2 引き算
$a * 2 掛け算
$a / 2 割り算
0733nobodyさん02/07/10 01:15ID:???
>>731
crypt関数で暗号化してから記録
0734nobodyさん02/07/10 01:15ID:fQbDc9qZ
>>733
さんきゅ。
後は調べる
0735nobodyさん02/07/10 06:44ID:???
おもったけどさ、削除パスを暗号化する前にいったん別ファイルに記録しとけばそいつがのホームページの掲示板の管理パスとかフリーメールにログインできたりするよな
0736由々しき問題でありぞっとしない02/07/10 07:10ID:???


http://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=utf-8&as_qdr=all&q=%E4%B8%AD%E5%AD%A6%E7%94%9F++%E5%9B%BD%E8%AA%9E%E5%8A%9B+%E4%BD%8E%E4%B8%8B+%E5%95%8F%E9%A1%8C&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
0737nobodyさん02/07/10 07:43ID:???
>>728
さんは凄腕になれますね、、
0738nobodyさん02/07/10 09:20ID:???
>735
全てのパスワードを同じ物にするようなマヌケな奴相手ならな。
まぁ、マヌケが多いのは確かだが。
0739nobodyさん02/07/10 09:41ID:???
>>738
ユーザは性アフォ説で接していかないと・・・。
0740nobodyさん02/07/10 10:21ID:9iF/zPMp
数字以外が入力されたらエラーメッセージを出したいのですが
うまくいきませんでした
どうすれば良いですか?

#入力されたのが数字かどうかチェック
if($P eq /[^0-9]/){print "数字を入力してください。";}
else{

if($P == /[^0-9]/){print "数字を入力してください。";}
else{

0741nobodyさん02/07/10 10:24ID:???
正規表現使うときは、

  =~ //

だろ。
074274002/07/10 14:18ID:lBfYsgML
>>714
できましたーーー!!
ありがとうございます
0743nobodyさん02/07/10 14:23ID:???
>>742
誰に御礼を言ってるんだか。
074474002/07/10 16:33ID:???
>>741さんでした(汗
ありがとうございます
0745nobodyさん02/07/10 16:58ID:???
(≧∇≦)
0746nobodyさん02/07/10 17:04ID:???
404とかのエラーコードを吐き出させるのってどうやるのですか?
074774602/07/10 17:14ID:???
あ、分かりました。
0748nobodyさん02/07/10 19:02ID:???
>>740
/[^0-9]/ → /^[0-9]+/
0749nobodyさん02/07/10 19:25ID:???
>748
それだと意味が変わるぞ。
>740の書き込みとif文の構成をよく見ろ。
0750nobodyさん02/07/10 19:28ID:???
>>748
それやるなら、
if ( $P !~ /^[0-9]+/ ) { }
か
unless ( $P =~ /^[0-9]+/ ) { }
じゃないと。
0751 ◆adminSE. 02/07/10 19:59ID:???
>>746

.htaacessでやるんじゃなかったっけ?

0752japh ◆J.5V8ta6 02/07/10 20:43ID:???
>>751
うわっ、何てカコイイトリップなんだ!
0753 ◆adminSE. 02/07/10 20:48ID:???
>>752

トリッパー使って3時間ほどadminで検索してたら偶然SE付きのがHITしますた
0754nobodyさん02/07/10 22:02ID:???
$fied[1]にはいってるすべての文字列【日本語含む】を@にしたいとき
$fied[1]=~tr/a-zA-Z_0-9\/.\n?-!"#$%&'()\=~|\{\`\+\*}_?><,\/\\\];@\[\\^-/@/cs;
↑このように書くしかないんですかね?
[a-zA-Z_0-9]以外の文字ぜんぶをあらわす特殊変数みたいなのありませんか。
0755nobodyさん02/07/10 22:03ID:01h+ntYo
[a-zA-Z_0-9]以外って、
[^0-9a-zA-z\_]じゃだめなの?
0756nobodyさん02/07/10 22:18ID:???
\W
0757nobodyさん02/07/10 23:13ID:???
>>750
!~ /^[0-9]+$/ のほうがさらに

0758nobodyさん02/07/10 23:23ID:???
=~ /\D/
じゃだめなの?
0759nobodyさん02/07/10 23:26ID:PCSWC5jP
CGIにデータを渡すときに、URLエンコードをしようとして

$arg =~ s/(\W)/'%'.unpack("H2", $1)/ego;

のunpack関数を使ってみたんですが、これだと、
最初の文字1文字しかエンコードされないですよね? 
例えば、
$arg=test.html?list=リスト&name=名前 
なんかだと、最初の「リ」だけじゃなく、
「リスト」と「名前」の該当する文字全部が
変換されるようにするには、どうしたらいいですか?
0760nobodyさん02/07/10 23:30ID:???
o が余計。
0761 ◆s/lF/2/o 02/07/11 00:24ID:???
一度だけコンパイルか
0762 02/07/11 00:28ID:???
>>759
おまいのegoがでてるよ。
0763nobodyさん02/07/11 00:48ID:???
>>762
ワラ・・・いかけた
0764nobodyさん02/07/11 01:10ID:???
(・w・)ブハッ! ワラテシマタ
0765nobodyさん02/07/11 02:32ID:???
(・∀・)ニヤニヤ
0766nobodyさん02/07/11 05:54ID:???
>>760, >>761
君たちは勘違いをしている。s/foo/bar/という構文の中で正規表現は
"foo"の部分だけなので例え"o"オプションをつけたからといって"bar"
のほうにはなんら意味がない。"o"は「正規表現」を一回だけコンパイル
するオプションであって置換内容をコンパイルするものではないという
事だす。

my $target = "AAAcccAAA";
for my $replacement ( qw/ bbb ddd / ) {
my $tmp = $target;
$tmp =~ s/ccc/$string/go;
print $tmp, "\n";
}
0767nobodyさん02/07/11 07:05ID:???
ヘッダとボディの区切りがもう出力されたかどうかどうやって調べるの?
0768nobodyさん02/07/11 07:13ID:???
↑こいつは一体何を言いたいのかさっぱり解らない

こっちから、また尋ねないと解らないような質問ヤメテくれ
0769nobodyさん02/07/11 07:21ID:???
>>768
説明がおかしかったですか。。例えば、

print "Content-type: text/html;\n\n";

こうゆうのが出力された後ならCookieに書くとかできないじゃないですか
だから、ヘッダが出力されているかどうか調べたいのですが。。
こういたことはできますか?
0770nobodyさん02/07/11 07:43ID:???
ソース追ってるのか
>print "Content-type: text/html;\n\n";
こう言うのを探せば良いんじゃ無いの?
端末側で吐いてる事確認したいのなら
オミトロンとかで吐き出せる
0771nobodyさん02/07/11 09:21ID:???
>>769
ヘッダとボディの区切りは改行

print "Content-type: text/html;\n";
print "Set-Cookie: name=value;\n";

〜〜〜 ↑ヘッダ 〜〜〜

print "\n";

〜〜〜 ↓ボディ 〜〜〜

print 〜〜〜
0772nobodyさん02/07/11 10:38ID:???
>>754
$fied[1] = '@' x length($fied[1]);
0773nobodyさん02/07/11 14:06ID:???
>>770
ソース追ってるってことではないです。。
>>771
それは分かっています。
区切りの改行が出力されたらもうヘッダに書き込めなくなるじゃないですか
だから、区切りの改行が出力されたかどうかPerlで調べたいです

こういったことはできないのでしょうか。
0774nobodyさん02/07/11 14:19ID:???
>>773
判断する必要性がない。
0775nobodyさん02/07/11 14:20ID:???
>>774
無理ってことですか?
0776nobodyさん02/07/11 14:26ID:???
ヘッダとボディの区別は一応あるが、perl内部ではprintで吐き出された結果に過ぎない。
perlではそんなことをいちいち区別してない。
0777nobodyさん02/07/11 15:13ID:/kd92Z8G
>773 perlはHTTPDのエクステンションじゃ無い、ただ標準出力に
printの内容を送るだけ、そのあとはhttpdの仕事
判断するなら771の言うように改行を調べれば良い。
0778 ◆JAPH9PWA 02/07/11 16:29ID:???
>>出力を見張る

our $headers_end;
sub myprint
{
$headers_end = 1 if /^$/;
print @_;
}

とか、どう?。
printをオーバーライドしてもいいかも。


# >>753 トリップ変えました。ありがとう
0779 ◆R7.pelK2 02/07/11 18:33ID:???
test
0780 ◆adminSE. 02/07/11 18:34ID:???
>>778

どういたしますて
0781nobodyさん02/07/12 02:47ID:???
http://pc.2ch.net/test/read.cgi/php/1026141215/ から

> GDモジュール、どうしても使えない。。
>
> 1 :nobodyさん :02/07/09 00:13 ID:k+y90VS+
> サーバはWebARENA Suite、
> GD.pmを使おうと
> サーバにコンパイル済みのGD1.27をアップするがどうしても
> うまく動かない。
>
> perl: error in loading shared libraries: ./auto/GD/GD.so: undefined symbol: gdImageJpegPtr
>
> こんなエラーが出る。。
> どうすればいいのか。。
> WebARENAはPerlは5.0.503だから、その環境でコンパイルしたものを選んだ。
> なぜだ、、何が、、いったい。。
078278102/07/12 02:47ID:0osVMAyz
>>781 続き

例によって親切には説明するつもりはないのでそのつもりで。

1. とりあえず telnet.cgi をまともに動かして。
2. gd-1.8.4.tar.gz(libgdのソース)というふぁいるをGETして。
3. CPANよりGDモジュールのソースふぁいるをGETして。
4. 二つのファイルをtelnet.cgiと同じdirにUPして。
5. 二つのファイルをtarで解凍して。
6. インストール先dirをcgi-bin以下にlib,include,bin,man作成
7. gd-1.8.4/Makefileを編集(インストール場所を6で作成したdirに設定)
8. gd-1.8.4をmake; make install
9. GD-1.40/Makefile.PLの
  $DEFINES .= ' -DHAVE_XPM' if $XPM;
  をコメントにする。
10. GD-1.40のDIRで[ perl Makefile.PL LIB=/virtual/おまえのIP/cgi-bin/lib/perl5 INSTALLMAN3DIR=/virtual/おまえのIP/cgi-bin/man/man.3 ]実行
11. 10で出来たMakefileに8でインストールしたgdへのLIBパスとINCパスを追加して,X関連のリンク(だっけ?-lx11とか)を削除
12. make; make install
13. GD使うスクリプトの冒頭で #!/usr/local/bin/perl -I../lib/perl5/i386-linux とでもしてくれ。
15. あとはてめぇでがんばれ。
16. 意味がわからん?ってか,わからんならやらないでくれ。他に迷惑がかかるかもしれんし。

とりあえず,demo/gd_example.cgi は動いたぞ。
# /usr/libにlibgdがあるのにヘッダがない罠…。

いくらわからんからって単発スレは立てないでくれ。
あなたのスレ立てのために他のスレがdat落ちするじゃね〜かよぉ〜。
0783nobodyさん02/07/12 04:33ID:???
>>781
なんだか偉そうだな。
とりあえず、共有サーバでコンパイルするのはやめてほしい気分。
0784nobodyさん02/07/12 12:08ID:???
素朴な質問です。
if($name eq ''){print "hoge";}
と
print "hoge" if(!$name);
は処理的には同じに思うんですが
書き方以外に何か違う意味とかってあるんですか?
■ このスレッドは過去ログ倉庫に格納されています