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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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


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

過去ログやお勧めサイトは >>2-10
0452nobodyさん03/06/16 19:47ID:???
>>448
REMOTE_ADDRを記録して、それが同じだったということはREMOTE_ADDRが同じだったということではないですか?
>>451
CGIは全部実行した後出力するんだよ。たしか。
0453nobodyさん03/06/16 19:51ID:???
え、じゃあスリープの意味って・・・・
0454nobodyさん03/06/16 19:51ID:???
>>453
PerlはCGIためだけのものではありません。
0455nobodyさん03/06/16 19:56ID:???
>>449
俺にもよく分からんけど、この辺とか
ttp://www.google.co.jp/search?q=cache:yNlP1fhIQ48J:tohoho.wakusei.ne.jp/lng/199802/98020500.htm+%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0+cgi&hl=ja&lr=lang_ja&ie=UTF-8
0456nobodyさん03/06/16 20:40ID:???
MobileType(スペルあってるかな?モバイルタイプ)っていう
スクリプトで、mt-load.cgiを実行したときに1行ずつ表示されてたんだけどなぁ。
nphでもなさそうだし・・・
0457nobodyさん03/06/16 21:32ID:???
>>456
mt-load.cgi の20行目で、>>455の "$|=1" してるから
0458nobodyさん03/06/16 21:34ID:???
>>457
ほんとだ、localついてて見落としてた。。。
でも、sleepもないし、nph-*.cgiでもないのに・・・
どういう仕組みなんでしょうか?
0459nobodyさん03/06/16 21:38ID:???
うぅ、何回も1行ずつ流れてるのみてる・・
イイナァ
0460nobodyさん03/06/16 22:00ID:???
>>443
IPをHOSTに変換してみたら何かわかるかも
0461nobodyさん03/06/16 22:06ID:???
どれもこれもネタか?
あああ鬱。
046245803/06/16 22:08ID:???
ほんとお願いしますよ〜〜
どうやったらできるんでしょ。。
ネタとか言わないで・・・
0463nobodyさん03/06/16 22:26ID:???
REMOTE_ADDRが常に同じ値になるように設定してあるサーバがあるよ。
0464nobodyさん03/06/16 23:52ID:???
REMOTE_ADDRを表示するだけのスクリプト書いて
いろんな串さしてみて試せば?
0465nobodyさん03/06/16 23:55ID:???
>>449

$| = 1;
@data = ("あ","い","う","え","お","か","き","く","け","こ");
print "Content-Type: text/plain\n\n";
for($i=0; $i<=$#data; $i++){
print "$data[$i]<br>\n";
sleep(1);
}
exit;

これでやってみれ。
046645803/06/16 23:57ID:???
>>465
ん〜、やっぱり始めに全部sleepして一気に吐き出しますねぇ。。。
0467nobodyさん03/06/17 00:02ID:???
いっそのこと、1行ずつ表示する部分はJavaScriptに任せちゃうとか。
0468nobodyさん03/06/17 00:09ID:???
>>466
そりゃ環境がおかしいんだわ
046945803/06/17 00:12ID:???
>>468
マジっすか?
0470nobodyさん03/06/17 00:14ID:???
>>466
htmlについてもよく考えてみれ。
ブラウザがソースを受け取り、解釈してからレイアウトを決めて
どの時点でどういう順番で表示するか保証はないんだぞ?
047145803/06/17 00:14ID:???
NNならちゃんと1文字ずつ出ました。
IEだと無理です。
047245803/06/17 00:17ID:???
うーんと、、、
1行ずつ表示する文字をdatなりに保存して読み出したいので、cgiがいいんですけどね〜。。
javaはソース見え見えなのがいやだなぁ。。
0473nobodyさん03/06/17 00:18ID:???
>>465
WinのIE6で1秒ずつ表示になるね
047445803/06/17 00:20ID:???
>>473
え???
俺、ローカル(Win)でやると、
あ<br>
い<br>
ってのが一気に表示されて、
レンタルサーバ(linux)だと、
ファイルのダウンロードになった
0475nobodyさん03/06/17 00:31ID:???
>>472
とりあえずJavaとJavaScriptは別モンだゴルァ!とお約束の突っ込み。

CGIでは、表示するぶんだけの文字列とそれを表示するためのJavaScriptを出力して
実際の表示はJavaScriptに委ねる、って意味なんだけど。
まあ、可能かどうかは分からんが。
0476nobodyさん03/06/17 00:39ID:fNA5EU9/
初心者の質問で申し訳無いのですが
foreach文の中で次のループに移るコマンド(for文のcontinueみたいなやつ)
はあるのでしょうか?
御教授くださいませ。
0477nobodyさん03/06/17 00:40ID:???
sage忘れスンマソン(;´Д`)
0478nobodyさん03/06/17 00:43ID:???
>>476
next

あとsageてもスレが下がるわけじゃないんで。
0479nobodyさん03/06/17 00:48ID:???
>>476
goto

あとsageてもスレが下がるわけじゃないんで。

0480nobodyさん03/06/17 00:50ID:???
>>478,>>479
即レスありがd。早速試してみます。
0481nobodyさん03/06/17 01:02ID:???
しかし何で一文字づつ表示させたいの?
まさか、CGIで よ う こ そ とか、下らない事やりたい訳じゃないよね。
JavascriptやFlashが無難だと思うけど・・・。
0482nobodyさん03/06/17 01:06ID:???
だよな
見るほうはさっさと表示されたほうがありがたいだろうに
自分のセンスでおもしろいカッコイイと思ってもみんながそうとは
0483nobodyさん03/06/17 01:08ID:3tOJ9ih6
皆さん目が悪いようなのでもう一度質問します。

SSIでCGIを呼び出そうとして失敗したときに
[an error occurred while processing this directive]
というエラー文が.sthmlファイルの中に出てくるんですが、
この文章を自由な文面に変更したり出来るんでしょうか?
出来ればリンクタグに変えたいんですが・・・
0484nobodyさん03/06/17 01:10ID:???
えっと、まずスレタイと>>1をどうぞ。
0485nobodyさん03/06/17 01:12ID:???
>>483
<!--#config errmsg="?????" -->
0486nobodyさん03/06/17 01:13ID:QhMbf/ik
globについて質問ですが、

my $file = '/dir/*';
my @list = glob("$file");

このようなイメージでglob内ワイルドカードを
変数化することは可能でしょうか。
0487nobodyさん03/06/17 01:22ID:???
>>486
>>1を読んで出直せ。答える必要なし。
0488nobodyさん03/06/17 01:22ID:???
>>486
そのやり方じゃダメなの?

それより、何でスカラー変数をいちいち "" で囲むんだろう。
たまにリストでそれやってハマってる人がいるけど、なんかそういう参考書があるのだろうか。
0489nobodyさん03/06/17 01:29ID:???
>>483
頭が悪いようなのではっきり言っておきます。
Perlに関係ないだろうが。
049048603/06/17 02:09ID:???
いや、ごめんなさい。

$file = '/dir/*';
my @list = <$file>;

はいかないのに

$file = 'dir/*';
my @list = </$file>;

はいったので、すごい疑問に感じ、ここでglobについて
質問させていただきました。
雰囲気を壊してしまいすみませんでした。
0491nobodyさん03/06/17 06:23ID:???
>>490
<$file>と書いた場合は、$fileがファイルハンドルと解釈されてるだけだよ。
<>演算子は、中身によって行入力になったりグロブ演算子になったりと、紛らわしい。
だからPerl5以降では、glob()を使ったほうがいい。
0492nobodyさん03/06/17 07:06ID:???
掲示板の記事削除処理において
ファイルを開き、記録された記事番号とパスワードを取りだし
入力されたパスワードと選択された記事をそれぞれ比較して
該当した記事以外を記録しなおすという処理を作ったんですが
いろいろいじってるうちになんだか変な動作するようになりました。
入力したパスワードが正しいとなぜが一番違いの記事のパスワードと比較します。
入力されたパスワードが間違ってると、その記事のパスワードと比較します。
何が悪いんでしょう?
0493nobodyさん03/06/17 07:07ID:???
foreach $line (@lines) {
$del = 0;
local($no,$key) = split(/,/,$line);
if( ( $FORM{'delete'} eq $key ) ){
if ( $no eq $FORM{'target'} ) {
$del = 1;
}
if ( $del == 0 ) {
push (@line2,$line);
}
}
else {
&error("キーが違います。");
}
}
049449203/06/17 07:08ID:???
493も俺です(´∀`;)
0495nobodyさん03/06/17 09:48ID:???
オブジェクト指向で書いているのですが、ファイルのラッパーのような
ものを作っています。その際、ファイルハンドルなどはインスタンスごとに
違うものにしたいのですが、どのようにすればよいのでしょうか?

滅茶苦茶な例なのですがC&Perlで言うと下のようなイメージでやりたいと思っています
my $seif = shift;
$self->{handle} = fopen( …
0496nobodyさん03/06/17 10:39ID:???
>>495
IO::File
0497>>49203/06/17 13:30ID:XeNVFdef
foreach $line (@lines)
{
  $del = 0;
  local($no,$key) = split(/,/,$line);
  if( ( $FORM{'delete'} eq $key ) ){
   if ( $no eq $FORM{'target'} ) {
    $del = 1;
   }
   if ( $del == 0 ) {
    push (@line2,$line);
   }
  }
  else {
   &error("キーが違います。");
  }
}

字下げくらいしろ。
見易さが違うだろうが。

っといいつつ、俺はPerlに関しては初心者だからまだ分からんがな。
今アクセスログやってんねや。んじゃ
0498nobodyさん03/06/17 13:36ID:???
>>492-493
その書き方はおかしいだろう。
記事番号$noはユニークだろうが、パスワード$keyは同じ値が
ありえるはず。
評価の順番が逆だ。
これでどうだ?

foreach $line (@lines) {
local($no, $key) = split(/,/,$line);
if ( $FORM{'target'} eq $no) {
if ( $FORM{'delete'} ne $key ) { &error("キーが違います。"); }
} else {
push (@line2, $line);
}
}

書き直しただけで、上記は再考の余地あり。
最初のほうで一致しても最後までループ処理が続いてしまって無駄。
0499新着03/06/17 14:12ID:nJC3WMH6
ホームページはこちら---> http://www.ecopig.jp/comucale/index.htm
0500nobodyさん03/06/17 14:23ID:???
質問です。
cryptの暗号化についてです。
cryptによる暗号化は、サーバーによって結果が異なるのでしょうか?
自分のローカル環境とinfoseekの鯖では同じ結果になったのに、
友人のFreeBSDの鯖では結果が異なりました。
ラクダ本も見てみたのですが、詳しく載ってないみたいで。

以下がソースです。
#!/usr/local/bin/perl

$salt = 'sa';
$key = 'hogehage';
$crypt = crypt($key,$salt);
print "Content-type: text/plain\r\n\r\n";
print "salt=$salt\n";
print "key=$key\n";
print "crypt=$crypt\n";

ローカルの結果が、
salt=sa
key=hogehage
crypt=saaqOoONNsWPU

友人の鯖での結果が、
salt=sa
key=hogehage
crypt=$1$sa$YaIYjBa3kyQD6Oqo6pfMi.

でした。
もし可能なら、暗号化した後の結果が同じにしたいのですが、
どなたか方法をご存知ないでしょうか?
0501nobodyさん03/06/17 14:34ID:???
というか、同じになったら暗号化にならないだろ。
0502nobodyさん03/06/17 14:37ID:???
同じ種と同じキーを使えば、同じ結果になるのがcryptではないんでしょうか?
0503nobodyさん03/06/17 14:40ID:???
>>500
cryptはOSによって暗号化のアルゴリズムが異なることがある
ttp://hasunuma.pobox.ne.jp/support/cyclamen.cgi?log=perl&tree=r18

こんなのを使う手もあるし
ttp://www.mikeneko.ne.jp/~lab/perl/des/
050450003/06/17 14:56ID:???
>503
どうやら友人の鯖ではMD5がなにか関係しているようですね。
ライブラリの紹介もありがとうございました。
試してみたところ、これを利用すれば同じ結果になりました。
ありがとうございました。
0505nobodyさん03/06/17 15:37ID:in7oUIeX
CSVを開いたあと、各行(@values)について、
$LOCATION[$values[0]] = {
"locationname" => $values[1],

としているのですが、


@locationlist = split(/_AND_/,$in{'locationid'});
#($in{'locationid'}は「1_AND_3_AND_7」のカタチで入ってきます。)
for($i = 0; $i <= $#locationlist; $i++){
  $HtmlLocationList .= $LOCATION[$locationlist[$i]]->{locationname} . "***":
}

で、表示されるのでが「***」の部分だけで、
$LOCATION[$locationlist[$i]]->{locationname}の部分が表示されません。
なぜなのでしょうか?
0506nobodyさん03/06/17 16:03ID:???
document.write("<font color="#FF9900">◆</font>リニューアルオープンいたしました!");
というものから、「<font color="#FF9900">◆</font>リニューアルオープンいたしました!」を取り出したいのですが、


$JSAll =~ m/document\.write\(\"(.*)\"\)\;)/;

で。$1を得ようとすると、
/document\.write\("(.*)"\);)/: unmatched () in regexp at index.cgi line 34.
といわれてしまいます。
どうしたらちゃんと動くのでしょう?
そもそも、 unmatched ()ってどういう意味なのでしょう?
0507nobodyさん03/06/17 16:37ID:???
>506
()の数があってない。
板違いだが、1行目のJSすらエラーだな。
0508nobodyさん03/06/17 16:37ID:AMyzcYWt
$str = 'document.write("<font color="#FF9900">◆</font>リニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
0509nobodyさん03/06/17 16:38ID:???
「2chからきました」ってコメントに書いたら値引きしちゃうよ(^_^)v
↓↓↓
 http://www.dvd-yuis.com/
0510nobodyさん03/06/17 16:41ID:vHbufOUB
$str = "abcdabcdef";
@array = split(/\t/, $str);

foreach $value (@array){
$flag = 0;
foreach (@result){
if($_ eq $value){ $flag = 1; }
}
if($flag == 0){
push(@result,$value);
}
}

重複した要素を除く処理を作ったんですけど無駄はありますか?
0511nobodyさん03/06/17 16:49ID:???
>510
ツッコミどころが多すぎてどこからつっこんでいいかわからん。
無駄以前に、思い通りの動作しないだろ。
0512nobodyさん03/06/17 16:51ID:???
>>506
エスケープしなきゃいけないんじゃないですか?
0513_03/06/17 16:51ID:???
http://homepage.mac.com/hiroyuki44/
0514nobodyさん03/06/17 16:51ID:???
>>512
誤射、すいません。
0515nobodyさん03/06/17 16:52ID:???
>>510
漏れもそんなに詳しいわけじゃないが、こんなんは駄目か?

$str = "abcdabcdef";
@array = split(/\t/, $str);

foreach $value (@array){
$hoge{$value} = '';
}

foreach $value(keys(%hoge)){
push(@data,$value);
}
0516nobodyさん03/06/17 17:19ID:???
$a = 'abcdabcdef';
@a = split(//,$a);
for (@a) {
$a{$_} += 1;
}
@a = sort keys %a;
0517nobodyさん03/06/17 17:26ID:vHbufOUB
>>511
いえ、します。

>>515-516
ちょっと試してみます。
0518nobodyさん03/06/17 17:33ID:???
>511
@resultはどこから沸いて出たんだ?
$strにタブがないのにタブで区切ってどうするんだ?
0519nobodyさん03/06/17 17:33ID:???
>518 =~ s/>511/>510/;
0520nobodyさん03/06/17 17:34ID:UJvendEv
>>510
その処理が、全体のパフォーマンスに影響するのかな?
影響しないなら、考えるのが無駄。
0521nobodyさん03/06/17 17:50ID:vHbufOUB
>518
@resultは宣言してないだけ、
タブが勝手に消えるのは2ちゃんねるの掲示板の仕様

>520
パフォーマンスのこともあるけど、
もっといい方法があるならそれを見て勉強になるし。
0522nobodyさん03/06/17 17:53ID:GIfprx1b
質問です。
サブルーチンのなかで、サブルーチン書くのはなんか悪いことありますか?
グローバル変数つかうのと、一連の処理をすべて、同じブロックに入れるのはどれがいいでしょうか?
0523nobodyさん03/06/17 18:16ID:vgoejlvM
すみませんが、
正規表現で使う「=~」の「~」つまりチルダですが、これってチルダでいいですか?
というのは私の持っている本ではこの波が真ん中に来ていて、チルダに見えないんですよ。
実際これはチルダで委員ですか?
0524nobodyさん03/06/17 18:27ID:???
>522
サブルーチンの中にあるサブルーチンを
どこか別のサブルーチンから呼び出す時に
面倒だ罠。
0525nobodyさん03/06/17 18:28ID:???
>>523
それはフォントの問題。どうしても心配ならキャラコード調べてみれば?
0526nobodyさん03/06/17 18:28ID:???
>>524
その同じブロックにある中から以外から呼ぶことはありません。
それならどうでしょうか?
052750603/06/17 18:31ID:???
>>507-508
ありがとうございます。

ところで、

$srt = 'document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;

print $str;
とやったのですが、
なんにもprintされません。確かに正規表現はあってるかと思うのですが・・・・・
わかるかたいらっしゃいますか?
0528everybody03/06/17 18:44ID:???
>>510
my %temp;
@a = grep !($temp{ $_ }++), @a;
0529nobodyさん03/06/17 18:56ID:???
>>526
local *hogehoge = sub {
return shift ** shift;
};
053052303/06/17 18:59ID:SJassQej
チルダでよかったんですね。
動きました。
別のところでエラってました。スマソ
0531nobodyさん03/06/17 19:00ID:???
ttp://ritsumei.s20.xrea.com/x/

ここの掲示板のソースみてみれ・・・ワラタ
0532nobodyさん03/06/17 19:24ID:???
チルダではなくティルデ
0533nobodyさん03/06/17 19:48ID:???
よくBEGIN not safe after errors--compilation aborted at index.cgi line 48
っていうエラーを見るんですが。

BEGIN not safe after errorsってどういう意味ですか?
0534nobodyさん03/06/17 19:58ID:???
>>529
その手があったか!?ありがとうございます。
それを、ブロック内で呼び出せば、その中の変数使えますよね。
0535670=67603/06/17 20:31ID:???
>>527
自分の書いたコードをよーく見てごらん。
ちなみに、「"」はメタ文字じゃないから、「\」はあってもなくてもいいよ。
0536nobodyさん03/06/17 20:39ID:???
535です。↑HNは前に別スレに書いたものが残っていただけです。

053752503/06/17 21:58ID:???
>>527

10回*30秒くらいみたのですが、わかりませんでした・・・
どうみても正しいようにしか見えないのですが、
どうしてこんな結果になるのでしょう・・・

どうか教えてください。。。
0538nobodyさん03/06/17 22:13ID:???
>>537
--- test.p ---
$srt = 'document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
print $str;
---
> perl -wc test.p
Name "main::srt" used only once: possible typo at test.p line 1.
test.p syntax OK
>
0539nobodyさん03/06/17 22:24ID:???
>>533
http://www.kt.rim.or.jp/~kbk/perl5.doc/perldiag.html
054045803/06/17 23:41ID:???
ほんとしつこいけどお願いします。
おっしゃられたとおり、私の環境がおかしいにしても、mt-load.cgiのは正常に表示されるんです。。
だれか、教えてくださいまし・・・・
0541nobodyさん03/06/17 23:48ID:???
>540
そのしつこさを別の方向に向ければいいのに。
正常に動くスクリプトがあるなら、いらない部分をガンガン削って、どの部分でそれを表現してるか調べてみるとかあるだろ。

レス遡るのもマンドクセ。
0542nobodyさん03/06/17 23:48ID:???
>>537
ソースを1文字ずつ声に出して読んでみれば分かる。

>>540
しつこいよ。
そのソースを解析すりゃいいだろう。
0543座敷荒氏03/06/17 23:50ID:NkO+IDyD
Perlでファイルの存在確認をして
Shellに結果を渡すようにしたいのです。

Perlでtestコマンドを実行してから結果を
どうやってShellに引き渡せばいいのでしょうか?

最終的には1ではなく100や255エラーを返すようにしたいのですが。
054452503/06/18 00:00ID:???
>>538
それは、たぶんですが、
文法は間違いないということですよね?


なぜ、$strが空になってしまうのか、教えていただけませんか?
(それともデバッガになれてないので勘違いしてるのかしら)
0545nobodyさん03/06/18 00:05ID:???
この板ってカスばっかだな
あってもない自分の脳内知識をお互いに自慢してる。
横から見てるとハライテーヨ
0546nobodyさん03/06/18 00:14ID:???
>>543
exit $error_number;
0547nobodyさん03/06/18 00:24ID:???
>>544
Name "main::srt" used only once: possible typo at test.p line 1.
(main パッケージの srt という名前の変数は一度しか使われていません。
誤字の可能性があります。(test.p の 1 行目))
054854703/06/18 00:29ID:???
>>544
s/の変数//;
0549nobodyさん03/06/18 00:39ID:???
>>544
なぜって……さっきからみんな指摘してるよ。
0550nobodyさん03/06/18 00:41ID:???
(≧∇≦)ぶぁっはっはっ!!まだ気がついてなかったのか

(・∀・)ノ" またあとで見に来るよん
055150603/06/18 01:07ID:???
ああああ、情けない。。。。
しかし、デバッガって便利なんですね。使ってみよう。
いままでKCatchしか使ってなかった。
■ このスレッドは過去ログ倉庫に格納されています