トップページ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
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しか使ってなかった。
0552nobodyさん03/06/18 01:15ID:???
|_・ ) ワカッタノカナ?
055350603/06/18 02:39ID:???
すいません、もう1ついいですか?
実は、「document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';」
というのは外部jsなんです。(SSIが使えないので、SSI Includeみたいに使おうとしている))

なので、↓の1行目で、jSファイルを読み込んでその文字列まるまるを返してます。
    $topics = &responce_filesubstance($PathTopicsJS);
    jcode::convert(\$topics, sjis);
    $topics =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
ところが、そうすると、
$topicsが「document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';」
のままで置換してくれなくなってしまいました。どうすればいいのでしょう?

一応、responce_filesubstanceも書いておきます。
sub responce_filesubstance{
    my($PathFile) = $_[0];
    my($filesubstance);
    #ファイルを開いて読み込む
    open (IN,$PathFile) or die "cannot open $PathFile:$!";
         flock(IN, 1);
            while($LineTmp = <IN>){
                $filesubstance = $filesubstance . $LineTmp;
            }
        close IN;
        &jcode::convert(\$filesubstance, "euc");
    #結果
    return $filesubstance;
}
0554nobodyさん03/06/18 02:45ID:???
>553
なんで外部JSをそのまま使わないの?
SSIなくても普通に使えるでしょ。
055550603/06/18 02:52ID:???
>>554
JSの中身を更新できるスキル?があれば十分なのですが、
HTML知らないお客さんに納品するものなので、
外部JSの中身をコンパネで動作できればなと、。
0556nobodyさん03/06/18 03:37ID:???
よくわかんないけど
置換する直前に$topicsを一度はき出して中身を確認したら?

eucに変換したモノをまたShift_jisに変換するのって意味あるのん?
0557nobodyさん03/06/18 03:42ID:???
>>555
>お客さんに納品
プロですか!?それで。
厨房かと思ってた。
055849203/06/18 06:06ID:???
>>497
半角スペースで入れたら字下げ消えた(´Д`)

>>497
ありがとう、確かに処理の順番逆だったね(´∀`)
で、やってみたころ
相変わらずエラー表示が出ます
変数を表示させたところ
パスワードはマッチするようになりましたが
0559nobodyさん03/06/18 09:34ID:???
半角スペースやタブが消えちゃうのはなぜ ?
消えないようにするには、どうすればいいの ?
0560nobodyさん03/06/18 10:18ID:???
   TEST
0561nobodyさん03/06/18 10:19ID:???
nbsp;で入るようだ。
全角でもいいけど、えらっちゃうしね。
スペースを 変換してくれれば楽なのに…。
056255503/06/18 10:44ID:???
>>557
すまそ。で、最近そんなもんじゃない?前任者はもっとだめだめだった。
0563nobodyさん03/06/18 10:54ID:???
ふと思ったのですが、JacaScriptで、SSI INCLUDEみたいに、
ファイルを読み込んでくれる関数はないですか?
0564nobodyさん03/06/18 11:42ID:???
>563
JavaScriptスレで聞いてこい。
0565nobodyさん03/06/18 15:43ID:???
>>563 JacaScript ?

>>563 JacaScript ?

>>563 JacaScript ?
0566nobodyさん03/06/18 15:57ID:yTFW11Gl
掲示板などのTDタグでWIDTH=”80”と指定して、そこに半角英数字を80
ピクセル以上書くと折り返し表示してくれなく、80ピクセル以上に
テーブルが伸びてしまいます。
全角文字や半角カナ文字は80ピクセル以上だと自動改行してくれるのに
半角英数字だと改行してくれないのはなぜなのでしょうか?
また、改行できる方法を知ってる方がいましたら教えてください。
0567nobodyさん03/06/18 16:01ID:???
>>566
あのさあ、何でこのスレで質問したのかをまず教えてくれない?
0568nobodyさん03/06/18 16:02ID:???
>>566
板違い
056956603/06/18 16:03ID:???
>>567
掲示板などのスクリプトの中にperlで
半角英数字が連続したときに自動改行してくれる
構文など有るんでしょうか、と書きたかったのです。すみません。
0570DBMのBSD DB(Berkeley DB)はMySQLより早いのか?03/06/18 16:04ID:kZ9NfMGd
http://www.ecopig.jp/comucale/index.htm
上記ダウンロードより
DBMのフィールドを自分で作る(分割する)と、
Berkeley DBは、MySQLより早いのか?
この件についてどなたか、教えて下頂けませんか?
0571nobodyさん03/06/18 16:05ID:???
>>566
板違いも甚だしくてワロタ
<td style="width: 80px;table-layout:fixed;">
とか。
ブラウザ依存だから期待せぬように。
0572 03/06/18 16:09ID:???
$_="TooLongLongLongString";
s/([a-zA-Z0-9\-_\?\.]{5})/$1\n/g;

かな。この場合5文字で改行。
0573nobodyさん03/06/18 16:34ID:???
違うと思うが
0574nobodyさん03/06/18 16:46ID:???
>>569
2バイト文字が混在した文字列を途中で分割するのはわりと面倒なので、
そういうのは普通ブラウザの表示に依存させてしまうことが多い。
んで、>>566の質問については板違いにつき、ここでは答えない。
0575nobodyさん03/06/18 17:45ID:???
system("ls");
で、得られたファイル名前、ディレクトリ名前を配列に代入したいんですが
どうすればいいでしょうか?
0576nobodyさん03/06/18 18:21ID:???
>>575
split(/\n/,`ls`);
0577nobodyさん03/06/18 19:49ID:fCn6DpDd
Cookieについてなんだけど、次の簡単なコードなんだけど、
IEだけが機能してくれない、Opera、Mozilaは問題ないんだけど、
誰かわかりません?、オナガイします、マジでひとつ。


#!/usr/bin/perl -w

print <<"END";
Content-type: text/html
Set-Cookie: DATA=0123456789; expires=Mon, 30-Dec-2020 23:59:59 GMT


END

foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"<br>\n";
}
0578nobodyさん03/06/18 19:57ID:???
while(1) {
print "ぬるぽ\n";
}
こんな感じに半角でインデントして、
>>578
自分へのアンカーをつけてポップアップで読む
0579nobodyさん03/06/18 20:10ID:???
>>577
>>1に書いてある3つの手順をちゃんと踏んでおくようにね。
あなたの場合、1番目と3番目が書いてない。
0580nobodyさん03/06/18 20:22ID:???
>>577
> Content-type: text/html
不要。
よってPerlとは関係なし。
逝って良し。
058144303/06/18 20:24ID:???
えっと、>>443です。
みなさん色々ありがとうございます。
2日間調べてやっと原因が解りました。
>>463さんが言ったようにサーバー側の設定の問題でした。
$ip = $ENV{'X_FORWARDED_FOR};に変えたら
ちゃんと違ったIPが取得できるようにました。
$useragent = $ENV{'HTTP_USER_AGENT'};でユーザーエージェントも
取得したんですが、私はWindows xpなのにWindows NTになっていました。
こういうもんなんでしょうか?
0582nobodyさん03/06/18 20:25ID:???
>>570
どっちが速いとかの問題じゃない訳で、設計しだいな訳で、Perlと関係ない訳で。
0583nobodyさん03/06/18 20:29ID:???
>>581
Operaだと2000とXPがちゃんと認識されます。
IEだと、2000はNT5.0、XPがNT5.1と識別されます。

って言う話だ。
確かめたわけじゃないが。
0584 03/06/18 20:39ID:???
http://dream.lib.net/room/
ここで配布してあるチャットの個人会話を覗き見する方法わかる?
ファイル名はわかってるんだけど、拡張子がCGIにされてるから見えない…
0585_03/06/18 20:45ID:???
http://homepage.mac.com/hiroyuki44/
0586nobodyさん03/06/18 20:48ID:???
>>584
無理。
0587nobodyさん03/06/18 20:56ID:???
>584
FTPでログを見る。
管理人にしかできないがな。
0588nobodyさん03/06/18 21:21ID:???
>>584
クラックする方法があったぞ、確か
0589nobodyさん03/06/18 21:50ID:???
てきすとの中にURLがある場合、URLに自動でリンクを張るにはどうすればいいのでしょうか?
(2chみたいに)

なお、テキストの中には、2つ以上URLがある可能性もあります。
0590nobodyさん03/06/18 21:59ID:???
>>589
置き換えろ、以上。
0591nobodyさん03/06/18 22:01ID:???
>>589
置き換えろや。
最後にgつけろ
■ このスレッドは過去ログ倉庫に格納されています