【Perl】初心者コーナー Part13
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/05/30 13:06ID:R2kt1mTx1:自分はこう言う事がしたい。
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あたりを見よう。
0710702
02/07/09 00:45ID:???dukeとか言うのですよね。探してみます
>>709
すいません。
lpwで検索してもよくわかんないと思ったらlwpだったんですね・・
0711nobodyさん
02/07/09 01:01ID:???print while(<SOCK>);
ってして、どんなレスポンス帰って来てるのか読んでみ
0712702
02/07/09 04:02ID:???なんとかPOSTできました。
0713nobodyさん
02/07/09 04:31ID:???ARGV = ARGuments Variable
だろ。
Value = 値
Variable = 変数
少しは勉強しろ
0715121
02/07/09 21:35ID:7t2WvFstちなみに僕はロリです、同士な人はいってください。
http://muke.up.to
0716nobodyさん
02/07/09 22:15ID:jsAirJtA0〜99の数字で(1,2,3,11,34)を含まない、配列を得るにはどうしたら良いのでしょうか?
例えば、(4、5、12)
0717nobodyさん
02/07/09 22:19ID:lugOGira& と = を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:???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:???0720nobodyさん
02/07/09 22:34ID:???@data = (1, 2, 3, 11, 34);
for ( 0..99 )
{
foreach ( @data )
{
push
}
}
0721nobodyさん
02/07/09 22:38ID:???4, 5, 12を除いてみた.
%exclude = (4 => 1, 5 => 1, 12 => 1);
@data = grep { !$exclude{$_} } 0 .. 99;
0723nobodyさん
02/07/09 22:40ID:lugOGiraそれってどういうこと?
よくわかんない…、スマソ
0724nobodyさん
02/07/09 22:45ID:???より、
=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg;
の方が早いって言いたいんじゃない?
0725716
02/07/09 22:51ID:???>>721
こんなに、すぐレスくれるなんて思っていませんでした。
有り難う御座います。
これから、考えてみます。なにせ初心者な物でチンプンカンプンです。
0726ヽ(`Д´)ノ ウワァァン
02/07/09 23:29ID:gcNlx8b2CGIファイルをエクスプローラーで見ようとすると文字化け! ヽ(`Д´)ノ ウワァァン
レンタルサーバー上にアップしたら文字化けしないのに! ヽ(`Д´)ノ ウワァァン
0727nobodyさん
02/07/09 23:45ID:???print "Content-type: text/html; charset=Shift_JIS\n\n"; ヽ(´∀` )ノ
0728
02/07/10 00:48ID:Q4ccJnsM$a = 10;
だと
$a2 で 20 になるのですか?
するどいな。だれにおそわった?
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 割り算
0734nobodyさん
02/07/10 01:15ID:fQbDc9qZさんきゅ。
後は調べる
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=
0738nobodyさん
02/07/10 09:20ID:???全てのパスワードを同じ物にするようなマヌケな奴相手ならな。
まぁ、マヌケが多いのは確かだが。
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:???=~ //
だろ。
0742740
02/07/10 14:18ID:lBfYsgMLできましたーーー!!
ありがとうございます
0745nobodyさん
02/07/10 16:58ID:???0746nobodyさん
02/07/10 17:04ID:???0747746
02/07/10 17:14ID:???0749nobodyさん
02/07/10 19:25ID:???それだと意味が変わるぞ。
>740の書き込みとif文の構成をよく見ろ。
0750nobodyさん
02/07/10 19:28ID:???それやるなら、
if ( $P !~ /^[0-9]+/ ) { }
か
unless ( $P =~ /^[0-9]+/ ) { }
じゃないと。
.htaacessでやるんじゃなかったっけ?
トリッパー使って3時間ほどadminで検索してたら偶然SE付きのがHITしますた
0754nobodyさん
02/07/10 22:02ID:???$fied[1]=~tr/a-zA-Z_0-9\/.\n?-!"#$%&'()\=~|\{\`\+\*}_?><,\/\\\];@\[\\^-/@/cs;
↑このように書くしかないんですかね?
[a-zA-Z_0-9]以外の文字ぜんぶをあらわす特殊変数みたいなのありませんか。
0755nobodyさん
02/07/10 22:03ID:01h+ntYo[^0-9a-zA-z\_]じゃだめなの?
0756nobodyさん
02/07/10 22:18ID:???0758nobodyさん
02/07/10 23:23ID:???じゃだめなの?
0759nobodyさん
02/07/10 23:26ID:PCSWC5jP$arg =~ s/(\W)/'%'.unpack("H2", $1)/ego;
のunpack関数を使ってみたんですが、これだと、
最初の文字1文字しかエンコードされないですよね?
例えば、
$arg=test.html?list=リスト&name=名前
なんかだと、最初の「リ」だけじゃなく、
「リスト」と「名前」の該当する文字全部が
変換されるようにするには、どうしたらいいですか?
0760nobodyさん
02/07/10 23:30ID:???おまいのegoがでてるよ。
0764nobodyさん
02/07/11 01:10ID:???0765nobodyさん
02/07/11 02:32ID:???0766nobodyさん
02/07/11 05:54ID:???君たちは勘違いをしている。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:???説明がおかしかったですか。。例えば、
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:???ヘッダとボディの区切りは改行
print "Content-type: text/html;\n";
print "Set-Cookie: name=value;\n";
〜〜〜 ↑ヘッダ 〜〜〜
print "\n";
〜〜〜 ↓ボディ 〜〜〜
print 〜〜〜
0773nobodyさん
02/07/11 14:06ID:???ソース追ってるってことではないです。。
>>771
それは分かっています。
区切りの改行が出力されたらもうヘッダに書き込めなくなるじゃないですか
だから、区切りの改行が出力されたかどうかPerlで調べたいです
こういったことはできないのでしょうか。
0776nobodyさん
02/07/11 14:26ID:???perlではそんなことをいちいち区別してない。
0777nobodyさん
02/07/11 15:13ID:/kd92Z8Gprintの内容を送るだけ、そのあとはhttpdの仕事
判断するなら771の言うように改行を調べれば良い。
our $headers_end;
sub myprint
{
$headers_end = 1 if /^$/;
print @_;
}
とか、どう?。
printをオーバーライドしてもいいかも。
# >>753 トリップ変えました。ありがとう
どういたしますて
0781nobodyさん
02/07/12 02:47ID:???> 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だから、その環境でコンパイルしたものを選んだ。
> なぜだ、、何が、、いったい。。
0782781
02/07/12 02:47ID:0osVMAyz例によって親切には説明するつもりはないのでそのつもりで。
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落ちするじゃね〜かよぉ〜。
0784nobodyさん
02/07/12 12:08ID:???if($name eq ''){print "hoge";}
と
print "hoge" if(!$name);
は処理的には同じに思うんですが
書き方以外に何か違う意味とかってあるんですか?
それは処理的に同じではないよ。
$nameが単なる文字列なら結果としては同じことだけど、
もし$nameがオーバーロードされた文字列なら、全く違う結果になることはありえる。
まぁそんなことを聞きたいんじゃないと思うけど、
質問する場合はその辺を簡略化してよ。
で、
if(foo){ bar }
と
bar if foo;
は同じこと。ちなみに
foo and bar;
も同じ。
書き方意外に違う意味は「読みやすさ」だね。
自分が文脈に合う、読みやすい、と思う構文を使えばいいよ。
0786nobodyさん
02/07/12 12:47ID:???$name = "0";
の時に変わるな。
あう、そういえばそうだ。
単なる文字列だとしても別の意味をもつ文だね。
0789nobodyさん
02/07/12 17:48ID:???# ローカル環境(WindowsMe+Apache+Cygwin付属のPerl)では成功するのですが、
# サーバで実行するときには、必ず失敗します。
# コーディング上の落ち度がありましたらご教授ください。
sub create_lock {
my ($lockfile, $retry) = @_;
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) {
return undef;
}
sleep(1);
}
return 1;
}
sub remove_lock {
my ($lockfile) = @_;
rmdir($lockfile);
}
#上記関数の利用例
my $lock_handle = &create_lock($dir_lock, $lock_retry);
if (not $lock_handle) {
&print_error($resource{writedatafailed});
}
#ここで処理する
&remove_lock($dir_lock);
0790789
02/07/12 17:48ID:uV0iCTit0791nobodyさん
02/07/12 17:53ID:???ttp://pc.2ch.net/test/read.cgi/php/1024795138/
0793nobodyさん
02/07/12 19:41ID:mbAMx/DLタブ区切りの表から、一行ずつ取得し、grepで検索をかけ、
マッチしたものとマッチしなかったものの一覧を作成したいのですが
・条件に、検索キーワードは複数。(or形式)
・行末に、ヒットしたキーワードのみ挿入(複数のうち、該当した物だけ)
というものがあります。
その時
if(grep /$kw{$key}/,@line){#配列の中にキーワードが入っているなら
chomp @line;
if($check_flag == 0){
push(@result,@line);
push(@result,$kw{$key});#resultに追加
$check_flag = 1;#別のところでフラグに使っている
$flag = $line[0];#別のところでフラグに使っている
$no_count = 1;#一回目かそうで無いかのフラグ
push(@result,"\n");#行末にキーワードをつける
}elsif($check_flag == 1){#二回目からはキーワードのみを最後につける
push(@result,$kw{$key});
$no_count = 1;
とした時、配列の最後に$kw{$key}をpushで押し込むと、強制的に改行が入ってしまいます。
かといってchompをすると、全部改行が消えてしまい、全部のデータで一行扱いになってしまいます。
どうにか最後の改行のみ消す方法はありませんでしょうか?
取得した行+キーワードx個
取得した行+キーワードx個
・
・
というような表を、上記のスクリプトに手を加える程度で
作成することは可能でしょうか?
すいませんが、わかる方がいらっしゃいましたらご教授ください。
0794nobodyさん
02/07/13 00:01ID:???とりあえず突っ込んでおこう。↓は何ですか?
push(@result,"\n");#行末にキーワードをつける
あと$kw{$key} に改行が含まれる可能性は?
つーかそもそも if (grep /$kw{$key}/, @line) { 〜でやりたい事が出来るのかねぇ。疑問だよ。
0795nobodyさん
02/07/13 01:13ID:???どうすればよいでしょうか。
バイナリ化して、プロテクトをかけると聞いて調べたところ、
バイナリエディタというものを見つけましたが、
プロテクトの仕方がどうしても解かりません。
プロテクトするほどのソースは書けませんが、
どうかよろしくお願いします。
0797nobodyさん
02/07/13 22:35ID:xEQW3A4yA :22
B :31
C :13
上記のような二次配列を連想配列をつかって作成したのですが、
これをソートするのはどのようにすればいいのでしょう・・?
知人の考えで、年齢をハッシュのキーにしてソートすると言う案があったのですが、
同じ年齢の場合には、上書きされてしまうのでその案は使えませんでした。
どのようにすればいいでしょう・・?
0798nobodyさん
02/07/13 22:49ID:???print qq($_ : $hash{$_}\n);
}
0799nobodyさん
02/07/13 22:49ID:???適宜修正して。
0800nobodyさん
02/07/13 23:28ID:???今、ラクダ本で、コンパイルについて見ています。
しかし、use Protect ;とファイルにはあるのですが、
この Protectの部分について書かれていません。
use Protect ; は、どうやればできるのでしょうか。
ラクダ本のどこだかわからないが、
それは「自分でプロテクトモジュールを作成してね」という意味だと思う。
とりあえずそれを実装するには、
・Perlに構文の理解
・CPANのFilterライブラリの使用法
・暗号化ライブラリの使用法
が最低限必要だと思うよ。
0802お酢カル ◆myMazZ7Y
02/07/14 01:07ID:???説明できないオナニー野郎は(・∀・)ウセロ!!
まぁ>>800は馬鹿だからこれでいいかと
------------encode-------------------
while(<>){
$n= unpack "h*", "$_";
$n=~y/123456789fedcba/abcdef987654321/;
$e= pack "h*" , "$n";
print $e;
}
0803nobodyさん
02/07/14 01:08ID:???googleで、検索していたのですが、use MD5; というのは、
見つけました。
私には、まだ敷居が高そうです。
e-shoppyというSHOPスクリプトの試用版にバイナリエディタを
使うようにあったので、試用版って、こんな感じで配布しているんだと
思い、気になるので調べていました。
スクリプトを売る前に、試用版として、こんな感じで配布すれば、
ソースがプロテクトできるので、有用だなと興味を持ちました。
0804nobodyさん
02/07/14 02:43ID:vNhQYRiQ今、perlでBBSを書いているのですが、
大体できて知り合いの所に入れてもらったりして
動作確認しました。
色んな環境の人のところで正しく動作したのですが、
(perlのバージョンが5.5or5.6,実行権限がnobody,オーナー等)
一人だけ動作がおかしい人がいるんです。
何がおかしいのか調べてみたら、
サブルーチンでseekさせてメインのルーチンに戻ってくると
seekさせたのが無かったことに?なってるんです。
サブルーチンでどんなにseekさせても
メインのルーチンで続行するとなぜか次の一行は空行、
その次の一行はファイルの一行目を読み込みます。
そのおかしくなる人の環境は
OS NAME = freebsd
PROCESS ID = 5854
PERL EXECUTABLE = /usr/local/bin/perl
PERL VERSION = 5.00503
ってな感じです。権限はオーナー権限です。
他の、perlのバージョンが5.5の人のところではちゃんと動いてます。
この人の環境になにか特別なものがあるとは思えないので、、、
ただ、他の人はみんなlinuxなんですけどそれって関係ありますか?
コーディングの問題かとも思っていろいろ試行錯誤してるのですけど
もう分からないんです・・・
0805nobodyさん
02/07/14 02:51ID:CbCEC3kHソースもどこかにアップしてみてよ。
0806nobodyさん
02/07/14 03:15ID:???UPしてみました。なにぶん、perlでの初めてまともな作成物なので
見るのも辛いところもあると思いますが、よろしくお願いします。
ttp://naha.cool.ne.jp/b3b3b/styx.zip
0808nobodyさん
02/07/14 03:25ID:???もうしわけないです;;
0809nobodyさん
02/07/14 03:42ID:CbCEC3kHsysread関数と他の方法による読み込みの混用が存在しています。
これは、わたしの手元のラクダ本に書いてあることですが、これらの混用は、
あなたがウィザード級の腕前の持ち主でないかぎり推奨できないとあります。
■ このスレッドは過去ログ倉庫に格納されています