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

Perl 初心者コーナー Part22

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/04/15 10:15ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
023222603/04/22 00:11ID:yfHpFKfL
>>230
できました!
うわーい!うわーい!
ありがとうございます!

「もし<DT>...</A>に当てはまるなら」という具合で、ずっとif文に縛られて
いました・・・。すみません。でも勉強になりました!

ああ、我知らず、熱い涙が押し出されてきよる・・・(滂沱の涙)。

>>231
最初はブラウザのブックマークからURLとタイトルを抜き出すという課題を自
分に課したのです。それがうまくいって一息ついたときに、「こうするとど
うなるんだろう?」と思い付いてしまったのでした。

ゆるせよ(遠山の金さん)。
0233nobodyさん03/04/22 01:59ID:8UmhU43L
タグを使わないでKENTの掲示板を改造してimgを掲示板に貼り付けるには?
どうすれば良いですか?
0234nobodyさん03/04/22 02:08ID:???
>>233
意味不明だし、ここはそういうスレじゃない。
とても改造できそうにも思えないので素直に画像貼れる掲示板を使いなさいな。
0235nobodyさん03/04/22 04:41ID:Jj2tlT0c
\ が入った文字列のマッチングをおこないたいのですが

$rootdir = "\\newfolder";
$workdir = "\\newfolder";
if ($rootdir == $workdir) {
 print "OK\n"; # 表示されます
}

if ($workdir !~ m#$rootdir#i) {
 print "NG\n"; # 表示されます・・・
}
これはなぜ NG が表示されるのでしょうか?
環境は、PERL 5.6.1 を Win2000 のコマンドプロンプトで動かしています。
よろしくおねがいします。
0236nobodyさん03/04/22 06:26ID:???
>>235
# 「\newfolder」という文字列
$rootdir = "\\newfolder";
$workdir = "\\newfolder";
# 正規表現は /\newfolder/ =「[改行]ewfolder」
# 「\newfolder」という文字列は「[改行]ewfolder」にマッチしない。
if ($workdir !~ /$rootdir/) { print "NG\n" }
# 本当に改行になってしまっているか確認
$workdir = "\n" . 'ewfolder';
if ($workdir =~ /$rootdir/) { print "OK\n" }
# 対策1
$workdir = "\\newfolder";
if ($workdir =~ /\Q$rootdir\E/) { print "OK\n" }
# 対策2
$rootdir = quotemeta($rootdir);
if ($workdir =~ /$rootdir/) { print "OK\n" }
0237nobodyさん03/04/22 07:25ID:???
それでは
$rootdir = "\\newfolder";
print ">$rootdir<\n";

結果
>\newfolder<(改行)

なぜここでは $rootdir の先頭の \n が改行に展開されないのでしょうか?
と、もう一つ質問を書いたら多分分かりました。正規表現じゃないからですね
どうもありがとうございました
うーんややこしい・・・
0238nobodyさん03/04/22 11:38ID:???
>>237
\で\をエスケープしてるからだろ
ややこしくもなんともない
0239nobodyさん03/04/22 12:15ID:???
ブラウザからファイルを選んで
ある書式にフォーマットして出力したいんですけど
なぜかエラー500がでます。
何か一般的な原因があれば教えて
0240nobodyさん03/04/22 12:25ID:???
>>239
間違っているから。としか言いようがない。
0241nobodyさん03/04/22 12:27ID:???
>>239
ブラウザの出す「エラー500」から原因を突き止めるのは困難。
「Perlの出すエラー」を書いてくれないとわからん。
0242nobodyさん03/04/22 13:07ID:???
>>238
あんた235の意味を解ってないな
/\\newfolder/
こうなる事を期待したって事だろ
024323803/04/22 16:16ID:???
>>242
確かにお前みたいな知障が考えていることは解らないなぁ
0244nobodyさん03/04/22 16:42ID:???
>>239
「エラーを出すスクリプト」を晒してくれないとわからん。

0245nobodyさん03/04/23 00:26ID:???
perlでcsvを編集してメールで転送するプログラムを
作成しようと思ったのだが、全くの初心者のため
paerl自体の実行が失敗している。
誰かなんとかしてくれ。
0246nobodyさん03/04/23 00:27ID:???
m/ / => 変数展開してから正規表現担当に渡す
qq/ / => 変数展開とエスケープされた文字の復活を同時に行う

正規表現担当の部分は、エスケープされた文字を元に戻してから処理する。

$pattern = '\\n_hoge';
($pattern は \n_hoge)
print "$pattern\n";
print "match!\n" if $pattern =~ /^$pattern$/;

正規表現中と、ダブルクオートの中身は、展開の仕方が違うということ。
0247nobodyさん03/04/23 00:33ID:???
せんせ〜質問。
cgiのパスワードの逆変換って、できるんですかー?
スクリプトはあります。変換後のワードもあります。
おねがいします。
0248nobodyさん03/04/23 00:35ID:???
John the ripper
0249nobodyさん03/04/23 00:38ID:???
>>247
自分で調べろボケが。
とっとと失せろ
0250nobodyさん 03/04/23 00:39ID:???
>>247
crypt関数のdecrypt基本的に無理
仕様的には、Desはdecrypt出来るんだがperlでは出来な威実装をしてある。
あと、MD5は絶対できないといった感じ
0251nobodyさん03/04/23 00:43ID:???
ジョンか・・・
>>247みたいなやつには13金のジェイソンのほうが
0252nobodyさん03/04/23 00:44ID:???
そんなことないよ。あぁ、解読っていうより、同じものになる
値の1つを見つける、っていうことなんだけど。>>248でやれ
025325203/04/23 00:45ID:???
>>250へのレスだったのです
0254nobodyさん03/04/23 00:49ID:???
ファイルのrenameしようとおもったんだけど消えてしまった。
元に戻す方法ある?
025525003/04/23 00:49ID:???
>>253
質問の意味そのままであるが?
cryptの照合方法はどうすればいいかってなら別の答えも出来るんだがねぇ
0256nobodyさん03/04/23 00:50ID:???
>>254
意味わからんって。
チョンは日本語覚えてから来てください。
025724703/04/23 00:51ID:???
ども、助かりました。とっとと消えます。
まともに答えてくれたからサンクス。
13金・・・古!!!
0258nobodyさん03/04/23 00:57ID:???
renameで変更後のファイル名のファイルが存在したら、消えることになる。あきらめろ。
025925403/04/23 00:57ID:???
>>256
ハァ?
チョンってなあに?
元に戻す方法がわからないなら
返答すんなよ。
ば〜〜か。
0260nobodyさん03/04/23 00:59ID:???
>>259
朝鮮人に決まってるだろ。低脳
026125003/04/23 01:02ID:???
>>259
つーか、しょーも無い事で腹立てる前に、ちゃんとperlの関数を勉強してこいよ・・・
0262nobodyさん03/04/23 07:06ID:???
掲示板に自動で書き込むツールを作りたいんですけど
方法がさっぱりわかりません。
ヒントでいいんでわかりやすく教えてください。
お願いいたします。
0263nobodyさん03/04/23 07:40ID:???
>>262
ttp://member.nifty.ne.jp/hippo2000/perltips/LWP.html#An_Example
0264nobodyさん03/04/23 08:58ID:???
さっぱりわからない = 学習する気は無い
0265nobodyさん03/04/23 09:41ID:???
>>262
ここはPerlスレなので、あなたの質問はスレ違いです。
0266nobodyさん03/04/23 12:07ID:???
>>265
なぜ?
perlでプログラム組むんですけど・・。
荒らしは帰れ
0267nobodyさん03/04/23 13:02ID:???
>>266
Perlのコーディングで困ってる人のスレです。

まったくのゼロから質問するなや
0268nobodyさん03/04/23 16:32ID:???
質問させてください。
今、Perlのコメント部分を削除するスクリプトを組んでるんですが、
#から始まる文字を削る事はできるのですが、
$#演算子まで削られてしまいます。

$len =~ s/((\$#)*.*)#.*$/$1/g;

・・・と、こんな事もしてみたのですが、ダメでした・・・
どんな風に表現すれば、$#を削らずに行けるでしょうか?
よろしくお願いします。
0269nobodyさん03/04/23 17:12ID:???
一行ずつ読み込むとして

while(<PERLFILE>){
if($_ =~ /^#/){ $_ = ''; }
#出力処理
}

じゃ駄目ですか?
0270nobodyさん03/04/23 17:14ID:???
>>268
$len = <<'EOL';
my @array = ('a' ,'b', 'c'); # コメント1
print STDOUT @array if $#array > 1; # コメント2
# push(@array, 'ぬるぽ');
EOL

$len =~ s/(?<!\$)#.*//gm;
print STDOUT $len;

# ----出力結果----
my @array = ('a' ,'b', 'c');
print STDOUT @array if $#array > 1;

# ----出力結果----
027125003/04/23 17:17ID:???
>>269
必ずしも、先頭に有るわけじゃ無いからのぉ

$data =~ s/(?<!\$)#.*$//g;

とか・・・
0272nobodyさん03/04/23 17:43ID:???
>>269
>>270
>>271

お答えいただきありがとうございます。
正常に動くようになりました・・・が、
(?<・・・)←これってなんですか???
(?=・・・) とか (?!・・・) とかなら分かるのですが・・・
本にも載ってない・・・
よろしければ、お答えを・・・
027327203/04/23 18:41ID:???
・・・と、いろいろネットで調べた結果、なんなのか分かりました。
しかし・・・ラクダ本にも載ってなかった・・・
なぜ???探し方が悪かったのかな・・・???

とにかく、ありがとうございました。
0274nobodyさん03/04/23 18:51ID:???
なんでみんな弱者に厳しいのに
最弱者である自分には甘いの?
0275nobodyさん03/04/23 18:52ID:???
>>274
その質問は板違いかと。
0276nobodyさん03/04/23 18:56ID:???
何も無い所でつまづくドジっ娘特性を感じたからだろ
0277nobodyさん03/04/23 18:57ID:???
>>276
納得
0278nobodyさん03/04/23 19:26ID:???
perl初めて1週間の初心者です。
web掲示板のパスワードを総当たりで調べていくスクリプトが欲しいです。
持っている方、もしくは落ちている場所を教えてください。
但し難しいスクリプトは却下ですので、簡単で直感的に使えるもののみに限定させて頂きます。
0279nobodyさん03/04/23 19:35ID:???
perl始めて1週間の小心者です。
0280nobodyさん03/04/23 19:37ID:???
>>278
どこの掲示板で使うのか教えてくれたら
配布場所も教えてあげる(はぁと
0281nobodyさん03/04/23 19:53ID:???
>>278
こんなCGI探してますスレッド Ver8へ逝け!
0282nobodyさん03/04/23 20:19ID:???
この板のローカルルールって甘いね。ム板には
>ウイルス、ハッキング・クラッキングを求めるような発言は禁止です。
ってのがあるんだから、WebProg板にもこんな感じのルールがあってもいいんじゃないか。
と言ってみるチェスト
0283nobodyさん03/04/23 20:23ID:???
そういう発言者をオモチャにする楽しみを奪われては寂しい
0284nobodyさん03/04/23 22:25ID:???
ええと、ヘタな説明になるんですが、
以下のような感じであったとします。

while($form{"k$no"}){
${"party_2$party[$no]"}{'数字'};
$no ++;
}

余計な記述が含まれてますが、見るところは$noが一つづつ増えていって、
んで数字が一つづつ順番に返って来る所です。
で、数字を多いほうから少ないほうへと順番に並べたいわけなのですが…

$no = 1;
${"party_2$party[$no]"}{'数字'} = 2;

$no = 2;
${"party_2$party[$no]"}{'数字'} = 5;

$no = 3;
${"party_2$party[$no]"}{'数字'} = 4;

上記の場合、$noが2、3、1の順番で大きいわけですよね。
この時の$noの番号を出したいんです。
つまり、結果としては

$aaa[0] = 2;
$aaa[1] = 3;
$aaa[2] = 1;

みたいな感じでソートしたいのです。
どうすればよろしいでしょうか?
0285動画直リン03/04/23 22:29ID:wyYrHR5Q
http://homepage.mac.com/hitomi18/
0286nobodyさん03/04/23 23:02ID:???
>284
${"party_2$party[$no]"}{'数字'};
ここは
$party_2{"$party[$no]"}{'数字'};
こうした方がいいかも。

ともあれ、
foreach( sort{${"party_2$party[$b]"}{'数字'} <=> ${"party_2$party[$a]"}{'数字'}} (1 .. 3) ){
  push(@aaa,$_);
}
ってとこかな?
028728403/04/23 23:16ID:???
>>284
にゅっぱ〜ん。
ありがとでした。


って言うか、微妙に意味が分からん所があったので
どーなってんのかちゃんと考えてから使わせてもらおうかと思います。
028827203/04/24 02:08ID:???
ども。
先ほど、コメントを削除する正規表現の質問した者です。

で、コメント削除するスクリプト完成しました。
まぁ、それなり使えそうです。
見てやってください。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/996.lzh

↑からどぞ。
ここから、誰か拡張とかできればお願いします。
で、よかったらアップしていただければ・・・
それ見て、勉強させてもらいたいと思います。
0289動画直リン03/04/24 02:29ID:vV02vP1k
http://homepage.mac.com/hitomi18/
0290nobodyさん03/04/24 02:49ID:???
>>272
プログラミング Perl 改訂版は 5.002 辺りの解説書。
(?<=) (前方参照) が実装されたのは 5.005 。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perldelta.html
第3版 (2分冊になった最新の駱駝本) なら載ってるんじゃないかな?
029127203/04/24 02:53ID:???
>>290
マジっすか!
俺の持ってるラクダ本、もう古いの???
5000円ちょっともしたのに・・・
第2版って書いてる・・・って事は、
俺の知識はPerl5.003くらいかな・・・。
またラクダ本買うなんて、なんだか罠にはまった感じが・・・

教えてくれて、ありがとうございました。
0292nobodyさん03/04/24 03:16ID:???
>>288
バグがあった。
直した。
0293nobodyさん03/04/24 03:17ID:???
>>292
忘れてた
ttp://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/997.lzh
0294nobodyさん03/04/24 03:45ID:???
>>272 >>293
そーゆーのはこっちに。
http://pc2.2ch.net/test/read.cgi/php/1049514428/
029527203/04/24 04:24ID:???
>>294
これは失礼しました。。。
誘導、ありがとうございます。
でも、誘導先も、自作CGIですね。
・・・でも、ここよりかは、少しは近いかも・・・
って事で、移動します。

誰かすごい改造してくれないかな・・・。
0296nobodyさん03/04/24 07:02ID:???
自動的にコメント付けてくれるスクリプト欲しいな。
0297nobodyさん03/04/24 11:19ID:???
質問させて頂きます

srand();
@salts = ("A".."Z", "a".."z", "0".."9", ".", "/");
$salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$epasswd = crypt($password, $salt);

と処理しごく普通に文字列を暗号化した後

if (crypt($password, $epasswd) eq $epasswd)

で識別するのですが、入力された暗号化前の文字列の始め4文字辺りまで入力すると
移行何も入力しない場合・適当な文字を入力した場合に照合OKとなってしまいます...
これは暗号化に不備があるのか、若しくは照合方法に問題があるのでしょうか

尚、動作環境は下記の通りです
Win98 + AnHTTPd 1.38c + ActivePerl 522
0298nobodyさん03/04/24 11:34ID:???
>>297
よくわからんけど
if (crypt($password, $epasswd) eq $epasswd)
は
if (crypt($password, substr($epasswd, 0, 2)) eq $epasswd)
じゃないか?
0299nobodyさん03/04/24 11:37ID:???
>>298
いや、わざわざ2文字切り取る必要はないよ。
(crypt関数側で先頭2文字以降を無視してくれるはず)

具体的にどんなパスワードがダメなのか教えて欲しい。
030029703/04/24 13:49ID:???
パスワード文字列に利用する文字列は様々なのですが
例として "kakikukeko" としますと

"kakikuke"

まで入力された時点で照合OKの場合に用意している処理に流れてしまいます。
これ移行の文字列を入力しない場合も、あるいは何も入力しない場合でも
照合OKと認識されてしまいます

いろいろPerlで組んで見たいのですが、何回試みてみてもこの部分で引っかかってしまい
作業が一向に進まなくて困っております T_T
030125003/04/24 13:59ID:???
>>300cryptの使い方間違ってないかい?

確か、des方式だと文字列長の限界が有るはず
それが嫌ならMD5でやるのが正解なんだけど
それはOSに依存する
0302nobodyさん03/04/24 14:00ID:???
>>300
おい!8文字までだ!
030325003/04/24 14:01ID:???
>>300
んで、なんでそうなったかというと、切り捨てられてるってことじゃないかと思われ
030430203/04/24 14:02ID:???
てめぇ>>297で「4文字」つったじゃねーか!

・・・ってもしかして2バイト文字で4文字?
>>302は「おい!8バイトまでだ!」に訂正しますです。
030529703/04/24 14:24ID:???
申し訳ありません、ローマ字入力になっちゃってますが
日本語で入力した場合で4文字って事でした

とはいえ、DESにて文字列の制限が存在するとは知らず
ずっと問答しておりましたのでマジ泣きしそうです...

どうも有難うございました!!

0306nobodyさん03/04/24 15:42ID:???
>>305
暗号前の文字列が8バイト以上になるんだったら、
強引に8バイトごとに切っちゃって別々に同じ種で暗号化して最後に繋げるとか。
0307nobodyさん03/04/24 15:49ID:???
>>306
そういう話じゃないと思われ
0308nobodyさん03/04/24 18:05ID:???
>306

無駄
030925003/04/24 18:08ID:???
それなら最初からMD5使え
Win系の実装なら使えんが種値に $1$ を付けるだけで済む
0310nobodyさん03/04/24 18:38ID:???
DESだからデス
0311nobodyさん03/04/24 19:00ID:???
MD5=マジで出そう5秒前
0312オーディーン03/04/25 00:02ID:8w/Lt+kf
Perlで作られた掲示板のプログラムがあるのですが。
これにリファラーチェックをつけて特定のページからでないと
表示できないようにしたいのですが。
たとえば『http://ike-ike.net/index1.htm』からでないと表示できないように
したのですが・・・
どの辺をいじったらいいのでしょうか?

ソースはこちら
http://www.ike-ike.net/bbsking.txt

アドバイスお願いします。(゜゜)(。。)ペコリ

0313nobodyさん03/04/25 00:05ID:???
>>312

↓の>>1を10回ほど読んでからどうぞ。

【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
0314nobodyさん03/04/25 01:38ID:???
>>312
マルチポストやめれ!
面前、 http://pc2.2ch.net/test/read.cgi/tech/1048519394/526 だろ?

#それとも、単なるコピペの釣りか?
031525003/04/25 04:45ID:???
>>312
リファラー取れてるんであれば、別cgiを作ってみれるようにしたほうが楽なんじゃないだろうか・・・
0316オーディーン03/04/25 06:33ID:8w/Lt+kf
312は

【 スクリプト改造工房 PART 6 】

に移動しました。よろしく。
0317nobodyさん03/04/25 06:52ID:???
ファイルの読み込みで質問したいのですが
1000行あるファイルから途中の10行だけ取り出したい場合、
 whileで目的の行まで読み込む
 @でファイル全体を読み込んでから目的の行を取り出す
二つのうちどちらが負荷や処理スピードの面でいいのでしょうか?
あともし他にもやり方がある場合はそれも教えていただけるとありがたいです。
0318nobodyさん03/04/25 07:04ID:???
>>317
普通に考えて、whileで10行目を読むのが早いと思うが?
10行目を読んだら、それ以降は読まずループ抜ける事できるし。
配列で全部読んでたら、メモリの無駄だし。
0319nobodyさん03/04/25 07:28ID:Ai2lxSHs
http://www.k-514.com/
0320bloom03/04/25 08:29ID:pCM0Odok
http://homepage.mac.com/ayaya16/
0321nobodyさん03/04/25 09:15ID:Ai2lxSHs
http://homepage3.nifty.com/coco-nut/
0322nobodyさん03/04/25 10:38ID:CjHipUDv
初心者な質問ですいません。

foreach $value (keys %in){
  $in{$value};
  $in{$value}について、&;`'\"|*?~<>^()[]{}$があったら、すべて全角にする
}

の3行目って、どうやって組めばいいのでしょうか?
0323nobodyさん03/04/25 10:50ID:???
>>322
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H
032432203/04/25 10:58ID:???
>>323
ってことは、

foreach $value (keys %in){
  $in{$value};
&jcode::tr(\$in{$value}, '&;`'\"|*?~<>^()[]{}$', '&;`’¥”|*? ̄<>^()[]{}$');
}

だけでOKってことですか?
0325nobodyさん03/04/25 11:02ID:???
まず、やってみなよ。
テストするソースぐらいすぐ書けるでしょ。
032632203/04/25 13:10ID:???
>>325
そりゃそうですね。しつれいしますた。

で、>>324 にでやったら
foreach $value (keys %in){
  $in{$value};
&jcode::tr(\$in{$value}, '&;`'\"|*?~<>^()[]{}$', '&;`’¥”|*? ̄<>^()[]{}$');
}


Backslash found where operator expected at /foo/index2.cgi line 48, near "'&;'\"
[index2.cgi:48:warn] (Missing operator before \?)

理由は、'・・・・・'の中に、'を入れてたからなので、

\' とエスケープして↓のようにやったら、うまくいきました。
ありがとうございます。

foreach $value (keys %in){
&jcode::tr(\$in{$value}, '&;`\'\"|*?~<>^()[]{}$', '&;`’¥”|*? ̄<>^()[]{}$');
}
0327nobodyさん03/04/25 13:43ID:???
めでたしめでたし
0328nobodyさん03/04/25 14:56ID:???
エラーの英文が読めないとか馬鹿の多い昨今、痛みに負けずよく頑張った!
感動した!
0329nobodyさん03/04/25 23:13ID:???
>>326
エスケープが面倒な場合、qq!文字列! にしてみるのもどうよ。([!]が使われていないから)
0330nobodyさん03/04/25 23:15ID:???
>329
qqにしたら、逆にダメになる単語が増えないか?
0331nobodyさん03/04/26 00:49ID:???
qqって便利なようで実は逆に使い辛いよな・・・
手癖でダブルクォート打ってまうし(´ヘ`;)
■ このスレッドは過去ログ倉庫に格納されています