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

Perl コーディング初心者質問コーナー Part33

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

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0508nobodyさん04/03/16 14:40ID:DnhEtv1I
                  ∩
                 ( ⌒)    ∩_ _      /
         \        /,. ノ     i .,,E)  /
          \     / @@@  / /" /
            \  / / _、_ @ / ノ' /
  \\   あんたら\ (.  ノ` )/   /.|@@@
   \\\  @@@ \.∧∧∧∧/   |#_、_ @ 
    (⌒\@# _、_@  <    母  >  |  ノ` ) PERLばっか
     \ ヽヽ(  ノ`)   <   者  >   |. ^    やってないで
      (mJ  ^ ⌒\ <    の  > と )   
 ─────────< 予    >───────────
   @@@         < 感    >       @@@ OK。,;⌒⌒i.
 @#_、_ @        < !!!    >     @#_、_ @⌒ヽ(   ;;;;;)
  (  ノ`)         /∨∨∨∨\     (  ノ`)  と)
 /|| ^ ||\.      / @@@    \  /⌒ ^ |   |.| |/ |;,ノ
  〈|゚ ̄ ゚̄|  トントン./ @  _、_ @.    \ イ    (    )| / .,i
  ヽii__リ /     /     (  ノ` ) 私の   \   / V ̄V | | ,,i;
   ._ヽ||)とノ ̄/    / ^   \    時代が \  \,,,丶,  | |,,,;
    .ililili二l/     /    / ̄ ̄ ̄ ̄/       .\  \   ,,   
           __(__ニつ/  FMV  /__
               \/____/

0509nobodyさん04/03/16 14:41ID:DnhEtv1I
                     /__;;;;;;;;;;;;;;;;;;;;;` '''- 、
                  ,,.=''";;;//ミ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ
                 /;;;;;;;/彡'⌒ヽ!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;'、
                 ,';;;;;;;//〃   l;;;;l'、;;;;;;;;;;;;;;;;;;;;;;;;;;;',
                 ,';;;;;;;;|/〃    '、;! '、;;;ヾ;;;;;;;;;;;;;;;;;;;',
                ,';;;;;;;;;;l〃-=、,,   ヾ、ヾ、ヾ;;;;;;;;;;;;;;;;;!
               /;;;;;;;;;;;;;;ヽ斗≡ミト''゛  ゞ≦气ミ 〉;;;;;;;;;;;!
               {;;;;;;;;;;;;;;;;;;;', ゞ;;;;'゙ `  |!  ';;;;シ/;;;;;;;;;;;;;;} 俺が今日からお前達をコーチすることになった宗方仁だ!
               ヾ;;;;;;;;;;;;;;;;;;',        ||    !;;;;;;;;;;;;;;ノ >>3、立て!コートで休むな!
                 !;;;;;;;;;;;;;;;リ       _!!    !/;;;;;;;;;/ >>4、膝のタメが甘ァいッ!
                !;;;;;;;l;;;;;;/     /::i     /;;;;;;;ノ >>5、腰が引けてる!
                ';;;;;;;|;;;;;/    ,. -ニ-、   f;;;;;;;/ >>6、部外者は口を出すな!
                 >;;;l;;;;∧   `ー ‐‐'    !;;;;;/ >>7-1000、ダッシュ100回! 5セット!
                ,ノ:.:`ル'   >--、  ̄   /;;;ノ
        _____,,,. -‐''":.:.:.:.:.:.ヽ /r/7/ \  ,, イ/;/!
      //:.:.:.:.>、ヽ ヽ:.:.:.:.::/_/77/ } /`´  /シ:.:.:.:.ヽ、
     /l /:.:./:./:.ヽ:.ヽ  >' _/777/  ./    /|´!:.:.:.:.:.:.:.ヽ、
   /:.:.:l l/:./:.:.:.:.:.:.:';.:.:>' _/7777/ } /   / ヽ|:.:.:.:.:./,.-`l
    |:.:./l l/:.:.:.:ヽ、:.:.:./ _/7777/  ./     ,'  !:.:.:.:/ /!  ト、
   !:/://:.:.:.:.:.:.:.:.:.:.>' _/777777/ } ∧    !  !l:.:./ /、|  |:.::',
0510nobodyさん04/03/16 14:42ID:DnhEtv1I

     ___
    /     \     ________
   /   ∧ ∧ \  /
  |     ・ ・   | < さぁてパソコンしか脳のないPERLでも作るか
  |     )●(  |  \________
  \     ー   ノ
    \____/
   /      \
  |        \ ____
   | \ \     //      //
  |  \ \   //      //
  |   \ \ //      //
  |     \ ○―――――)
  | | ̄ ̄ ̄ ̄匚 ̄ ̄ ̄ ̄ ̄|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄



0511nobodyさん04/03/16 14:43ID:DnhEtv1I

          /       ヾ''"         ~`ヽ
         /       _,,,...  ヽ;:  /""ヽ     ヽ
        /         ;'"  "\ l /;:;;:::-'''ヽ,   i
       /         /::::::::-'''''"~        ヽ,   .|
      /        /;:;;:::'''           ヽ  ヽ
      |         |                ヽ  |  
      /        ;/      、        ,/ ヽ  i,   
     /        ;:;:ヽ      \,      /   ヽ  i, 
     i          / )(     \, 、  ,/ ,   ヽ ヽ 
     |          |  ⌒ ,,___\l,::,l/___|  |  
     |          |.    ー-ゞ'-'">><ー-ゞ'-'"'|  |  
     |         ;:|        '""^     、   |  |  
      |         ヽ.        ゝ( ,-、 ,:‐、)  |  | 
      |       /ヾ..       /       ヽ  |  | 
      |          |       ./ゝ二ニニニニ二、  |  |  
..       |        `、ヽ     へ"\┼┼┼ノ/  /  |   
        |         ヽ\     `\ ̄ ̄ ̄ノ  /  |  
        |          l  `ー-::、_  " ̄ ̄" ,,..'|ヽ./    
        ヽ.        :人     /`ー――'''''  /    
        /;:;:;:;;:;:;: _/         
                わ し の パンチ5分の2をくらっておい で
 
                      何 さ ら し と ん じ ゃ キ サ マ ラ

0512nobodyさん04/03/16 14:46ID:???
うぉ、久々だな
0513nobodyさん04/03/16 15:35ID:???
小学生がこんなスレに来たんですか?
0514nobodyさん04/03/16 15:41ID:???
春厨の時期ですね〜
0515nobodyさん04/03/16 16:14ID:???
>>513-514は新参かしら。
0516nobodyさん04/03/16 16:45ID:VuQW4BOK
ご意見、御指導お願いします。

HP宣伝掲示板を設置しているのですが、
何度もしつこく投稿してくるサイトのURLを
拒否設定にして、「そのURLは投稿できませんよ」
と、表示させているのですがしつこく登録を試みてきます。
で、拒否表示ではなく、ロケーションなどを使って
空白のページに飛ばすか、500エラーを返すか
どっちが効果的か悩んでいるのですが、
皆さんはこういう場合、どうされますか?
051748704/03/16 17:24ID:???
for (0..500000){
$buf = "abc=def";
$buf =~ tr/&=/\0/;
%in = split(/\0/,$buf);
}

for (0..500000){
$buf = "abc=def";
foreach (split(/&/,$buf)) {
($n,$v)=split(/=/);
$in{$n} = $v;
}
}

foreachの方が1.2倍以上早かった。
日本語だったりするともっと差が出そうだ。

データの取り方はこんな感じでいいですか。
0518nobodyさん04/03/16 17:37ID:???
>>516

 こ こ は コ ー デ ィ ン グ の ス レ で す
0519nobodyさん04/03/16 19:05ID:???
>>516
403
0520nobodyさん04/03/16 19:13ID:???
>>517
それで本当に比較できてると思うか?
まあ、好きなように納得してもいいけど
052151704/03/16 20:10ID:???
・・・Benchmarkモジュールなるものがあるのか

データはたくさん取りましたが。
0522nobodyさん04/03/16 20:21ID:???
>>521
間違ったデータを集めたって意味ないだろ。
たったあれだけの短い>>517のコードのどこが無意味かさえわからない?
0523nobodyさん04/03/16 22:15ID:???
DBMファイルを扱おうかと思うんですが、
SDBM, GDBM など色々あって正直何を使えばいいのかわかりません…。
それぞれのメリットデメリットは何があるのでしょうか?

試しに、SDBM, GDBM を使ってみたところ、
SDBM は pag と dir ファイルが生成されて、ファイルサイズは 1024 バイト。
GDBM は、ファイル名を指定できて、ファイルサイズは何もデータが入っていなくても 12288 バイトのものができました。
GDBM についてはデータを増やすと、それに比例してファイルサイズも増えていくみたいです。(12288バイト以下には絶対ならない)

これって、ちょっとしたデータに使う場合は、GDBMだと毎回10Kくらいのファイルが作られちゃうってことなのでしょうか?
また、SDBMは、1KB以上のデータは扱えないのでしょうか?扱うとどうなるのでしょうか?

Perl のバージョンは5.6、OSはLinuxです。
0524nobodyさん04/03/16 22:41ID:???
>>523
http://perldoc.com/perl5.8.0/lib/AnyDBM_File.html
http://perldoc.jp/docs/modules/BerkeleyDB-0.20/BerkeleyDB.pod

個人的には、多機能で制限の少ない DB_File をよく使う。
レコードサイズが 1KB で充分で、どんなサーバで使うか
分からないような時は使える可能性が高い SDBM を選ぶ。
052552304/03/16 22:53ID:GOniTDMI
>>524
レスありがとう。

DB_File がなんとなくよさそうな気がしてきました。
(比較表が抽象的でいまいちわかりませんでした…)

それと、DBMファイルは全部ロック機能はサポートしているのでしょうか?
GDBM は自動で flock がかかると聞いたことがありますが。。。
0526nobodyさん04/03/17 04:19ID:???
欲しい情報を見つけることが出来なかったので、
ご存じの方がいましたら教えていただきたいのですが。

perlスクリプト中のperl呼び出し時に起動オプション[-w]を付けて書いています。
そうしても処理結果自体は欲しい結果が得られるのですが、
警告文として、以下のものが出力されます。

警告文
Use of uninitialized value in string eq at test.cgi line 10.
Use of uninitialized value in string eq at test.cgi line 52.

該当スクリプト記述
10 : if ($ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($form{'key'} eq '')

http://www.att.or.jp/perl/man/perldiag.1.html
ここの情報で未定義値を初期化しないで使用しているという
原因までは解ったのですが、if文のeqに対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。

この問題の解決方法をどなかたご教授下さい。
0527nobodyさん04/03/17 06:34ID:???
>>526
if (defined $ENV{REQUEST_METHOD} && $ENV{REQUEST_METHOD} eq 'POST'){
0528nobodyさん04/03/17 08:37ID:???
ちょっと質問です。
perlのソートを使おうとしているんですが、微妙に意味が分からない事になりました。

sort {$a <=> $b} @aaa;

数字を並べる時、この書きかたが一般的だと思うのですが、
$aと$bってなんでしょう。
「イツのまに、なにが代入されたのでしょうか?」←これが質問1。

で、実際のソートは、返ってくる数字「-1」「0」「1」の三種類によってsortが返すリストの順番だと思ったのですが、
「それは正解ですか?」←質問2

もし、正解ならば「-1」「0」「1」の三種類が発生する形式ならば可能ですか?
それとも、必ず「$a」「$b」を使うような形式にする必要がありますか?←質問3

詰まる所、$aと$bの中身がよく分からないので、sort自体がよく分からない物になってしまってます。
m(__)m
0529nobodyさん04/03/17 08:49ID:???
$aiueo = "1■2■■■3■4■5■■■";
@values = split(/■/, $aiueo);
$i = 0;
foreach $value (@values){
 if($value eq ""){
  @values[$i] = "NULL";
 }
 print "$i : @values[$i]\n";
 $i++;
}
これを実行すると、
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
こう表示されます。
しかし、最後の5以降はsplitでは無視されてしまうようです。
自分としては
0 : 1
1 : 2
2 : NULL
3 : NULL
4 : 3
5 : 4
6 : NULL
7 : NULL
8 : NULL
としたいのですが可能でしょうか。
0530nobodyさん04/03/17 09:29ID:???
PerlのDBIを使って、MySQLを操作しようとしています。
書籍やインターネットでやり方を調べていく中で、次のような
注意事項が記載しているものを見つけました。

1:$dbh = DBI->connect(****);
2:$sth = $dbh->prepare(*****);
3:$sth->execute();
4:$sth->finish();
5:$sth = $dbh->prepare(*****);
6:$sth->execute();
7:$sth->finish();
8:$dbh->disconnect();
の様に一回のDBコネクション中で2回のコマンド発行を
するときは、一回目(上記2〜4)と二回目(上記5〜7)で
ハンドル変数名を変えなければならない(例えば5〜7は
$sthではなく、$sth2にする)というものです。

自分の環境下の簡単なプログラム中では問題なく
動いているのですが、本当に注意すべき内容なのでしょうか?
0531nobodyさん04/03/17 10:03ID:???
>>528
こっちはあんたの質問がよく分からんよ…

物凄く簡単に言うと、リストから2つ取り出して$a、$bに代入されて { } 内を呼び出すというのを
何回も繰り返すのがsortの基本動作。
$a、$bってのはこの名前で決まってるから変更できない。
{ } 内では -1、0、1 のどれかを返しさえすればどんな式だっていい。
$a、$bを参照しなくてもかまわないけど、それじゃソートを使う意味がまったくない。
0532nobodyさん04/03/17 10:20ID:???
>>528
http://perldoc.com/perl5.8.0/pod/func/sort.html
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_sort_SUBNAME_LIST

>>529
http://perldoc.com/perl5.8.0/pod/func/split.html
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_split__PATTERN__EXPR_LIMIT

>>530
http://pc2.2ch.net/test/read.cgi/php/1015943725/
0533nobodyさん04/03/17 10:31ID:???
>>530
そんなの注意すべき点でもなんでもない。
その糞情報のソースを晒せ。
0534199☆04/03/17 11:00ID:???
The Wars of Roses を設置してるんですが、キャラ作成後
エラー、ファイルが開けませんって出ます。
助けてください
0535nobodyさん04/03/17 11:13ID:???
すいません、リストの取り出しについてなんですが
@list = (A,B,C,D,E,F);
ってのがあって
EとFだけ取り出して別の配列に入れたい
場合ってのはどうやってやればいいんでしょうか
0536nobodyさん04/03/17 11:16ID:???
>535
http://www5a.biglobe.ne.jp/~n_rieko/perl/3.htm
0537nobodyさん04/03/17 11:27ID:???
%hash = (
    element1 => [ 1, 2 ,3, 4, 5],
    element2 => [ 3, 4 ],
    element3 => [ 5, 6 ],
);

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

for ($i=0; $i<= (@hash{"element1"} -1) ;$i++){
    print $hash{"element1"}[$i] . "<br>";
}

てっいうスクリプトがあるんですが、

$i<= (@hash{"element1"} -1)
の部分、リファレンスに関する知識が乏しいために、
苦し紛れに書いていて、見苦しいです。
もっとスマートに($#などを使って?)書くには
どうすればいいのでしょうか?

というか、こういう場合、普通、
$i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?
0538nobodyさん04/03/17 11:35ID:8yt30+/4
>>535

foreach(@data) {
if($_ eq ("E" || "F")) {
push(@tmp,$_); next;
}
push(@new,$_);
}

print @tmp;
print @new;
053950104/03/17 11:39ID:???
>>537
> てっいうスクリプトがあるんですが、

ホントか?あるのか?
@hash{"element1"}って何表わしてる?
ホント動いた?

> $i<= (@hash{"element1"} -1) の部分はどうやって書くもんなのでしょうか?

$i < @{$hash{"element1"}}
0540nobodyさん04/03/17 11:39ID:8yt30+/4
訂正

foreach(@list) {
if(($_ eq "E") || ($_ eq "F")) {
push(@tmp,$_); next;
}
push(@new,$_);
}
0541nobodyさん04/03/17 11:41ID:8yt30+/4
ちょっと気になったんだけど

$_の値がEもしくはFだったら
というifの書き方だけど

if(($_ eq "E") || ($_ eq "F"))

以外にいい方法ない?
0542nobodyさん04/03/17 11:44ID:???
>>422>>424
亀レスでスマソ
http://216.239.53.104/search?q=cache:xeL-yvLnImUJ:member.nifty.ne.jp/hippo2000/perltips/Cgi.htm+cgi.pm+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%80%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA&hl=ja&ie=UTF-8

-private_tempfiles
CGI.pmはアップロードされたファイルを処理することができます。
通常、アップロードされたファイルはテンポラリ・ディレクトリに
スプールされ、処理が終ると削除されます。
しかし、これには「ファイル・アップロード」セクションでも説明
しているように盗聴の危険性があります。
それが秘密の情報であっても、アップロードの途中に他のCGIスクリプト
の作者が覗き見ることができます。
UNIXシステムでは、-private_tempfilesプラグマは、テンポラリ・ファイル
を開かれると、何かデータが書込まれる前に、すぐに削除されるようにします。
これにより盗聴の危険性を減らしますが、完全ではなりません。
(まだ潜在的に可能な状態です)アタッカーに厳しく対応するためには、
プログラムは一時ファイル名をやって来たHTTTPヘッダの32ビットチェックサム
を計算することで選択します。
0543nobodyさん04/03/17 11:45ID:???
>>422>>424
続き〜

一時ファイルが他のCGIスクリプトが読むことが出来ないことを保証するには、
スクリプトを実行するためにsuEXEC または CGI ラッパを使ってください。
一時ファイルはモード 0600(ワールドもグループも読むことが出来ない)で
作成されます。

一時ディレクトリは以下のアルゴリズムを使って選択されます:

1. 現在のユーザ(例えば"nobody")がホーム・ディレクトリに"tmp"と
いうディレクトリを持っていれば、それを使います(Unixシステムのみ)

2. 環境変数TMPDIRがあれば、示された場所を使います

3. そうでなければ、以下の場所を当たります /usr/tmp, /var/tmp, C:\temp,
/tmp, /temp, ::Temporary Items, and \WWW_ROOT.

それぞれの場所はそれがディレクトリであるか、書きこみ可能かをチェックされます。そうでなければアルゴリズムは次の選択を挑戦します。
0544nobodyさん04/03/17 11:46ID:???
>>541
> if(($_ eq "E") || ($_ eq "F"))
foreach $list(@list) {
if(grep{$list eq $_ }qw(E F)) {
push(@tmp,); next;
}
push(@new,$list);
}

比較対照を動的にできる
054554404/03/17 11:47ID:???
>>544
push(@tmp,$list); next;

ね
0546nobodyさん04/03/17 11:48ID:???
なるほど。THX。
0547nobodyさん04/03/17 12:00ID:???
>>529
($values[0], $values[1], ・・・・ $values[8]) = split(/■/, $aiueo);
0548nobodyさん04/03/17 12:05ID:???
「他のサーバーのCGIの出力結果を自分のサーバーのCGIで受け取る方法」
についてお聞きしていいでしょうか。

一方は自分の所有するレンタルサーバーで、すでにCGIを幾つか設置してあるのです。
もし、フリーのHP(ここではisweb)のCGIから自分のサーバーのCGIを呼び出す、
いわばスクリプトの流用ができれば作業も楽だし
iswebのサーバーにも余計な負担がかからなくて良いかなと思って試しています。

レンタル鯖のCGIは今は単にテキストデータを処理してprintで画面に出力するだけです。
具体的にはshowdat.cgiでlog.datの内容を整形して1行ずつ書き出しています。
この、動的に出力された整形済みのデータを他のHPから呼び出し、CGIで利用したいのです。
レンタル鯖のほうで整形済データをfixedlog.dat等に書き込んでからそれを外部から読むのではなく、

�@iswebのreaddat.cgiにアクセス
�Aiswebのreaddat.cgiの内部で、レンタル鯖のshowdat.cgiにアクセス
�Bレンタル鯖のshowdat.cgiが動作し、レンタル鯖のlog.datの内容を整形して返り値とする
�C返り値をiswebのreaddat.cgiが受け取り、表示する
という流れなのですが・・・・・・
054954804/03/17 12:05ID:???
(↓続き)
上の�Aの所が方法がわからず、
readdat.cgi内で

open(LDAT, "<http://rentalhost/showlog.cgi") || die "file open error!";
while(my $line = <LDAT>) {
print $line;
}
close(LDAT);

としてみたのですがうまくいきませんでした。外部のサーバーのものに限らず、
「CGI内でCGIにアクセス」というのはどう実現するものなのでしょうか?

質問が長くなって申し訳ないのですが、ヒントだけでもよいのでどなたかお願いします。
0550nobodyさん04/03/17 12:06ID:???
今一度確認するが、ネタだろ?
0551nobodyさん04/03/17 12:13ID:???
>>549
�@iswebのreaddat.cgiにアクセス
�Aiswebのreaddat.cgiがshowdat.cgiを叩く
�Bレンタル鯖のshowdat.cgiがlog.datの内容を整形してそいつをGET/POSTでreaddat.cgiを叩く
�Cパラメータ受け取ってiswebのreaddat.cgiが表示する

だろな
0552nobodyさん04/03/17 12:32ID:???
今一度確認するが、それもネタだろ?
055354804/03/17 12:39ID:???
>>551さん
まさにそれです、

>GET/POSTでreaddat.cgiを叩く

この部分が方法がわからず困っています・・・
iswebのフォームからaction=http://rentalhost/showlog.cgiとする手もあるのですが、
一度isweb内の独自のCGIに通して追加処理をしてから表示させたいのです。。
使う関数名だけでもいいので、教えていただけないでしょうか。

>>550552
ネタではないです・・・。
0554nobodyさん04/03/17 12:39ID:???
すごいのが沸いてきたな。
0555nobodyさん04/03/17 12:40ID:???
LWP
0556nobodyさん04/03/17 12:45ID:???
>>544
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o
0557nobodyさん04/03/17 12:55ID:???
CGIで他の鯖と読み書きの質問ってちょくちょく出るな。
実際に動かせる鯖はかなり限られると言うのに。
0558nobodyさん04/03/17 13:06ID:???
>>553
�@iswebのreaddat.cgiにアクセス
�Aiswebのreaddat.cgiが空フレームを作りそこにshowdat.cgiを表示

どだ?
あ、という事はreaddat.htmlでいいじゃん
055954804/03/17 13:41ID:???
>>558
どうもです。しかしフレーム内に表示させるだけでなく、
受け取ったデータをisweb側のCGIで追加処理させたいのです。。

>>555
LWPはソケット通信のモジュールだったでしょうか。
POST/GETについて調べていて今、
ttp://tohoho.wakusei.ne.jp/lng/200003/00030338.htm
というのを見つけたのですが、>>551にあるGET/POSTもソケットが前提だとすると、
方法はソケットに限るという事になるでしょうか・・・
0560nobodyさん04/03/17 14:04ID:???
iswebはソケット禁止(使えない)
0561t04/03/17 14:09ID:???
d
0562nobodyさん04/03/17 14:44ID:???
これって意味あるでしょうか?
open に失敗したら、自作のルーチンに引数でエラー文字列を渡したいんですが、
もしかすると、open に失敗した時点で die してしまうので print_error にすらいかないのでしょうか?

myopen( FH, 'test.txt' ) or print_error( $! );

sub myopen( $$ ) {
open( $_[0], $_[1] ) or return;
close( $_[0] );
}

sub print_error( $ ) {
print $_[0];
exit;
}
0563nobodyさん04/03/17 15:33ID:???
if (open FH, 'text') { close FH; }
else { print_error($!); }

#perlって括弧なしで書けたっけ?
0564nobodyさん04/03/17 15:46ID:???
>562
そう書くならmyopenでtrueなりfalseなりを返さないといかんのでは?
0565nobodyさん04/03/17 16:50ID:llxz20WZ
失礼します。
質問の内容がこちらで適切かどうか判断しかねるのですが…

トップページでクッキー及びセッションIDを設定、
クッキー及びIPで、トップで一括して荒らしのアクセス拒否をして、
セッションで中に直接飛べないようにしようとしています。

クッキーの設定の部分について質問なのですが、
---------------------------------------------------
print "Content-type: text/html\n";

if (length($str_cookie) == 0) {
  $str_cookie = (gethostbyaddr(pack("C4", split(/\./, $ENV{'REMOTE_ADDR'})), 2) . time);
  print "Set-Cookie: クッキー名=クッキーデータ; expires=Thu, 1-Jan-2030 00:00:00 GMT; path=/cgi-bin;\n";
}

print "Set-Cookie: セッション名=セッションデータ; path=/cgi-bin;\n";
---------------------------------------------------
以上のようにすると、
http://www.どこか.com/cgi-bin/index.cgi
という形でアクセスしたときにはうまく動作するのですが、
http://www.どこか.com/cgi-bin/
でアクセスするとクッキー及びセッションが発行されません。
これは、パスの設定の仕方が悪いのでしょうか?
0566nobodyさん04/03/17 17:58ID:???
>>565
コーディングと関係ないと思います。
056796504/03/17 18:35ID:???
>>566
うう・・すみません
混乱から醒めて、冷静に見たら関係ないですね。。
よく見たら初心者質問スレってのがあったので、移動します。
失礼しました。
0568nobodyさん04/03/17 20:20ID:???
なんか、やたらと質問的な書き込みが増えたな……。

>>534
放置されてるのはわかってるんだが、一言だけ。
「二度と来るな」

まあ、それだけじゃアレなんで。
「作った奴に聞け」
0569nobodyさん04/03/17 23:23ID:???
>>529
@values = grep{ $_ ne '■' } split(/(■)/, $aiueo);

>>541
(・ε・)キニシナイ!!
0570nobodyさん04/03/17 23:50ID:???
>>541
いいかどうか分からないけど

if(/^(E|F)$/)
0571nobodyさん04/03/17 23:53ID:???
>>568
                ・・
Perl コーディング初心者質問コーナー Part33
0572nobodyさん04/03/18 00:16ID:???
>>562
dieしてないじゃん。それでok。
057356804/03/18 01:12ID:???
>>571
いやま、そのとおりなんだが。

すまん、活発になったのが気になったようだ。
0574nobodyさん04/03/18 10:13ID:imQmJK7b
質問いいでしょうか。
number<TAB>name<TAB>mail<TAB>text
というタブ区切りのデータがあります。
これらのnumberの部分だけを取り込みたいのですが、
open(DATA, "<$log");
@data=<DATA>;
foreach $temp (@data){
 ($number,$name,$mail,$text)=split(/\t/,$temp);
}
このように書くと、$numberしか使わないのですが、他の変数も生成してしまい、
perl -cwでチェックすると怒られます。
こういう場合はどのように記述したらいいのでしょうか?
0575nobodyさん04/03/18 10:23ID:???
($number) = split(/\t/,$temp);
でよろし
0576nobodyさん04/03/18 10:29ID:???
>>575氏
うまく動きました。
レス感謝です。
0577nobodyさん04/03/18 10:53ID:???
>>576

ちなみに、
$mail = (split(/\t/,$temp))[2];
とすれば任意のパーツ取り出し可能。
0578nobodyさん04/03/18 11:46ID:DQQyLTpV
ちんなみに
($num, undef, undef, undef) = split...
でもok
0579nobodyさん04/03/18 12:39ID:???
わ、こんなにもレスが。>>574,576です。
ご親切に有難うございます。

$mail = (split(/\t/,$temp))[2];
($num, undef, undef, undef) = split...

どちらも便利そうな使い方なので、よく覚えておきます。
058057104/03/18 13:35ID:???
>>573
ごめんなさい、こっちも冗談なんで気にしないで下さい。
0581nobodyさん04/03/18 14:01ID:???
春だなあ・・
0582nobodyさん04/03/18 14:05ID:???
↑その発言が一番春っぽいがな
0583nobodyさん04/03/18 14:43ID:???

   こ こ ま で 春

--------------------------
0584nobodyさん04/03/18 15:20ID:???
>>581=>>583
自演乙
0585nobodyさん04/03/18 16:36ID:imQmJK7b
>>584
プププププ
0586nobodyさん04/03/18 19:10ID:LItTEfZF
>>584

プププププヴァーカ
0587nobodyさん04/03/18 20:03ID:msXg0fxA
>>584
プゲラゲラッチョ( ´,_ゝ`)
0588nobodyさん04/03/18 20:57ID:???
いやぁ〜春ですね(w
0589nobodyさん04/03/18 21:09ID:???
>574-579
splitの第3引数をきちんと設定すると余計な処理が減るからサーバーに優しい。
数が明確なら第3引数をしっかり渡す事を勧める。
0590nobodyさん04/03/18 21:17ID:???
>>589
>余計な処理が減るから
すまん、解説キボンヌ。

$mail = (split(/\t/,$temp))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp);

これでも下のコードのほうがいいってこと?
0591nobodyさん04/03/18 21:25ID:???
>590
なんのこっちゃ。

$mail = (split(/\t/, $temp, 4))[2];

の様にすれば良いってだけかと。
第三引数に最大分割数を指定できるって話ね。

059257704/03/18 21:26ID:???
>>590
> これでも下のコードのほうがいいってこと?

splitの第三引数、って言ってるじゃん
$mail = (split(/\t/,$temp,4))[2];
(undef, undef, $mail, undef) = split(/\t/,$temp,4);
だよ
分けるのは四つだ、と明示できるなら明示せよ、ということ
0593nobodyさん04/03/18 21:26ID:???
数は数えられるよな?
第「3」引数。

$mail = (split(/\t/,$temp,4))[2];
こうすると、splitは4分割で処理を終了する。
全ての場合で早くなるとは限らないが、ほぼ全ての状況で早くなる。

まぁ>574みたいに確実に行の戦闘にあるなら、substringとindex使った方が速いんだろうが。
0594nobodyさん04/03/18 21:36ID:???
ケコーン(AA略
0595nobodyさん04/03/18 21:42ID:???
use Benchmark;
my $str = "number\tname\tmail\ttext";
timethese(1000000,{'TEST1'=>'&test1($str);','TEST2'=>'&test2($str);','TEST3'=>'&test3($str);','TEST4'=>'&test4($str);','TEST5'=>'&test5($str);','TEST6'=>'&test6($str);', });
sub test1{
my $str = shift;
my ($number,$name,$mail,$text) = split(/\t/,$str);
}
sub test2{
my $str = shift;
my ($number,undef) = split(/\t/,$str,2);
}
sub test3{
my $str = shift;
my $number = (split(/\t/,$temp,2))[0];
}
sub test4{
my $str = shift;
my $number = substr($str,0,index($str,"\t"));
}
sub test5{
my $str = shift;
$str =~ /^([^\t]+)/;
my $number = $str;
}
sub test6{
my $str = shift;
$str =~ /^(.*?)\t/;
my $number = $str;
}
0596nobodyさん04/03/18 21:42ID:???
Benchmark: timing 1000000 iterations of TEST1, TEST2, TEST3, TEST4, TEST5, TEST6...
TEST1: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 332889.48/s (n=1000000)
TEST2: 4 wallclock secs ( 2.46 usr + 0.00 sys = 2.46 CPU) @ 406008.93/s (n=1000000)
TEST3: 3 wallclock secs ( 2.54 usr + 0.00 sys = 2.54 CPU) @ 393236.34/s (n=1000000)
TEST4: 2 wallclock secs ( 2.30 usr + 0.00 sys = 2.30 CPU) @ 434216.24/s (n=1000000)
TEST5: 1 wallclock secs ( 2.01 usr + 0.00 sys = 2.01 CPU) @ 496770.99/s (n=1000000)
TEST6: 1 wallclock secs ( 1.93 usr + 0.00 sys = 1.93 CPU) @ 517063.08/s (n=1000000)

正規表現も使い方次第で速くなるのな。
0597nobodyさん04/03/18 22:25ID:???
>>574です。色々なお話を有難うございます。
今自分がやっているのはログをsplitで分割するだけなので、
「この行を全部タブがある部分で区切れ」よりも、
一行に存在するタブで区切られたデータの個数はわかっているので、
「この行にはタブで区切られたデータが4つあるから4つに区切れ」というように、
指定可能ならばsplitの第三引数を渡した方がいいということですね。
0598nobodyさん04/03/18 22:47ID:???
> 正規表現も使い方次第で速くなるのな。

貴殿には「詳説 正規表現 (オライリー)」を薦める
0599nobodyさん04/03/18 22:50ID:???
>>595
splitは/\s/で切ると、速度が出るよ。
0600nobodyさん04/03/18 22:52ID:???
フォームから入力した文字列をjcode.plで変換して、
そのままhoge.txtにprintするのって危ないですか?

ファイル名は time() の値にする予定です。
0601nobodyさん04/03/18 23:09ID:???
>>600
ぶっちゃけ、意味わかんね。
0602nobodyさん04/03/18 23:34ID:???
言葉足らずですみません。

フォームから入力した文字列をjcode.plでsjisに変換したものを
$text として、

$file = time().'.txt';

open(FILE, ">$file") || error('open error');
print FILE $text;
close(FILE);

とする予定です。
ファイル名を決める部分を'.html'にするとブラクラやウイルスなどの危険性があるので
'.txt'としたのですが、'.txt'にしてもやはりウイルスなどの危険性があるのでしょうか。
0603nobodyさん04/03/18 23:40ID:v217X1kZ
( ゚д゚)ポカーン
0604nobodyさん04/03/18 23:45ID:???
ありません!大丈夫です!
0605nobodyさん04/03/18 23:47ID:???
結局何を聞きたいのかがわからない。
サニタイズの話なのか、ファイル名の話なのか。

HTMLを解釈するブラウザでそのまま開くつもりなら、
<と>を実体参照に置き換えるのが手軽。
コーディング方法としては単純で、単純にs///で置き換えれば良い。

ファイル名なんてのはそんなの好きにすれば良いと思うってかここで聞く事じゃない。
拡張子なんてどうでも良い。ファイルの中身が問題だろう。
#質問内容とは違うけどtime()だと同時投稿されるとファイル名が被るという問題が

公開しない、自分が読むためだけのコメント投稿フォームでも作ってるのか?
0606nobodyさん04/03/18 23:47ID:???
>>604
ありがとうございます
0607nobodyさん04/03/18 23:58ID:???
IEで閲覧すると、中身で判断して表示するから、
HTMLタグが含まれるだけで、HTMLとして表示してくれるよ。
0608nobodyさん04/03/18 23:59ID:???
>>605
テキスト投稿CGIを作ろうとしています。
投稿者がテキストを投稿したら、time().txtで保存、
同時にindex.htmlにテキストへのリンクを付け足す、という流れです。

普通の掲示板の場合<と>の置換をしていたのですが、
txtの場合実体参照などがそのまま&gt;などと表示されるので、
置換作業は一切行わないことにしました。
ですが、やはりtxtを表示するのもブラウザである以上、
悪意を持った何者かが何か細工すればブラクラ程度に機能してしまうのでは、
と不安になり質問しました。
■ このスレッドは過去ログ倉庫に格納されています