【Perl】初心者コーナー Part18

このエントリーをはてなブックマークに追加
1nobodyさん
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

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

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
2nobodyさん:02/11/20 22:05 ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 知らん
Part15 http://pc.2ch.net/test/read.cgi/php/1028816385/
Part16 http://pc.2ch.net/test/read.cgi/php/1032070299/
part17 http://pc.2ch.net/test/read.cgi/php/1034583844/

[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
3nobodyさん:02/11/20 22:07 ID:???
perl -F, -ane 'print @F[2];' kyoto.csv
とすると表示されますが、
perl -F, -ane 'print @F[4];' kyoto.html.csv
……
perl -F, -ane 'print @F[10];' kyoto.html.csv
は表示されません。perlって●を認識するのでしょうか?
4nobodyさん <sage>:02/11/20 22:29 ID:???
>>3
●って何よ。

5nobodyさん:02/11/20 22:33 ID:???
前すれ>>991
Socketを使わないとむりぽ。
がむばってネ。
6前スレ991:02/11/20 22:46 ID:/E1Vbwsz
>>5 ありがとうございます。

あと、いきなり出て来て1000取ってすいません・・・。
7nobodyさん:02/11/21 00:06 ID:???
>>3
前スレで答えた者だが、HTML(と、変換したCSV)はSJISだろ?
"\x81\x9c"を代わりに書けばよし。
87:02/11/21 00:20 ID:???
ちなみに答えは多分683(自然なんちゃら)と126(ビオ)だと思う。
9nobodyさん:02/11/21 00:42 ID:???
>>前スレ991
LWP::Simpleモジュールが入っているなら
perldoc lwpcookして出てくる文書読んでみるとやり方出てるよ。

use LWP::Simple;
getstore "http//:www.yahoo.co.jp", "yahoo.html";
みたいな感じ。
10nobodyさん:02/11/21 00:49 ID:izFT1sBO
  ┏━━━━━┓    ┏━┓┏┳┓            ┏━┓      ┏┳┓
  ┃          ┃┏━┛  ┗┫┃┃            ┃  ┃┏━┓┃┃┃
  ┗━┳━    ┃┃        ┗╋┛┏━━━━┓┗━┛┃  ┃┃┃┃
      ┃      ┃┗━┓  ┏━┛  ┃        ┃      ┃  ┃┃┃┃
      ┃  ┏━┛┏┓┃  ┃┏┓  ┗━━━━┛┏━━┛  ┃┗┻┛
    、 ┃  ┃    ┃┃┃  ┃┃┃    .‘; ゜  ・  ┃        ┃
    、 ┃  ┃    ┃┃┃  ┃┃┃    .‘; ゜  ・  ┃        ┃┏┳┓
      ┗━┛ ” ;┗┛┗━┛┗┛   ノ      ┗━━━━┛┗┻┛
      ∧_∧    ヽ(。、::。.::・'゜・' )〆     .'  ,   
     (  ゚∀゚)__ ( 。、 ::。 ).。::  θ)  .∴ '     
     r'⌒ ̄ ̄ ̄ ̄ (。、::。.::・'゜。'゜ )ゝ|    ・,‘ 
     |   ̄ ̄ ̄ ̄ ) ヘ( 。、 ::。 )ヽ | |      ←>>1
     \   │     ’ Υ  γ  | | 
       ヽ   │     ⊂.J|     ) し`⊃ ヾ 
       (    ヽ       |  ||  |   
        \  \\     |  |.|  |   
          \  ヽ ヽ   ( 丶(  \
            > ノ ノ     \ \\ \
          / /| /       )  \. )  \
         / // /         (_/ .(_/
        /__// /__
      〈_ __〉 _ __〉
11nobodyさん:02/11/21 18:30 ID:La3b0kHh
perlで「#」を変数名に普通に使えるのでしょうか?
例:$#hogehoge
12nobodyさん:02/11/21 18:52 ID:???
>>11
使えない。
$#hoge は配列 @hoge の最後のインデックス値。

Perl で変数名に使えるのは英数字とアンダーバー。
ただし $ に続く一文字目が数字の場合、
変数名はすべて数字でなくてはならない。

で、あってる?
13nobodyさん:02/11/21 19:33 ID:???
>>12
変数名に数字って使えたっけ?
14nobodyさん:02/11/21 19:37 ID:???
>>12
やってみれ。

$hoge1ならいけるだろ?
15nobodyさん:02/11/22 16:14 ID:UpQRYD34
質問です。2桁の整数値、たとえば
"01","09","01","21"
"01090121"
としたいのです。各値は実は日付で整数演算で日付の
更新を行っていますが、更新されたあとの数字を繋げると
"19121"
のように整数2桁にはなりません。
どうしたらよいのでしょうか?
16nobodyさん:02/11/22 16:40 ID:???
my $ctg_id_ = $CTG_ID;
my @ctg_ids = ();
while (length($ctg_id_) > 1) {
push (@ctg_ids,$ctg_id_);
chop $ctg_id_;
}

------------

$CTG_ID = 'MK0010'

@ctg_ids = (MK0010,MK001,MK00,MK0,MK)

というコードを一行にしてください。

17nobodyさん:02/11/22 16:57 ID:???
>>15
意味がまったく解りません。

数値と数字の違いとか理解してる?
18nobodyさん:02/11/22 17:11 ID:???
>>15
配列だとしたら、
@array = ("01","09","01","21");
join('', @array);

それ以外なら sprintf で %02d のフォーマットで出力すれば良。
19nobodyさん:02/11/22 17:28 ID:UwQQAcbp
西暦と月を算出しようとしているのですがうまくいきません。
わかっているのは現在の西暦と月($nowYear、$nowMon)で、
ユーザーから与えられるのはページ番号($pg)とします。
1ページに 3ヶ月まとめて表示します。

未来については問題ないのですが、過去を表示させようとすると
「/12」でやっているのでマイナス値が出せません。
もっと効率のよい式はないでしょうか?

-------------------------
$nowYear = 2002;
$nowMon = 11;
$pg = 0;

foreach $i ( 0 .. 2 ){
$mon = ($nowMon + $i + $pg * 3) % 12 + 1;
$year = $nowYear + int((($nowMon + $i) + ($pg * 3) -1) / 12);
print "$year / $mon\n";
}
-------------------------
2015:02/11/22 19:48 ID:UpQRYD34
>>18
ありがとう。解決しました。
21nobodyさん:02/11/22 20:55 ID:???
>16
my $ctg_id_ = $CTG_ID; my @ctg_ids = (); while (length($ctg_id_) > 1) { push (@ctg_ids,$ctg_id_); chop $ctg_id_; } ------------ $CTG_ID = 'MK0010' ↓ @ctg_ids = (MK0010,MK001,MK00,MK0,MK)
22rubyist@カラアゲうまうま:02/11/22 20:58 ID:???
( ´,_ゝ`)プッ
2323:02/11/22 23:11 ID:???
perlopに載っている「s/\$(\w+)/${$1}/g;」の勉強なのですが

@data = (taro ,Jiro, Sabro);
@temp = ('$b');
foreach $b(@data){
foreach $c(@temp){
$c =~s/\$(\w+)/${$1}/g;
print $c;
}
}

とやって、ほんとは「taroJiroSabro」と表示したいんですが
「tarotarotaro」となってしまいます。
どうすればいいのでしょう

2423:02/11/22 23:13 ID:???
perlopに載っている「s/\$(\w+)/${$1}/g;」の勉強なのですが

@data = (taro ,Jiro, Sabro);
@temp = ('$b');
foreach $b(@data){
foreach $c(@temp){
$c =~s/\$(\w+)/${$1}/g;
print $c;
}
}

とやって、ほんとは「taroJiroSabro」と表示したいんですが
「tarotarotaro」となってしまいます。
どうすればいいのでしょう

25nobodyさん:02/11/23 00:16 ID:TlwVHlkv
(-_-;)
26nobodyさん:02/11/23 00:51 ID:???
>>23
$temp[0]の中身を'taro'に置換したんだからそれ以後はマッチしないかと。
27nobodyさん:02/11/23 00:56 ID:???
なるほど。

$c =~s/\$(\w+)/${$1}/g; は止めて
print eval $c;
なら「taroJiroSabro」になりました。
でもこれって正しいやり方なんですかね
28nobodyさん:02/11/23 05:29 ID:???
open(F, "+< xxx.txt");
だとxxx.txtは自動生成されないので直前に
open(F, "xxx.txt");
を入れようとしましたけど、その場合直後でcloseすべきですか?
となるとflockも必要ですか?
ていうか煩雑なのでもっとスマートなやり方はないですか?
29nobodyさん:02/11/23 08:44 ID:???
>>28
open F, "+>>xxx.txt" or die;
seek F, 0, 0;
3019:02/11/23 10:38 ID:???
>>19
ttp://www.din.or.jp/~ohzaki/perl.htm#Date2WDay
の方法で use Time::Local; することにしました。
3128:02/11/23 13:53 ID:???
>>29
+>>なんて初めて見ますた。
flockを使う上で一番安全ぽいと思われたのでわざわざ+<を使っていたわけですが
+>>てのは具体的にどんな動作するんでしょか。
32nobodyさん:02/11/23 21:45 ID:???
教えてください
CGIで、フォームのデータを%inにしまってあって、
それをJcodeモジュールで片っ端からコード変換したいのですが
全部のキーに対して変換をかけるとエラー吐かれますた…
んで、次にgetcodeでsjis、euc、jisの時のみ変換をかけるようにしたのですが
フォームの中にラジヲボタンとかがあり、配列のリファレンスに対して
getcodeしようとするとエラーを吐かれてしまい、困ってます

全部変換しようとする>エラー
日本語だけ変換>コードをゲトしる>エラー

これ以上おヴァカな自分には対処方が思いつきません、どうか御教授くださいませ…
33rubyist@カラアゲうまうま:02/11/23 21:49 ID:???
エラーメッセージも書かずにお願いするのがperlユーザの典型
34nobodyさん:02/11/23 22:35 ID:???
すみませんでした

ちょっと自分で検証ミスが有ったようで、なんかgetcodeはできるぽでした…
その後の処理が上手くいってないのかもです

[Jcode.pm:575:die] Not a SCALAR reference at C:/Perl/site/lib/Jcode.pm line 575, <DATA> line 1579.
上記のエラーが出てました…

ラジヲボタンのフォームとか場合によってリファレンスだったり普通の値だったりしてわけわかんない・゚・(ノД`)・゚・
35nobodyさん:02/11/23 22:54 ID:zBuUfsU+
ファイル存在確認の
if (-e $a)
なんですが
ファイルをOpenするとかなりパフォーマンスは悪くなりますよね?
これも悪くなるのでしょうか?
36nobodyさん:02/11/24 00:05 ID:???
>>32
%in に格納するときに変換する
37nobodyさん:02/11/24 04:22 ID:???
>>35

ならない。stat(2) を使うから。

# open にしてもそれ程遅いわけではないと思うが。
38nobodyさん:02/11/24 15:36 ID:???
>>32
>>36
cgi-lib.plかなんかを使っているのではないかと想像してみる。
まあ、自分のやったことを全部言わない>>32がアレなんだが。
39nobodyさん:02/11/24 15:57 ID:???
if ($hoge){〜;} と if ($hoge ne '') {〜;}

上記の場合は、どちらを使うのが普通なのでしょうか?
40 ◆hMJAPH9PWA :02/11/24 16:06 ID:???
>>39
用途が違うからなんとも…。
例えば、変数の中身が'0'だと前者は偽、後者は真になるよ。
41nobodyさん:02/11/24 23:11 ID:???
>>38
じゃ、refで分岐処理
4223:02/11/25 00:00 ID:???
>>23
自己レスです。

@data = (taro ,Jiro, Sabro);
@temp = ("\$b", $b ,$b);
foreach $b(@data){
foreach $c(@temp){
$d = $c;
$d =~s/\$(\w+)/${$1}/g;
print $d;
}
}

こうすれば、ちゃんとtaroJiroSabroになりました。
43.32:02/11/25 17:33 ID:???
すみません、質問の仕方がトコトン悪かったようで

>>36
すみません、勉強不足なようでわかりません

>>38
CGI::Lite使ってまつ

>>41
Σ(´Д`;)そんな関数があたのか…

いろいろヒントいただきましたので、がんがってみます、ありがとうございました
4438:02/11/26 00:49 ID:???
>>32
CGI::Lite の使い方を最初から勉強しなおせ。
悪いことは言わないからさ。

そもそも、「%inにフォームのデータをしまって」あるのがわかっているなら、
いつ%inに格納したのかわかるだろうに。
45nobodyさん:02/11/26 16:45 ID:Y+XqV5xb
これからperlを使ってデーターベースを構築しようと思うのですが、
これからやるならDBは何を使えばいいんでしょうか。
他のスレ読むと、PostgresSQL+Pg.pmよりもDBIを使えとかいろいろ書いてありましたが
初めてなのでよくわからないです。実際はPg.pmというのを使ってる人が多いみたいですし。
いい方向へ誘導してください。

追伸:InterBaseってどうなのですか?
46nobodyさん:02/11/26 17:25 ID:???
Pg.pm はデータベースではない。
47.32:02/11/26 20:09 ID:???
>>44
わかりますた、勉強しなおしまつ…
英語読めねぇよウワァァァァン
48nobodyさん :02/11/26 21:48 ID:???
perlで外部ファイルから変数を読み込むことができる
bashのsourceコマンドみたいなものってないのでしょうか?
49nobodyさん:02/11/26 21:53 ID:???
>>48
require
50nobodyさん:02/11/26 22:24 ID:kEoHEjhG
http://www.1-one-town.com/wakanavi/sptkan.cgi
ここみたいに、Enterキー押した時は認証しないのに
loginボタンをクリックした時は何故かCGIに認証しに行きます。

Enterキー押した時も認証しに行くようにするには
どうすればいいんでしょうか?
51nobodyさん:02/11/26 22:29 ID:???
>>51
ボタンの値を見ておいてどうすれば?もないもんだ。
passの値だけで判断しろ。
5250:02/11/26 22:33 ID:kEoHEjhG
>>51
ボタンの値を見ておいて・・・というとどういう事ですか?
フォームタグではなくてCGI側の問題ですか?
53アシトン?:02/11/26 22:43 ID:???
>>50
aciton=
54nobodyさん:02/11/26 22:54 ID:???
アシトンワロタ
5550:02/11/26 22:54 ID:kEoHEjhG
>>53
た、たしかにスペルは間違ってますが、、、

でもクリックだと認証に飛びますけどね・・
56nobodyさん:02/11/26 23:03 ID:???
>>55
それはブラウザ依存だ。
IEの場合、formタグのaction属性がない場合、action属性を自分自身に設定する。
だから、クリックだと自分自身に飛ぶ。
57nobodyさん:02/11/26 23:07 ID:???
>>55
クリックすると、type="submit" のnameとvalueが渡される。Enterキーだと
それが渡されない。
だから、type="password" のほうのnameとvalueだけ見て処理しろと>>51
言っている。
5850:02/11/26 23:08 ID:kEoHEjhG
>>57
なるほど、分かりました。
どうもすみません
59nobodyさん:02/11/26 23:11 ID:???
>>45
Perlでデータベースを扱おうと思ったら、その仲立ちをするモジュールを使うのが楽でいい。
Pg.pmはPostgreSQLとの接続専用のモジュール。
だが、DBI.pmとPostgreSQL用のDBDの組み合わせでも同じことができる。
(細かいやり方は違うだろうが)

同じことをするのに二つのモジュールを使うのは無駄だと思うかも知れないが、
こうしておくと、将来別のデータベースを使わなければならなくなった時に、
DBDを差し替えて、スクリプトをちょっと(多分一行)だけ変更すれば、
そのまま動くようになると言う利点がある。

これからの生涯でずっとPostgreSQLしか使わないと言うのであれば構わないが、
そうでなければ、DBI.pmを使うことを勧める。

ま、どっちを選ぼうが自由なんだがな。
60nobodyさん:02/11/26 23:28 ID:???
すんません、PalmOSで動くPerlってないですか?やっぱ
61nobodyさん:02/11/27 00:38 ID:???
6260:02/11/27 01:46 ID:???
>>61
全然順調じゃないじゃん




ぇゃ、ほんと有り難うございますた、なんかスゲェ質素なページでしたが(藁
検索しても引っかからなかったんですけどねぇ…
完成を心待ちにしときます
63nobodyさん:02/11/27 09:27 ID:???
awk '$1 >=130 && $1 <=170 && $2 >=30 && $2 <=60 {print $0}' tmp1 > $ofile

perl -F" " -ane 'if($F[1] >=130 && $F[1] <=170 && $F[2] >=30 && $F[2] <=60) {print $_;} tmp1 > $ofile

perl -F" " -i.ofile -ane 'if($F[1] >=130 && $F[1] <=170 && $F[2] >=30 && $F[2] <=60) {print $_;} tmp1
はどれが一番速いのですか?


64nobodyさん:02/11/27 10:37 ID:???
#!/bin/csh
set min = `awk '$3 <= 0.9 {print $0}' aho.txt | sort +1 -n | head -n 1`
echo min[1]

foreach time ( 90621)
  ifile = hoge${time}.txt
  set gyou = `awk '$1 == '$time' {print NR}' date.txt`

  awk 'NR >= '$gyou' && NR <= ('$gyou' + 80) {print $0}' date.txt > tmpA
  paste $ifile tmpA > tmpB
  awk '( NR % 2 ) == 0 {print $0}' tmpB > tmpC
  set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`

  if ( $gyousu == 40 ) then
       set temae = 40
  else if ( $gyousu < 40 ) then
       set aaa = `awk '$5 < 0 {print NR}' tmpC | head -n 1`
       set temae = `awk 'NR < '$aaa' {print $0}' tmpC | wc -l`
  endif
  echo $temae
end
65nobodyさん:02/11/27 10:41 ID:???

set min = `awk '$3 <= 0.9 {print $0}' aho.txt | sort +1 -n | head -n 1`
echo min[1]

set gyou = `awk '$1 == '$time' {print NR}' date.txt`

awk 'NR >= '$gyou' && NR <= ('$gyou' + 80) {print $0}' date.txt > tmpA
paste $ifile tmpA > tmpB
awk '( NR % 2 ) == 0 {print $0}' tmpB > tmpC
set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`

をそれぞれperlで書くとどのような感じになりますか?

いいかげんな感じでいいので、perlの構文教えてください。
調べてたら、卒論かけません。

本来のcshスクリプトでは
foreach time ( 90621 90609 90521 90509 83021 83009 81821 81809 81721 81709 81621 81609 81521 81509 80821 80809 80721 80709 80621 80609 80521 8050
9 80421 80409 80221 80209 72921 72909 72821 72809 72721 72709 72621 72609 62121 62109 61021 61009 60921 60909 60821 60809 52209 50521 50509 50421
50409 50321 50309 50221 50209 50121 50109 43021 )
となっており、このスクリプトでは遅すぎて、話しになりません

アフォですみません。
66nobodyさん:02/11/27 10:51 ID:???
20021231
という、YYYYMMDDという日付データがあった場合に、
「今日からあと何日でその日が来るか」を算出するのにはどうしたらいいのでしょうか。
6766:02/11/27 10:55 ID:???
あと、
例えば、20020631という日付データがあって、
その日から3ヶ月後は何日か求めたい時はどうすればいいですか。
普通に20020931にしても、9月は31日が無いかもしれないですし、
うるう年とかで2月は28日だったり29日だったりしますよね。。
68nobodyさん:02/11/27 10:56 ID:???
卒業しなくて良いよ。
69nobodyさん:02/11/27 11:04 ID:???
>66
timelocal()を使うと楽。

>67
じゃあ、8月31日の3ヵ月後の11月31日が存在しなかった場合はどうするの?
なかった場合どうするかを先に決めないと何もできない。
7066:02/11/27 11:24 ID:???
>>69
11月31日が存在しなかったら次の日の12月1日になると思います。
71nobodyさん:02/11/27 11:30 ID:???
>70
なると思いますじゃねーだろ。
どういう仕様にしたいか決めないと出来ないってんだよ。
72nobodyさん:02/11/27 11:32 ID:???
んで、
>70は>66-67みたいな事がしたくて
それでどんな風にやってみて、
それだとどんなエラーが出て上手く行かなかった
んだ?

自分で何もせずにやり方聞いてるわけじゃないよな?
>1読め。
73nobodyさん:02/11/27 11:33 ID:???
>>71
オマエのほうが勘違いしてないか? よく読め
74nobodyさん:02/11/27 12:01 ID:???
掲示板から入力した文字データの文字数を数えて、
その文字数分、処理をループさせたいのですが、
これだと何も出来ませんでした…。

要するに、入力されたひらがな($tango)を、
ローマ字に変えてファイルに書き込みたいって事なんですが…。

$mojisu = length $tango;
while ( $x < $mojisu ){
$moji = substr($tango,$x,2);
if ($moji = "あ"){print $romaji "a"};
         ・
         ・
         ・
$x = $x+2;
}
75nobodyさん:02/11/27 12:16 ID:???
>>74
文字コードは?
76nobodyさん:02/11/27 12:20 ID:???
>74
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
これ参考にしてみ。
77nobodyさん:02/11/27 12:22 ID:???
>>74
$tango =~ s/あ/a/g;
$tango =~ s/い/i/g;
ずら〜っとコレじゃダメですか?
でも、「っ」とかって大変そう・・・
後に来る文字で変わるでしょ・・・
78nobodyさん:02/11/27 12:24 ID:???
>>74
($moji = "あ") じゃダメだろ
基礎から勉強しなおせ
79nobodyさん:02/11/27 16:24 ID:???
>>74
それじゃ$mojiに"あ"を代入してから$mojiを評価してるぞ(よーするに真になる
80nobodyさん:02/11/27 17:38 ID:37dF+px+
\x82\xb3\x82\xa0\x82\xc7\x82\xa4
って文字コードになってるファイルがあるんですが
コレを元の文字に置換するようなやつはどのように書けばいいんでしょうか?
81nobodyさん:02/11/27 17:46 ID:???
ネタ
82nobodyさん:02/11/27 19:08 ID:???
どいつもこいつも、教えんのは善意だぞ、聞く香具師が偉そうにスンナヴォケ!

一生独りでシコってろ!!
83nobodyさん:02/11/27 21:43 ID:???

ドピュッ

84nobodyさん:02/11/27 22:06 ID:Op374sN2
1296(10進表示)までの数値を、36進法のリストにして、参照できるようにしたいのですが、

$in = 500;   #10進法で入力された数値
for($i = 1;$i < 1297;$i++){
    $c[$i] = $h.$j++;
    if($j eq "10"){$j = "a";}
    elsif($j eq "aa"){$j = "0";
    $h++;
    if($h eq "10"){$h = "a";}
    }
}
$out = $c[$in];    #36進法で出力される数値

効率のいいコードはないでしょうか?
85nobodyさん:02/11/27 22:42 ID:wgGugnNo
$in = 500;

$after = array('0','1','2','3','4','5'..........'z');
$a = floor($in /36);
$b = $in % 36;

$out = $after[$a].$after[$b];

echo $out;
8685:02/11/27 22:45 ID:wgGugnNo
ゴメン。Perlだったか。

$in = 500;
@after = qw(0 1 2 3 ... z);

$a = int($in / 36);
$b = $in % 36;

$out = $atter[$a].$after[$b];
8784:02/11/27 22:54 ID:???
>>85
なんとなくわかりました。Perlにしてやってみます。
8884:02/11/27 22:56 ID:???
>>86
あ、ありがとうございます!
考えてたら>>86が遅レスになってしまいました・・・
感謝です!!
89nobodyさん:02/11/27 23:01 ID:XpHW8B1z
$in = 500;

$out = (0..9,a..z)[int($in/36)] . (0..9,a..z)[$in%36];
9084:02/11/27 23:11 ID:???
>>88
すいません日本語おかしいですね。
とにかく感謝です

>>89
ありがとうございます!!
すごく効率的ですね
91nobodyさん:02/11/27 23:17 ID:???
効率的って。。。
92nobodyさん:02/11/27 23:28 ID:???
codeがみじけぇってこったろ
93nobodyさん:02/11/28 00:49 ID:???
(・∀・)タンショウ!!
94nobodyさん:02/11/28 07:22 ID:???
(・∀・)ホケーイ!
9574:02/11/28 11:13 ID:???
皆さんのレスとても参考になりました。
今のところ全くの初心者なものでご迷惑をお掛けしました。
とりあえず>>77さんのやり方で出来ました。
「っ」や「ゅ」等については後で考えます。
皆さんありがとうございました。
96nobodyさん:02/11/28 12:20 ID:AB88ovMQ
すいません。環境変数が存在するか無いかを判定したいのですが
どうしたら良いでしょうか?
if( $env(HTTP_REFERER) == NULL)
流石にこれじゃだめっすよね…
97nobodyさん:02/11/28 12:39 ID:???
if ($ENV{'HTTP_REFERER'} eq '')
98nobodyさん:02/11/28 12:40 ID:9pvjX8Vy
>>96
unless( $ENV{HTTP_REFERER} ) {
.
}
99nobodyさん:02/11/28 12:40 ID:FjFqkJQz
if(exists $ENV{HTTP_REFFERER})
ではだめでつか?
100nobodyさん:02/11/28 12:46 ID:???
>>99
存在していても、値がないかもしれん。。。

>>98
このばやいはそれでもいいが、値が 0 の環境変数には適さない。。。
101nobodyさん:02/11/28 13:00 ID:???
>>97
値が''の環境変数には適さない。。。
102nobodyさん:02/11/28 13:06 ID:???
>>101
103nobodyさん:02/11/28 13:17 ID:n94VkAjj
if (defined %ENV) {...}
104nobodyさん:02/11/28 13:16 ID:???
>>100
>環境変数が存在するか無いかを判定したいのですが
というお題なので、exists でいいんじゃないか?
0や''を検出するなら、まず仕様を決めてもらわんと。
10596:02/11/28 13:22 ID:cubtANrC
レスありがとうございます。
CGIを重複で利用したいので
フォームからアクセスしたときと表示するだけでアクセスした時
に分けたかったんです。
フォームからアクセスした時にはQUERYなりCONTENT?なりに
残るじゃないですか。
それを判別したかったんです。
いろいろ御意見ありがとです。。
106nobodyさん:02/11/28 13:24 ID:???
ttp://xx.alpha-sv.com/vf4/cgi/update_ar.cgi
上のCGIが作りたいのですが、どうすればいいですか?
初心者なうえに知識がないんで…
教えてください。
107nobodyさん:02/11/28 13:41 ID:n94VkAjj
>>106
該当するweb管理者にお問い合わせ下さい。
108nobodyさん:02/11/28 14:47 ID:???
>107
業務口調ワラタ
109nobodyさん:02/11/29 02:18 ID:???
>>106
初心者に掲示板の制作は無理だから諦めれ。

(余談だけど、初心者って掲示板の設置のことを「作り方」って聞くときがあるんだよなー)
110nobodyさん:02/11/29 11:03 ID:YJ7YkLxM
お願いします。
文字列を一定の長さまで比較したいんですけど
標準関数ありますか?
Cでいえばstrncmpみたいなものです。
できれば、今後自力で調べる方法も教えて頂けないでしょうか。
111nobodyさん:02/11/29 12:26 ID:???
if (substr($s1, 0, 1) eq substr($s2, 0, 1)){ hoge; }
112nobodyさん:02/11/29 17:54 ID:nCXK5uR+
「DBI.pm」の「pm」って何??モジュール化されてるってこと?
メモリ上にロードされっぱなしになって速度が速くなったりするの?

あと、自分のperlソースをpmにすることはできますか?

webで調べたけど情報が無かったです。
113nobodyさん:02/11/29 18:04 ID:???
>>112
> webで調べたけど情報が無かったです。
http://www.kt.rim.or.jp/~ekbk/perl5.005/perlmod.html
114nobodyさん:02/11/29 18:08 ID:FGwKAXnr
例(1)
print <<HERE
テスト
HERE;

例(2)
print "テスト";

例(1)と例(2)ではどちらが表示が速いでしょうか?
115nobodyさん:02/11/29 18:28 ID:???
winXP pro + activeperl build 633で実験
●ソース
use Benchmark;
timethese(1000000,{
'ex1'=>sub {
print "テスト\n";
},
'ex2'=>sub {
print << "EOM";
テスト
EOM
}
});
●結果
Benchmark: timing 1000000 iterations of ex1, ex2...
ex1: 40 wallclock secs ( 5.84 usr + 5.25 sys = 11.09 CPU) @ 90203.86/s (n=1000000)
ex2: 49 wallclock secs ( 6.26 usr + 5.56 sys = 11.82 CPU) @ 84631.01/s (n=1000000)
●結論
気にするほどの差はない
116:02/11/29 20:42 ID:vqpWO9fR
>>112
> 「DBI.pm」の「pm」って何??モジュール化されてるってこと?

単なるファイル名。use を使ったとき、名前+".pm" で読み込むくらいです。
普通中身はモジュールのための構造を持たせるけど、別に何か規定されてるわけじゃない。
---
俺的ポータルサイトを作ろう
http://mysite.ddo.jp/
117nobodyさん:02/11/29 22:23 ID:JObUfqd/
現在実行中のコードの行番号を調べることってできますか?
118nobodyさん:02/11/29 22:23 ID:lYLiGnC/
ABCADEAFGAHI
という文字列があったとして、
例えば3つ目のA以降の文字列を除去するにはどうすればいいでしょうか。
この文字列の場合、
ABCADEA
まで残したいのですが。。。(あるいはABCADEまで
119nobodyさん:02/11/29 22:40 ID:???
>>118
s/(ABCADEA)FGAHI/$1/;
(w
120nobodyさん:02/11/29 23:00 ID:JObUfqd/
/^([^A]*(?:A[^A]*){3})/ ? $1 : '';
121117:02/11/29 23:06 ID:JObUfqd/
hoge.plから&error;

とかすると、

sub error {
の中で、
error:line 333 in hoge.pl
とか出したいんですが。
&errorは、hoge.plからrequireします。
122nobodyさん:02/11/29 23:13 ID:???
!user/local/bin/perl -C
とかで簡単にコンパイルできたらなぁ
123nobodyさん:02/11/29 23:13 ID:???
&error(__LINE__);

sub error{
die "error: line $_[0] in $0";
}
124nobodyさん:02/11/29 23:55 ID:???
>>121
KCatch.pmとかの併用をおすすめする。
125nobodyさん:02/11/30 00:52 ID:???
googleのように、キーワードがあるとあるタグではさんで
テキスト内のどこにキーワードがあるか一見してわかるような
プログラムを作っているのですが、

jcode::convert(\$_, 'euc', "", "z");
jcode::convert(\$word, 'euc', "", "z");
$_ =~ s/$word/<XX>$word</XX>/; #(XXは任意のタグ)

とするとどうしてもうまく置き換えられずに化けてしまう
文字があります(主に全角のカナ)。
処理は入力をすべてEUCにコンバートしてから行っています。
化けてしまう原因が分かりません。
置き換え時の文字化けというのは避けられないのでしょうか?
126nobodyさん:02/11/30 00:55 ID:???
文字コードの自動判別がうまくいってない?
127nobodyさん:02/11/30 00:58 ID:???
>>125
情報すくなすぎ。
具体的に$_と$word それぞれがどういう入力のときにうまく
いかないのか。jcode::convertした時点で化けているのか、
置き換えたときに化けてしまうのか。
128125:02/11/30 03:00 ID:???
125です。お返事ありがとうございます。
jcode::でsjis→EUCコンバート時には
まだ化けていないようです。
さらにそのテキストをsjisに戻した場合は
化けてしまうものもあるようですが、今回は
sjisに戻しておりませんので無視しています。
現状としてはどうやら置き換えている時に
化けてしまっているようです。
どの文字がどのようなタイミングで化けるか調査して
もう一度書き込ませていただきます。
129125:02/11/30 04:09 ID:???
125です。
確認したところ、置き換え時に同一文字コードながら違う文字?
で置き換えが行われていて化けてしまっているようです。
例えば
$_ = "007シリーズの最新作「ダイ・アナザー・デイ」";
$word = "次';

としたときに以下のようになります

007シリーズの最新作「ダイ・アナザ。<XX>次</XX>Ε妊ぁ廚・

このように、"次"という文字は含まれていないのですが
文字コードが同一?のため中途半端な所で置き換えが
行われて以後の文章が化けてしまう、という現象に見えます。

このような動作を回避することは出来るのでしょうか?
130nobodyさん:02/11/30 05:16 ID:???
>>121
Carp or caller
131nobodyさん :02/11/30 05:39 ID:???
>>129
そのperはeuc-jp対応版なの?

132nobodyさん:02/11/30 09:03 ID:KwMUsAxf
素因数分解する物を作ったんですが、桁数の大きい物を入れると
うまくいきません。(例:40000000000とか) 何でですか?
$m = 2; $x = 0; $c = 0; ($nは元の数)

while ($h == 0){
if ($n % $m == 0){
$n = $n / $m;
@x[$x] = $m;
$x++;
}
else{
$m++;
if ($n % $m == 0){
$n = $n / $m;
@x[$x] = $m;
$x++;
}
}
if ($n < $m){$h = 1;}
}
133nobodyさん:02/11/30 09:36 ID:???
>>132
素因数分解のアルゴリズムは置いておいて、
http://pc.2ch.net/test/read.cgi/php/1000191385/66-69
これか?
134132:02/11/30 10:21 ID:KwMUsAxf
>>133
よく分からないんですが、perlのバージョン?(仕様上?)に問題があるということですかね?
135nobodyさん:02/11/30 12:00 ID:???
質問なのですが、
たとえば<txt></txt>で囲まれている間の文字のみを
s/</&lt;/g;
s/>/&gt;/g;

という風に変換したいのですが、
どうしたらいいか分かりません。下記の様にしたのですが、できませんでした。
ご教授して頂けませんか?

if ($val =~ /<txt>(.*?)<(.*[^>]*)>(.*?)<\/(.*?)>(.*?)<\/txt>/) {
$val =~ s/$1<$2>$3<\/$4>$5/ig;
}
#見にくくてスミマセン…
136135:02/11/30 12:17 ID:???
勘違いしてました・・・
上手くいきました、ご迷惑おかけしまスタ
137nobodyさん:02/11/30 13:59 ID:/75slB4U
>>132
Math::Bigint 使ってください。
Perlで大きい整数はまともに扱えません。
使い方は perldoc Math::Bigint 読んでね。
138nobodyさん:02/11/30 14:04 ID:???
>>129 =125
ttp://www.din.or.jp/~ohzaki/perl.htm
ここの「日本語を扱う 正しくパターンマッチさせる」を読んでくれ。
日本語処理はそう簡単には実装できない。
139125:02/12/01 14:00 ID:???
>>138
求めていた回答がここにありました。
じつはそこのサイトはこのスレッドの頭にあったので
見ていたのですが、ちゃんと読まずに通過していたようです。
解決することができました。ありがとうございました。

他の皆様も考えてくださったり回答してくださったりして
ありがとうございました。では。
140nobodyさん:02/12/01 21:52 ID:???
my @hogelist = ('hoge','piyo','huga');
で作ったをもとに、
hoge,piyo,huga
と表示させたいです。どうやればいいか教えてください。
141nobodyさん:02/12/01 21:55 ID:???
s/(で作った)(をもとに、)/$1配列$2/;
142nobodyさん:02/12/01 21:58 ID:???
join
143nobodyさん:02/12/01 22:02 ID:???
join(",",@hogelist)
144nobodyさん:02/12/01 22:03 ID:???
>>142-143様。
ありがとうなのです(^-^)
145nobodyさん:02/12/01 22:06 ID:???
>>140
{
my @hogelist = ('hoge','piyo','huga');
my $count =1;
foreach(split(/\t/,join('\t',@hogelist))){
print "," if $count%0x04;
chomp;
print STDOUT;
$count += ($count+1)/0x01;
}

もっと無駄な方法ってないかしらん・・・
146nobodyさん:02/12/01 22:07 ID:???
>>145
遅せーんだよ
147nobodyさん:02/12/01 22:22 ID:SByI0FEM
あの〜今度HP作ろうと思ってるんです。この機会にUPローダも作りたいんです。
誰かUPローダの作り方教えてください。
作り方を説明してるサイトでもいいんで、お願いします。
148nobodyさん:02/12/01 22:25 ID:???
すみません、どなたか御教授ください
CGI::Liteとかのurl_encode,decodeなんですけども、
ある文字列がエンコード済みなのか未エンコードなのか調べる方法は無いでしょうか?
既にエンコード済みの"300%89%7e%82%c5%8d%a1%8c%8e%90%b6%82%ab%82%c4%82%a2%82%af%82%e9%82%a9%89%b4"
とか、未エンコードの"松屋のカレー(゚д゚)ウマー"とか色々な文字列が与えられてくるのですが
それを一律にURLエンコードがされた状態にしたいのです
で、ソレをデコードする時等、エンコードされてるモノはデコードしなきゃいけませんですし、
エンコードされてないモノに、"今日の降水確率は%25ってとこですかね"とか与えら、
デコードしたら変になってしまいますし…

なにかいい方法はないでしょうか?お知恵をお貸しください…
149nobodyさん:02/12/01 22:37 ID:???
>>147
レンタルのにしなさい。
>>148
本文につっこみますが日本語がとても難しいです。
もう一度日本語の勉強をしなおしてきます。
($str =~ m#^%.*#)? デコード処理 ;
ではダメ?(やっぱりよくわからん)
150nobodyさん:02/12/01 22:38 ID:???
>>148
理論的には不可能だ。
'%22'という文字列だけが来たときに、それがもともと
'%22' という文字列をそのまま送信したのか、
'"'(ダブルクォーテーション)を送信したのか、判別できないだろう。

[\x80-\xff]が含まれていたらエンコードされていないと見なす、くらいで
妥協したら?
151nobodyさん:02/12/02 04:38 ID:weXpByrh
確かに、理論的には不可能だが

->decode($str) if $str =~ m/^(?:%[a-fA-F0-9][a-fA-F0-9])+$/;

で、十分実用に耐えると思うが・・・

エンタープライズとかだと、デコードしてないと
error 400になるけど
152151:02/12/02 04:39 ID:???
デコードしてないと -> エンコードしてないと
153nobodyさん:02/12/02 04:41 ID:???
ほの板のスレ一覧の最新5件だけ自分のサイトのTOPに
表示するためには、CGIでどういう記述をすれば良いのか教えて下さい
154nobodyさん:02/12/02 08:03 ID:???
>>149
ごめんなさい、意図がよく伝わらなかったようで(汗
えと、とりあえず"与えら"は"与えられたら"です、打ちミスりました

>>150
まだまだワカッテナイので、[\x80-\xff]ってのは日本語が入ってたら、ってことなのでしょうかね
あとは"とか&とかそゆモノが入っていた時もエンコされてないなー、って方針でいいのでしょうか

>>151
%xxが含まれてたらエンコード済み、と解釈するということでしょうか?
>>150さんのと組み合わせたほうがより完璧を期することができそうです

下2行はよくわかんないですけど、ある鯖でやると、ってことでしょうか?

>>153
IO::Socketモジュールとか使えばいいような気がします
にちゃんねる掲示板の仕様はよくしらないのですが、どっかにスレ一覧を保持してるファイルが有った気がします
でもアクセスごとに結構な大きさのファイルを取りに行くと転送料問題とかで怒られそうな気もします
初心者なのでなんか重大な勘違いをしてるかもしれませんがネ…
155150:02/12/02 14:17 ID:mB0yHtje
>>154
150は適当に書いちゃったけど、
[\x00-\x20"#;<>?{}|\\\\^~`\[\]\x7F-\xFF]
が含まれていたらエンコードされていない、と見なすのは?
まあ>>151さんのでOKだと思うけど。
156nobodyさん:02/12/02 14:53 ID:???
DBにfirebirdを使うと思うのですけど、どうですか?
157nobodyさん:02/12/02 14:57 ID:???
>>156
使ってみた感想をキボン
158nobodyさん:02/12/02 17:07 ID:???
>>157
キボンと言われましても、他のDBをほとんど使ったことがなく
単純に登録、更新、削除くらいしかしないので感想はあまりないです。
ただちょっとデータ量が多そうなのでDBを使ってみるかとなったのです。
159nobodyさん:02/12/02 17:55 ID:fz9HS+5s
ttp://kasai.fm/perlHTTP/
上記のサイトを参考にして(というかそのままコピペで)、
WEBページを読み込むCGIを作りました。
しかし、CGIにアクセスしてみたところ正常に読み込めないようです。

$errorMessageは、Can't connect to httpとなっています。
メッセージの意味は分かるのですが、解決策が分かりません。
サーバーの環境は、MacOS10.1.4、Perlのバージョンは5で、自宅サーバーです。

掲示板等のCGIは正常に動いています。
解決策が分かる方、お願いします。
160nobodyさん:02/12/02 17:56 ID:VWSOmEHp
>74 :無名さん :02/12/01 23:30
>↑オマエは頭の悪いバンドマンだなーどうせオールナイトイベントに出てた
>スキムミルクっていうバンドだろ?ライブ中の態度でけーんだよ。
>ツアーバンドはノルマとらないんだよ。それからいい音出すPAも雇ってチラシも
>すってんだよ。金かかってるんだよ。そのくせてめえら客よばね―のか?
>Y野氏の組織はやばいからねーパソコンオタクもいるから調べられて
>そんな事言ってるとCHOKOに本当にカツアゲされるぞ。
>2ちゃんねるキラー組織って知ってるかなー君?

↓ここでこんな書き込みを見つけたんだが
恐らくお祭り状態になる予想。興味のある方は是非見てきてくだされ。
http://music.2ch.net/test/read.cgi/minor/1031619119/74

ちなみにCHOKOというバンドのサイト。
http://choko3.hp.infoseek.co.jp/

2ちゃんねるキラー組織キタ━━━)゚∀‘)・ω・) ゚Д゚)゚∀゚)・∀・) ̄ー ̄)´_ゝ‘)-_)゚∋゚)´Д`)・∀。)━━━━!!!
161nobodyさん:02/12/02 18:08 ID:???
>>159
ルータ・ファイアウォールとかでポート閉じちゃってるとか?
162159:02/12/02 18:16 ID:???
>>161
ルーターですか・・・。
大学に持ってきて設置しているせいかも知れません。
もう少し調べてみます。
163nobodyさん:02/12/02 18:16 ID:???
>>159
proxyの設定が間違ってるとか
164nobodyさん:02/12/02 18:28 ID:+ey3nn6h
>>159
host->IPが取得できないのでは
165159:02/12/02 19:12 ID:???
>>161-164
レス感謝です。
今日は時間切れの為大学から閉め出されてしまうので、
また明日調べてみようと思います。
ありがとうございました。
166nobodyさん:02/12/02 19:24 ID:???
つーか自宅サーバちゃうやん( ´_ゝ`)
167nobodyさん:02/12/02 21:16 ID:???
フリーのゲストブックを落としてきたんですが、
そのファイル内にある.cgiなどをFFFTPでアップするだけでいいんでしょうか?
168nobodyさん <sage>:02/12/02 21:21 ID:???
>>167
WebprogとかCGIのスレ行ってよ。Perlとぜんぜん関係ないじゃん。

169167:02/12/02 22:22 ID:???
誤爆でしたスンマセン
170nobodyさん:02/12/02 23:00 ID:afn6SBSE
深沢千尋著「初めてのパール」の10章の掲示板を自分で作ってみました。
時間表記をできるように、以下の行を足しています。
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@month =('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@youbi=('Sun','Mon','tue','Wed','Thu','Fri','Sat');
$year += 1900;
if($day < 10){$day = "0$day";}
if($hour < 10){$hour = "0$hour";}
if($min < 10){$min = "0$min";}
$time="$youbi[$wday], $day-$month[$mon]-$year, $hour:$min";
ここで質問なのですが、時間・日を、2時1分が、2:1とならないように、
ifで02:01となるように書きました。
でもこれ、置換処理か何かでもっとスマートに書ける気がするのですが、
具体的にわかりません。どなたか、ご教授願えないでしょうか。
171nobodyさん:02/12/02 23:06 ID:???
こんなの?
($day,$hour,$min,$sec) = map {sprintf "%02d", $_} ($day,$hour,$min,$sec);
172170:02/12/02 23:06 ID:???
「初めての〜」じゃなかった。。。
「すぐわかるパール」でした。
古田たかし著の「初めてのCGI&Perl」と混同しました。
今まで読んだ参考書は、上記2冊です。
173nobodyさん:02/12/02 23:08 ID:???
そんな古くさい処理の本捨ててウェブで勉強した方がいいぞ。
@youbi とか、、ダサすぎでしょ。
174170:02/12/02 23:16 ID:???
>>171
あら素晴らしい!できました!
即レスありがとうございました!
175nobodyさん:02/12/03 01:13 ID:???
>>171さんの方法は1行でスマートだけど、

if($day < 10){$day = "0$day";}

なんて方法は最悪の部類ですよ。かなりひどい本だと
断定してもいいです。たぶんこれもkent-webのソース
をダサいままぱくってるのかな?
176nobodyさん:02/12/03 01:18 ID:ZhYTYd9T
マッチについての質問です。
データファイルを読み込んで、任意の数字がある場合のみprintしたいと思っています。
for(@log){
if($_ =~ /$num/){
print "$_";
}
}
これでやると、$num=10;とした時、100や101、102....もマッチしてしまいます。
10なら10だけをマッチさせたいのですが可能でしょうか?
177nobodyさん:02/12/03 01:27 ID:???
変数たくさんあるの嫌いな漏れはこう書くな。。
後で必要なのは$timeだけだよね?

($min, $hour, $day, $mon, $year) = (localtime time)[1..5];
$time = sprintf "%s, %02d-%s-%d, $02d:%02d".
qw(Sun Mon Tue Wed Thu Fri Sat)[$wday], $day,
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$mon],
$year+1900, $hour, $min;
178nobodyさん:02/12/03 01:29 ID:???
>>176
区切り文字とかってないの?どんなデータファイル?
いちおう /\D$num\D/ で可能だとは思うが
行頭と行末の場合はヒットしないので注意。
179176:02/12/03 01:44 ID:???
>>178
データファイルは掲示板の書き込みのような文章です。
その文章中(記事番号とかではなくて)に任意の数字がある場合にマッチさせたいのです。

/\D$num\D/を使ったらうまくいきそうです。
ありがとうございました。
180nobodyさん:02/12/03 02:26 ID:???
自由度はせばまるが、だいたいは日付の出力はこれでやっている。

$t = localtime;
print $t, "\n";
181nobodyさん:02/12/03 13:18 ID:???
htmlの表形式でファイル名と更新日をソートして書き出すというのを
前スレでおしえてもらったのを使いつつやってみてるんですが、、、
perl書くの初めてなんで全然分からず行き詰まり。どなたか助けてください。

my $output = "aaa.html";
open (OUTPUT, ">$output") || die "Could not open file $output : $!\n";

print OUTPUT "(HTMLヘッダ部〜<table>まで)";
print OUTPUT "<tr><th>No.</th><th>filename</th><th>update</th></tr>\n";

my $now = time;
my %files;
opendir(DIR, '.');
while (readdir(DIR)) {
if (($_ =~ /.txt$/i) && ($_ ne "readme.txt")){
$files{$_} = (stat($_))[9];
}
}
closedir(DIR);
182nobodyさん:02/12/03 13:18 ID:???
<続き>
foreach $key (reverse sort {$files{$a} <=> $files{$b}} keys %files) {
# このへん分からない
my $last_date = $files{$key};
my $ptime = int(eval(($now - $last_date)/86400));
$title = $key;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($last_date);
$year = eval($year + 1900);
$mon = eval($mon + 1);
substr($title,-4,4) = "";
print OUTPUT "<tr>\n<td align=\"center\">$i</td>\n";
print OUTPUT "<td>$title</td>\n";
print OUTPUT "<td align=\"center\">$year年$mon月$mday日</td>\n</tr>\n";
# ??
}

(以下続きがある予定)

print OUTPUT "(タグ閉め)\n";
close (OUTPUT);
183nobodyさん:02/12/03 13:37 ID:???
>>182
なんでそんなにイバルんだよ!
184nobodyさん:02/12/03 13:41 ID:???
>>181-182
なにがわからないのかわからん。
とりあえず$iはずっと''だと思うが。
185nobodyさん:02/12/03 15:16 ID:???
すいません。
>print OUTPUT "<tr>\n<td align=\"center\">$i</td>\n";
の行はいらないんで、$iは無視してください。

sortしたのをforeachでちゃんと回るようにしたいんですが。
186nobodyさん:02/12/03 18:16 ID:???
どうしてちゃんと回ってないと?
新しい順に並ばないか?
187 :02/12/03 21:04 ID:???
foreach() 以下の{ }の中が間違ってるぽいんですが
どこをどう直せばいいのかも分からず。。
188nobodyさん:02/12/03 21:12 ID:???
>187
プログラミングPerlを買ってきて読め。
それで全て解決。
189184=186:02/12/03 22:07 ID:???
だからさ。
このスクリプトなら新しい順に並ぶでしょう?
並ばないなら、どうなるのか教えて欲しい。エラーが出るのか?
で、最終的にどうしたいわけよ。

%filesにどんな値が入るか観察してみるとわかるかもな。
190 :02/12/03 22:57 ID:???
並べ替えた順にファイル名と更新日を<table>の形で出力したいんですけど、
実行して生成されるhtml見ると、この部分(foreach(){ }の中)が抜けてて、
ヘッダとフッタの部分だけになっちゃうんで。。
191nobodyさん:02/12/03 23:23 ID:lLuHX1/s
$time = localtime;

$time(10桁の数値)を出来るだけ少ないバイト数に可逆圧縮したいのですが、
どうすればよいでしょうか。
例えば16進数で表記すると、
1037797479(10byte) → 3DDB8867(8byte)
で2byte縮むことになります。
ただ、圧縮後の数値は aタグにのせてリンクするので、(<a href=test.cgi?i=3DDB8867>)
URLに使えない文字だと駄目なのですが。

よろしくお願いします。
192nobodyさん:02/12/03 23:33 ID:???
>>191
そんなことをする意味は……それは言わんでおくか。

URLに使える文字のテーブルを作って、仮にそれが50個あった場合は
timeの数値を50進数に変換したあと、テーブル引いて文字化する。
受け取る側では逆のことをやる。これなら5〜6文字ぐらいにできるんでない?
193nobodyさん:02/12/03 23:38 ID:???
>>181
foreach (readdir(DIR)) {
194nobodyさん:02/12/04 00:01 ID:???
>>192
ありがとうございます。
目的は携帯サイトの2k制限を如何にクリアするか、ということなんです。
その為にHTMLに出力する部分は出来るだけ文字数を落としたいのです。

(0..9,a..z,A..Z,_,-)
仕様上URLでそのまま送れる文字は上記と、'.'、'*'だけみたいですので、
そうなると64進数が限界でしょうか。。
ご意見ありがとうございました。
195nobodyさん:02/12/04 00:09 ID:???
>>194
4バイトにできるだろ

ちなみに以下は10桁の数値が代入されることはないと思うが
$time = localtime;
196nobodyさん:02/12/04 00:14 ID:???
>>195
あ゛あ゛あ゛恥ミス発見!
ご指摘の通り $time = time; でした。

64^4 = 16777216
で、10桁は表現できないと思うのですが・・
4バイトで表現するにはどうしたらいいんでしょうか?
197189:02/12/04 00:23 ID:???
>>199
おお。すまん。
foreachと言うのでそこばかり気にしていたよ。

while (readdir(DIR)) {
>>193のように
foreach(readdir DIR){
とするか
while($_ = readdir DIR){
としてみれば解決すると思うぞ。
198nobodyさん:02/12/04 01:33 ID:???
>>196
1970年のデータが必要かどうか判りませんが、
もし最近のものならその数字(timeの戻り値)自体を減らしてみてはどうでつか?
$time = time - 946684800;
2000年01月01日午前00時00分00秒を0とするとか。
199nobodyさん:02/12/04 01:33 ID:???
>>196
>>195は、timeの値が4バイトだと言ってる。つまり32ビット。
で、64通り=6ビットの場合、6文字必要。
でも、何十年も使う訳じゃないだろうから、timeから1000000000を
引いた値を5文字(30ビット)で格納、でどうかな。
200199:02/12/04 01:34 ID:???
うわ。もろかぶった。
1時間前のカキコに…笑
201181:02/12/04 09:10 ID:???
ありがとうございます。できました。
202196:02/12/04 11:17 ID:???
>>198-199
なるほど!理解できました。
確かに最近のものだけなので、timeの戻り値を減らしてみます。
この度はどうもありがとうございました。
またよろしくお願いいたします。
203nobodyさん:02/12/04 15:23 ID:???
単純に10回、回したい時、
for (1..10){
 print "うんこ\n";
}
こういう書き方はありですか。
204nobodyさん:02/12/04 15:48 ID:???
>>203
あり
205nobodyさん:02/12/04 18:01 ID:7+5xaubm
perlソース中の定数を、外部ファイルに書き出して扱いたいんだけど、
linuxの設定ファイルでよくある「.conf」ってなにか規格があるの?
perlから簡単に扱えるようなモジュールはありますか?
206nobodyさん:02/12/04 20:05 ID:???
>>205
意味があまりよく判りませんが、「.pl」や「.cgi」など、AddHandlerで設定した拡張子にしておくと、直接ブラウザで見られたときに、エラーが返ってくるので安心かもしれません。
207nobodyさん:02/12/04 20:41 ID:???
>>205
Windowsでいうところの.iniやMac OS Xでよく使われているようなplist
みたいに、設定ファイルのデファクトスタンダードな規格はあるのか?
ってことでしょ? 無いと思う。

CPANにいけば、設定ファイルをごにょごにょするモジュールはいっぱい
あるので、検索してみることをお勧め。
208nobodyさん:02/12/05 02:20 ID:???
>>205
ここに有るものを好きに選ぶよろし
http://cpan.org/modules/by-category/02_Perl_Core_Modules/Config/
2091/2 長文すいません。。:02/12/05 04:48 ID:jP9xslt3
foreach (1 .. 3) {
timethese(1000, {
foreach => sub {
open(FILE, '/test.data');
my @data = <FILE>;
close FILE;
foreach (@data) {
tr/E//;
s/a/e/g;
}
},

while => sub {
open(FILE, './test.data');
while (<FILE>) {
tr/E//;
s/a/e/g;
}
close FILE;
},

});
}

2102/2 長文すいません。。:02/12/05 04:48 ID:jP9xslt3
Benchmark: timing 1000 iterations of foreach, while...
foreach: 2 wallclock secs ( 0.19 usr + 1.21 sys = 1.40 CPU) @ 713.78/s (n=1000)
while: 2 wallclock secs ( 0.46 usr + 1.72 sys = 2.18 CPU) @ 457.88/s (n=1000)
Benchmark: timing 1000 iterations of foreach, while...
foreach: 1 wallclock secs ( 0.22 usr + 1.12 sys = 1.34 CPU) @ 745.71/s (n=1000)
while: 2 wallclock secs ( 0.55 usr + 1.59 sys = 2.14 CPU) @ 466.42/s (n=1000)
Benchmark: timing 1000 iterations of foreach, while...
foreach: 1 wallclock secs ( 0.21 usr + 1.19 sys = 1.40 CPU) @ 713.78/s (n=1000)
while: 3 wallclock secs ( 0.52 usr + 1.71 sys = 2.23 CPU) @ 447.63/s (n=1000)

foreach の方が速いんですけど、Benchmark の使い方間違っていますか?
この2つではよく while を使えといわれますが、それは速さではなくて別の要因があるからなんでしょうか?
配列にいれると大きなファイルだとメモリを圧迫するとか。
whileで回すとその心配はないのかな?
211209-210:02/12/05 04:51 ID:???
あれっ!?foreach のパスが間違ってる!!
やっぱりwhile のほうが速いですね・・・・。
すいませんでした。。
212nobodyさん:02/12/05 09:57 ID:???
>>111さん
有難うございました。
213正規表現・・・・:02/12/05 13:08 ID:vPIO4lyL
だみだ。正規表現ってさっぱりわかんねぇ。

$test =<<"TEST";
ここから始まりです。
<FOO>
hogehogehoge
hogehogehoge
hogehogehoge
</FOO>
ここで終わりです。
TEST

という文字列から<HOGE>から</HOGE>までを抜き出したい場合。
Perlでどんな風にかきゃいいんでしょう?

正規表現道場過去ログには
m[<FOO>.*?</FOO>]sのようにすればイイみたいな事が書いてあるんだけど

$test =~ m[<FOO>.*?</FOO>]s;
print $test;

てな感じでやってみると、$testはなにもされてません。
214nobodyさん:02/12/05 13:14 ID:???
$test =~m[<FOO>(.*?)</FOO>]s;
print $1;
215nobodyさん:02/12/05 13:15 ID:???
$test =~ m[(<FOO>.*?</FOO>)]s;
print $1;
216正規表現・・・・:02/12/05 13:31 ID:vPIO4lyL
なるほどぉ。特殊変数ってのはそう言う意味だったのかぁ。
感謝です。
217nobodyさん:02/12/05 15:55 ID:34DLd1c6
教えて下さい。
ファイルオープンでエラーが出た場合に
処理を続行したいのですがエラーをクリアーする
関数などはあるのでしょうか?
また、読み込みの場合でもファイルロックをかける必要は
あるのでしょうか?
218nobodyさん:02/12/05 16:19 ID:???
> ファイルオープンでエラーが出た場合に
> 処理を続行したいのですが

開けなかった場合中断するってな風にプログラムしてなきゃ普通に処理を続行しますが。

>また、読み込みの場合でもファイルロックをかける必要は
>あるのでしょうか?

読み込みしかしないファイルなら必要ありません。
更新されるファイルならした方がよいでしょう。
219nobodyさん:02/12/05 16:58 ID:34DLd1c6
>>218さんありがとございました。
勉強になりました
220nobodyさん:02/12/05 18:12 ID:x3XgL2vW
すみませんが、
Jcode.pmをniftyで動かす方法を、教えていただけないでしょうか。
221nobodyさん:02/12/05 22:49 ID:???
CGI(掲示板スクリプト)をtaintモードで動かしたいのですが、
#!/usr/local/bin/perl -T
とするとエラーになって動作ません。
原因としてどんなことが考えられるのでしょうか?
222nobodyさん:02/12/05 23:03 ID:qFEbS8pn
DB_File.pmが必要なんですがプロバイダにインストールされてません。
これってプロバイダに言えばインストールしてくれるもんでしょうかね?
諦めて自宅鯖にしたほうがよいですかね?
223nobodyさん:02/12/05 23:07 ID:???
>>220
Niftyは標準モジュールも入ってないし無理じゃない?

>>221
Tオプションの意味が分かるなら答えもおのずと分かりそうなモンですが。

>>222
プロバイダによってポリシーが違うだろうし、プロバイダに聞けとしか言いようがない。
224nobodyさん:02/12/05 23:07 ID:???
>>222
だ・か・ら そういうことって、まずプロバイダに聞けばいいことじゃん
225223:02/12/05 23:09 ID:???
>>224
ふしだらものですがよろしくお願い致します
226nobodyさん:02/12/05 23:10 ID:???
>>223
>Tオプションの意味が分かるなら答えもおのずと分かりそうなモンですが。
以外とそうでもないようです。
227nobodyさん:02/12/05 23:17 ID:???
それどころか質問の仕方も分からない、と。

エラーメッセージぐらい書いても罰あたらんだろうに。
228nobodyさん:02/12/05 23:20 ID:???
どうせ汚染チェックしてないとかアホ理由だろ。
229nobodyさん:02/12/05 23:27 ID:???
ちょっと動揺してたのでテンプレの存在を忘れてますた。おめんなさい。
1:自分はこう言う事がしたい。
掲示板のフォームから送られてくるデータの汚染チェックをしたい。

2:それでこんな風にやってみたが・・・
#!/usr/local/bin/perl -T
としてみた。

3:それだとこんなエラーが出て上手く行かなかった。
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.

あと226は多分漏れじゃない誰かです。
230nobodyさん:02/12/05 23:39 ID:???
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.

適切なHTTPヘッダを吐いてない。
エラーの詳細はエラーログで見れ。

って書いてるじゃん。
231nobodyさん:02/12/05 23:41 ID:???
>>229
エラーメッセージを読め。
簡単な英語くらい理解すれ!
辞書引け!
232nobodyさん:02/12/06 00:35 ID:???
perlで下記のようにモジュールを作る場合、別ファイルのあるモジュールからは
MODULEしか使わないのですが、require 'aa.pl' と use MODULE; では速度や
負荷は変わらないですか?

aa.plの内容
#------↓ここから
packege MODULE;
・・・
1;

package MODULE2;
・・・
1;
#------↑ここまで
233nobodyさん:02/12/06 00:41 ID:???
1; が二つある。。
234nobodyさん:02/12/06 00:46 ID:???

aa.plをuse MODULE;では呼び出せないと思うが。
235232:02/12/06 00:50 ID:???
スマソ。

a.pm
--------------------
package MODULE;
・・・

package MODULE2;
・・・
1;
-------------------

b.pl
-------------------
use MODULE; # または require 'a.pm';
         # MODULE2は使用しない。
236nobodyさん:02/12/06 01:07 ID:???
えーとa.pmなら

use a;

になると思うのですが。
でOOPなら
$hoge1 = new MODULE;
$hoge2 = new MODULE2;

$a = $hoge1->hoge( $xxx );

とかに
単に関数を呼び出すだけなら

$a = MODULE::hoge();
$b = MODULE2::hoge();
237232:02/12/06 01:11 ID:???
>>236
ありがとうございます。基本的に間違ってますた。
で、requireとuseでは速度・負荷的には変わりないんでしょうか?
238nobodyさん:02/12/06 01:38 ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
239nobodyさん:02/12/06 01:40 ID:???
条件によっては読まんモンはrequireで条件分岐後に読み込んだ方が
余計なの読まないから良いんでない?
サブルーチンをインポートする必要がなければ、だけど。

あとは大差無いかと。
240nobodyさん:02/12/06 07:37 ID:???
use だとinitにパラメタを渡せるのがちょい便利。
241nobodyさん:02/12/06 11:46 ID:yzLDpzsK
$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
としたいのですが可能でしょうか。
242nobodyさん:02/12/06 12:01 ID:???
>>241
ものすごく安易な解ですがsplitする前に
$aiueo .= "EOL";
とかで後ろに文字をくっつけておいて、
splitした後にpopしてやると逃れることは
できます。

$aiueo = "1■2■■■3■4■5■■■";

$aiueo .= "EOL"
@values = split(/■/, $aiueo);
pop @valures;

$i = 0;


という感じです。
243nobodyさん:02/12/06 12:11 ID:???
>>242
なるほど。確かに単純で確実ですね。
プログラムはアイデア勝負ですね。ありがとうございます。
244nobodyさん:02/12/06 12:20 ID:q7PjCrzt
画像投稿型掲示板cgiのスクリプトなんですが、
サーバに保存するファイル名に投稿された時間を反映させるには(img200212061220.jpgのように)、
どのような記述が必要ですか?
245nobodyさん:02/12/06 13:24 ID:???
>>244
スクリプトを見ないとわからん
こんな感じで作った文字列をファイル名につけてやりゃいいんじゃないの

@date = reverse((localtime)[1..5]);
$date[0] += 1900; $date[1]++;
$now = sprintf "%4d%02d%02d%02d%02d", @date;
246nobodyさん:02/12/06 13:27 ID:???
>244
マルチは市ね
247244:02/12/06 13:44 ID:y8w9Rsa1
>>245

ありがとうございました。やってみます。
248bloom:02/12/06 13:47 ID:7xw6gZYB
249242:02/12/06 15:19 ID:0nNWvukl
なんか気になっていたんですが、>>242はバグありですね。
あのコードじゃ

$aiueo = "1■2■■■3■4■5■■■6";
とかのときに最後の値を捨ててしまいますんで、
後ろにくっつけるのは区切り記号込みにしないと
だめですね。

$aiueo .= "■EOL"
@values = split(/■/, $aiueo);
pop @valures;

で、うまくいくはず。
250nobodyさん:02/12/06 15:40 ID:???
>>241
*もし*要素数が一定なのなら、素直にsplitに第3引数を渡すっていう手も。
251nobodyさん:02/12/06 15:41 ID:???
$aiueo = "1■2■■■3■4■5■■■";
@values = map($_||'NULL', $aiueo=~/(.*?)■/g);
252nobodyさん:02/12/06 17:08 ID:zqw+GwyU
perl5.6で、困っています。
ある文字(\x{100}以上かもしれない)が大文字か小文字か判定したいのですが、たとえば
「任意のアルファベット大文字1文字に一致するメタ表現」などはないんでしょうか。
それとも、UnicodeData.txtをいちいち読まなければならないんでしょうか。
253nobodyさん:02/12/06 17:50 ID:???
掲示板を作っています。
改行数の多い書き込みは
「省略されました。全部読むには(略」 という感じで省略表示したいのですが
任意の改行数までを取得するにはどうすればいいでしょうか。
よろしくお願いします。
254nobodyさん:02/12/06 18:04 ID:???
>253
改行でsplitとか・・・、色々あるでしょ。
何故思いつかん?
255nobodyさん:02/12/06 18:19 ID:???
>>254
初心者コーナーだし別にいいじゃん。
256nobodyさん:02/12/06 18:35 ID:???
Perlでスマートに最小値を求めるにはどうすればいいんでしょうか?
257nobodyさん:02/12/06 18:39 ID:???
>>256 何の?
258256:02/12/06 18:40 ID:???
整数です。
259nobodyさん:02/12/06 18:43 ID:???
>258
1だろ。
260nobodyさん:02/12/06 18:44 ID:???
>>256
スマートかどうか知らんが、sortじゃだめなんですか?

sub numerically { $a <=> $b; }
@sorted = sort numerically LIST;

これで、最小値が@sortedの先頭に来ます。
261256:02/12/06 18:55 ID:???
>>260
ありがとうございます。
高度すぎて理解できてませんが、sortでやってみます。
262nobodyさん:02/12/06 19:01 ID:???
>>260
それでは、あるリストの要素の最小値を求めることはできるけど、
「整数」の最小値を求めることはできないでしょう。
263nobodyさん:02/12/06 19:26 ID:???
sub min(\@){
my $a_ref = $_[ 0 ];
my $min = $a_ref->[ 0 ];
foreach (@{ $a_ref }){
$min > $_ and ($min, $_) = ($_ , $min);
}
return $min;
}

my @b= (20, 19, 100, 75, 6);
print min @b;
264263:02/12/06 19:39 ID:Wd1BEmDy
ううっ、だめだ、、、。
@bの内容変わってる。
265nobodyさん:02/12/06 22:56 ID:???
my(@list) = (20, 19, 100, 75, 6);
my($minimum) = sort { $a <=> $b } @list ;
print("$minimum\n");

これじゃダメ?
266nobodyさん:02/12/06 23:18 ID:???
>>265
ダメ
267nobodyさん:02/12/07 00:15 ID:???
最小値求めるのにソートすんのかよ。これだからperlerは…
268nobodyさん:02/12/07 00:19 ID:ePZJKayy
@hogeに何個か入っていてforeachで最後の1つ前までprintしたいときって
どうすればいいんでしょう?
10個あったら$hoge[9]まで、とか。
269nobodyさん:02/12/07 00:23 ID:???
>>267
もちつけ。
まぁいいじゃん、基本的な原理は同じようなもんだし。
270nobodyさん:02/12/07 00:49 ID:???
>>268
10要素の配列で$hoge[9]までなら全部じゃん(w
foreach (0..$#hoge-1){
print $hoge[$_];
}
とか。
271nobodyさん:02/12/07 01:08 ID:yEekv6g9
Perlで糞ゲームつくりました。お試し下さいませ。
http://www36.tok2.com/home/bttl/bttl-pc/
272yani ◆saNSktNEdQ :02/12/07 01:19 ID:KB9hByzA
my $least;
foreach (@list) {
$least ||= $_;
$_ < $least and $least = $_;
}

ベタな気がする。エレガントな解法求む。
273yani ◆saNSktNEdQ :02/12/07 01:30 ID:KB9hByzA
いや、これじゃだめだな。

my $least;
foreach (@list) {
defined($least) or ($least = $_, next);
$_ < $least and $least = $_;
}
274yani ◆saNSktNEdQ :02/12/07 02:26 ID:6Rt0AxGb
こちらのほうがましか。
しかしイマイチ美しさを感じないのは気のせいか。

my($least) = @list;
foreach (@list) {
 $_ < $least and $least = $_;
}
275nobodyさん:02/12/07 03:44 ID:???
Perlは整数32bitだから・・整数の最小値は・・どうなの?
276268:02/12/07 04:11 ID:ePZJKayy
>>270
あ、確かに全部っすね・・・(w スマソ
こういう方法があるんですねぇ。おかげさまでうまくいきました。
ありがとうございます。
277nobodyさん:02/12/07 06:27 ID:???
grepでデキルような気がしますが。
forを使ってないだけで中で回ってるのは一緒だけどな。
278nobodyさん:02/12/07 06:39 ID:???
$min=$list[0];
grep { $min > $_ && ( $min = $_ ) } @list;

こんな具合かな。テストしてないけど。
279nobodyさん:02/12/07 06:44 ID:???
minとmaxが逆じゃん。
駄目だ寝よう。
280yani ◆saNSktNEdQ :02/12/07 09:40 ID:6bq1sAwR
>>277
そうそうgrepがあった。

手元の5.8.0の標準モヂュールで面白いものを見つけた。

use 5.8.0; ###
use List::Util qw(min);
...
$least = min(@list);
281yani ◆saNSktNEdQ :02/12/07 11:42 ID:6bq1sAwR
まあ、考えていたものがそのまんまあったわけで、それだけなら大して面白くも
ないんだが、「面白い」(ことができるかもしれない)と言ったのは List::Util::reduce のことだ。
282nobodyさん:02/12/07 11:46 ID:???
やに言ってんだYO!
283nobodyさん:02/12/07 16:22 ID:???
ひとりごとが多いスレですね。
284nobodyさん:02/12/07 16:24 ID:/TptzaIR
結構前々から思っていた疑問なんだけど、
エラー表示させる場合「&error("文字列");」を使う例を良く見るのだが、
この場合「sub error{}」は用意しなくて良いのだろうか?
所持する本には書かれていなくて……。

ちなみに漏れは「die」関数を使ってます。
285nobodyさん:02/12/07 16:58 ID:???
ふーん。。。
286nobodyさん:02/12/07 18:32 ID:???
帰ってこないからgoto error使ってるけど、、、別にいいよね?
287nobodyさん:02/12/07 20:46 ID:???
>>284
自分でつくるんでねぇ?

>>286
構造化プログラミングとかの本を見ると、GOTO分はプログラムの流れがワープしちまって
全体を把握するのが困難になるからいくないらしい
昭和57年頃の本だけど(藁
288nobodyさん:02/12/07 21:03 ID:???
goto の先でプログラムがお亡くなりになるということが
わかっていたら混乱することもないんじゃない?
289nobodyさん:02/12/07 21:06 ID:???
>>284
自分で好きなの作ろうぜ。>sub error { }
きちんとエラーメッセージ吐いてその時の環境変数やら標準入力の内容やらも表示すれば、
デバッグに便利。
290nobodyさん:02/12/07 21:54 ID:HolpJHok
外部のWWWサーバからファイルを取得するのに一番負荷が少なくて、早いのは何ですか?

SOCKET
WGET
LWP

WGETはサーバに入っていないので。。
LWPよりSOCKETの方が早いと思うんですが。
291nobodyさん:02/12/07 22:00 ID:???
>>288
自分だけが読むとは限らない罠
そして1年後の自分は別人である
292nobodyさん:02/12/07 22:31 ID:HolpJHok
これはマジで儲かりますよ!!
実際私はこれで毎月30000円稼いでいます、
しかも毎月1000万円が当たるチャンスなどあります。
お小遣い稼ぎに是非!!!

http://www.fruitmail.net/cgi/introduce_jump2.cgi?901913
293nobodyさん:02/12/07 22:58 ID:???
>>290
Socketの方がなんぼか早いだろうなあ。
でも、それぐらいだったらLwp使って安全かつシンプルに持ってくる方が俺はいいな。
SocketだったらRFCとかきちんと目を通さないと、正しいものは作れないだろ?
294nobodyさん:02/12/08 10:58 ID:H7RlugSZ
perlstyleのよると、サブルーチンは全部小文字のほうがいいと書いてあるけど、どうしてですか?
295nobodyさん:02/12/08 11:38 ID:???
>>294
「サブルーチン名は、全部小文字の方がいい」だろ?
モジュール名は(プラグマ以外は)大文字で始めろともあるだろう。
それと合わせたんじゃないか? 区別がすぐにつくように。
ま、作法の話だから、あんまり深く考えるな。
従ってれば、いつかきっと自分の中で決着がつく。
296nobodyさん:02/12/08 11:43 ID:???
sub SuBrOuTiNe{
    print "ふーん。。。\n";
}
297nobodyさん:02/12/08 12:07 ID:H7RlugSZ
>>295
なるほど、ソースの読みやすさのためなんですね。
モジュールは使ったことがないので今まで気にならなかったんだと思います。
298nobodyさん:02/12/08 13:10 ID:???
シツモソです。
Perlで、累計・今日・昨日のアクセス数をカウントするカウンターCGI(IMG or JSタグでCGI起動)
を設置しようと思ってるんですが、カウントの方法で少し悩んでます。

count.cgi?total でカウント処理(累計+1, 今日+1)
count.cgi?today で今日のカウントをロードするだけ
count.cgi?yesterday で昨日のカウントをロードするだけ

上の順でCGIが呼ばれると正常にカウントされるんですが、
昨日、今日、累計の順に呼ばれると、当然昨日と今日のデータはカウントされる前のものになっちゃいます。

今日と昨日のCGI が呼ばれたら、sleep(1)をして、累計のカウントがおわるまで待つ
というのも考えたんですが、あまりいい方法じゃないなーなんておもいますた。

また、カウントだけをする count.cgi?count みたいなタグを入れて、
そのタグを一番上に置いて、累計・今日・昨日のタグがきたらカウントデータを読むだけ
ってしても、やっぱり設置場所によってはデータがずれたりしてきちゃいます。

おい、おまえら!もしいい方法がありましたら教えて下さい。
299nobodyさん:02/12/08 13:37 ID:???
count.cgi?totalで累計のカウントを+1して累計のカウントを出力
count.cgi?todayで今日のカウントを+1して今日のカウントを出力
count.cgi?yesterdayで昨日のカウントを出力

で良いべさ。
300298:02/12/08 13:40 ID:???
>>299
( ´,_ゝ`)プププッ!!
301nobodyさん:02/12/08 16:23 ID:GWJer8wb
jcode.plは$hoge{'hoge'}を変換できないんでしょうか?
&jcode::convert(\$hoge{'hoge'},'euc');
てやってもだめなので一回普通に変数に代入して変換して元に戻して
いるんですが・・・。
302nobodyさん:02/12/08 17:22 ID:???
>>301
それは何かが違うから。
303nobodyさん:02/12/08 23:59 ID:???
今、掲示板を作成中なんですが、ファイルロックの掛け方がいまいち分からない・・・・
flockの使い方教えてくらはい。とりあえずはflockがサーバで使えるみたいなので。
そんなやつが掲示板など作るな!とかいわれそうですがお願いいたします。
参考になるサイトだけでも結構なんでお願い。
半日ググってたら、何が何やら分からなくなってしまいました。
304nobodyさん:02/12/09 00:07 ID:???
>303
ttp://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+flock+%E4%BE%8B&lr=lang_ja
検索サイトの使い方のコツを覚えた方がいいんじゃないか?
305nobodyさん:02/12/09 00:21 ID:???
素早い回答ありがとうございます。
今まで「perl cgi flock 掲示板」やら「flock 掲示板」やら、
しらみつぶしにサイトを見まくっていたら頭が変になっていました。
「例」で検索するのをすっかり忘れていました。
本当に感謝です。>304
306nobodyさん:02/12/09 20:40 ID:30vqgT1r

%ex = (
hoge => "hage",
xxxx => "$ex{hoge}",
);



みたいにしたいのですが、
Global symbol "%ex" requires explicit package name at ファイル名 line 13.
みたいにエラーが出ます。
どうすればいいですか?
よろしくお願いします。
307nobodyさん:02/12/09 21:00 ID:???
#use strict;
308nobodyさん:02/12/09 21:01 ID:???
my %ex
309nobodyさん:02/12/09 21:13 ID:???
our %ex ;
310nobodyさん:02/12/09 21:14 ID:???
your %ex;
311nobodyさん:02/12/09 21:34 ID:30vqgT1r
>>307
use strict;をコメントアウトしたら、エラーは出なくなりましたが、
$ex{xxx} に $ex{hoge} の値が代入されていませんでした。

実際には、my %ex; です。写し間違えでした。
312nobodyさん:02/12/09 21:38 ID:???
てかそんなことできんの?
313nobodyさん:02/12/09 21:59 ID:???
>>311
(
hoge => "hage",
xxxx => "$ex{hoge}",
)
が評価される時点で$ex{hoge}に何も入っていないなら当然。
314302:02/12/09 22:25 ID:???
>>311
折角のstrictなソースをクズに変えるから糞
315nobodyさん:02/12/09 23:42 ID:???
use strict って何?
316nobodyさん:02/12/09 23:46 ID:???
おまじない
317nobodyさん:02/12/10 00:21 ID:???
HTML::FillInForm って、
checkboxや、radioのcheckedは、引き継げないんですか?
318317:02/12/10 00:29 ID:???
出来ました。すいませんでしたー。
319nobodyさん:02/12/10 11:20 ID:???
変数って変数で作ることできるんでしょうか。
たとえば、

$count;
$hoge;
foreach $count (1 .. 10){
 $hoge$count = "文字:$";
}
こんな感じでつまり、
$hoge1 = "文字:1";
$hoge2 = "文字:2";

$hoge10 = "文字:10";
こういう事はできるのかなという事です。
これだとやはり$hoge$countの書き方がまずいようでエラーになります。
320nobodyさん:02/12/10 11:27 ID:???
なぜ配列を使わないのかと小一時間問いつめたい。
321nobodyさん:02/12/10 11:59 ID:???
>319
推奨:$hoge[$count]  # ただし$countが数字の場合のみ
推奨:$hoge{"$count"}  # $countが文字列の場合
非推奨:${"hoge$count"}
322nobodyさん:02/12/10 12:53 ID:???
>>320
ごめんなさい、小一時間じゃ済みそうにないんでまた次回。
>>321
その技の名前はなんですか。
323nobodyさん:02/12/10 13:14 ID:???
 配 列 と 連 想 配 列 ( ハ ッ シ ュ ) で す が な に か ?
324nobodyさん:02/12/10 13:22 ID:???
× 推奨:$hoge[$count] # ただし$countが数字の場合のみ
○ 推奨:$hoge[$count] # ただし$countが自然数の場合のみ

負の数とか小数を使われたらたまらんから訂正。
325nobodyさん:02/12/10 13:26 ID:???
自然数の定義を教えて下さい。
326nobodyさん:02/12/10 13:31 ID:???
辞書引け。
327nobodyさん:02/12/10 14:02 ID:+QGYbS02
1バイトと2バイトが混在している文字列から頭の3文字を
抽出するにはどうすればいいのでしょうか?
例えば『あいうえお』,『Aいうえお』などの場合です。
substrを使うと『Aいうえお』がおかしくなってしまいます
328nobodyさん:02/12/10 14:10 ID:???
329nobodyさん:02/12/10 14:16 ID:???
>328
Thanks
330nobodyさん:02/12/10 15:27 ID:???
>>321
すいません、よく考えたらただの配列じゃダメなんです。
$hogeと$iを合体して、
「$hoge1」という変数自体を作りたいんです。
よって、「$hoge1」という変数に文字とかを代入したりしたんです。
331nobodyさん:02/12/10 15:46 ID:???
質問お願いいたします。
書き込み処理の所なんですが、

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
truncate(OUT,0);
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
close(OUT);

    と

open(OUT, "+<$dat");
flock(OUT, 2);
@sasa = <OUT>;
seek(OUT, 0, 0);
print OUT "書き込み\n";
print OUT @sasa;
truncate(OUT, tell(OUT));
close(OUT);

ではどちらがいいんでしょうか?
ただtruncateの使い方がちょっと違うだけなんですが・・・。
それ以前に文法的に間違っていたらご指摘お願いします。
332nobodyさん:02/12/10 15:52 ID:???
>>330
リファレンス使えばよろし。

>>331
下。
既出のような気がするのは思い過ごしでしょうか。
333nobodyさん:02/12/10 16:10 ID:???
>>331
早速の回答Thanksです。
既出でしたか・・・お手数おかけしました。
過去ログまた読み直して出直してきます。
334nobodyさん:02/12/10 16:11 ID:???
>331じゃなかった
>332さんごめんなさい。
335nobodyさん:02/12/10 16:17 ID:???
>>330
せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
336nobodyさん:02/12/10 19:01 ID:4NsDPNiK
パスワード生成と、照合を別スクリプトにするのはやっぱりだめですか?

作ろうとしてるのは、パスワードを作るだけのスクリプトと、そのパス
を使って管理する掲示板なんだけど・・・文法チェッカかけたら
「Missing right curly or square bracket at hoge.cgi line 65, at end of line
syntax error at hoge.cgi line 65, at EOF
hoge.cgi had compilation errors.

ってなってしまった。。。
337336:02/12/10 19:02 ID:4NsDPNiK
あ、上のエラーでるのはパス生成のスクリプト。
338nobodyさん:02/12/10 19:04 ID:???
ご教授お願い致します。
メールの受信をしたいので、下記のように記述したのですが

0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2  print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->login($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9  print "認証: NG \n";
10 }

どうしても、認証NGとなってしまいます。
POPサーバーには、Win2000 exchangeを使用しているため
ログインユーザー名に、「ドメイン\\ユーザー名」と記述したり、
しなかったり、と色々試してみたのですがダメでした。
ちなみに、モジュールが置いてあるマシンからPOPサーバーへの
pingは通りました。

どなたか、分かる範囲で構いませんので
ご指摘下さい。
339nobodyさん:02/12/10 19:06 ID:???
>>336
ただの文法エラーですね。
カッコの付け忘れ。65行目参照。
340336:02/12/10 19:06 ID:4NsDPNiK
パスワード生成スクリプト=フォームに入力した文字をCryptで
暗号化して、それをファイルに保存(ファイルを作成というコマンド
がない?ので、ロックファイル作成のコードを使ってます)、というもの。
エラーが出ている65行目は。。。
sub error {
&head;
print <<"ERR"; #ここが65行目。
<center>
<hr>
<font color="#C20000"><b>エラー</b></font><hr>
$_[0]
<hr>
</body>
</html>
ERR

}
何が違うんでしょう??
341336:02/12/10 19:07 ID:4NsDPNiK
339>>
カッコ?!
・・・見てみます。
342nobodyさん:02/12/10 19:15 ID:???
>>336
エラーの内容から恐らくヒアドキュメントの書式を間違えてます。
343nobodyさん:02/12/10 19:17 ID:???
<p>$_[0]</p>
344名無しさん:02/12/10 20:10 ID:???
>>336
#ここが65行目。の#が全角になってるのは問題ないのか?
345338:02/12/10 21:05 ID:???
モジュール本文の記述が誤字だらけでしたので
とりあえずもう一度、修正版を書いておきます。

0 use Net::POP3;
1 unless ($pop = Net::POP3->new("$HOST")) {
2  print "POP3接続失敗 \n";
4 }
5 $pop->user($LOGIN_NAME);
6 $auth_check = $pop->pass($LOGIN_PASS);
7 if( $auth_check == undef )
8 {
9  print "認証: NG \n";
10 }


346nobodyさん:02/12/10 21:24 ID:???
APOP
347nobodyさん:02/12/10 21:51 ID:???
すいません、配列の要素の中に他の配列の全てを叩き込むって出来ないんでしょうか?

@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");
@hoge{1}=@test;
$data=@hoge[0];

このようにすると$dataの中には「か」だけが格納されてしまうのですが。
348nobodyさん:02/12/10 21:52 ID:???
>>345
まずtelnetで叩いてみろや。
349347:02/12/10 21:53 ID:???
誤 $data=@hoge[0];
正 $data=@hoge[1];
350nobodyさん:02/12/10 21:56 ID:???
$hoge[1] = join('', @test);
351nobodyさん:02/12/10 21:59 ID:???
>>350
ありがとうございます、助かりました。
352nobodyさん:02/12/10 23:43 ID:???
つーか、むしろ、こういうことじゃないのか?

@test=("か","き","く","け","こ");
@hoge=("あいうえお","テスト","さしすせそ","たちつてと","");

$hoge[1] = \@test;

print $hoge[1]->[5];
print $hoge[1][3];

print @{$hoge[1]}
353nobodyさん:02/12/11 00:22 ID:???
ちょっくら質問!
open(FILE,"xxxx");
@file = <FILE>;
@file = @file[0..8];
seek(FILE,0,0);
print FILE "zzzz";
print = @file;
close(FILE);
このように添字を使って”xxxx”の記録数を10にしたんだけど、
これはかなりダサイやり方?

354nobodyさん:02/12/11 01:45 ID:fCm39Cv9
>>353
モードは"+>"だよね。そのコードからすると。

@file = ();
push @file, scalar <IN> for 0..8;
のほうがいいと思うよ。
355nobodyさん:02/12/11 11:59 ID:IDueDvlE
そういやWin2000マシンのアクチブパールを5.6.1から5.8に入れ替えたらGDBM_File使えなくなった。
こちらのスレに対策知ってる神はいらっしゃる?
356nobodyさん:02/12/11 12:50 ID:???
Firebirdなんですけど
$sql = "insert into *** values( '***' )";
$statement = $dbHandle->prepare( $sql );
$sqlResult = $statement->execute;
この$sqlResultには何が返ってくるのでしょうか。
見たんですけど何も入っていませんでした。
357nobodyさん:02/12/11 13:21 ID:mexeU5Q0
use Time::Local;
しても
timelocalが使えません。

助けてください。
358nobodyさん:02/12/11 13:25 ID:???
>>357
実はPerl4ってことはないか?(w
ところでどう使えないんだ?エラーが出るのか?値が不正なのか?
良ければここにソースを書いてみれ。
359nobodyさん:02/12/11 13:25 ID:mexeU5Q0
>>357
のことは忘れてください。。。
360nobodyさん:02/12/11 14:40 ID:???
>>356
Firebirdかなんか知らんが、つまりはDBIだしょ?

$sqlResult = $statement->execute();
で、処理した件数が返ってくるはずだが・・・
361nobodyさん:02/12/11 15:55 ID:3BdsDO3l
サイト制作スレから誘導されてきました。

コマンド「chmod」の代わりになるコマンドってあるんですか?
もしあるのであれば教えてください。
もしくは
$ImgFile = "$ImgDir$no$tail";
if (!open(OUT,"> $ImgFile")) {
if ($clip_err) { &error("画像のアップロードに失敗しました"); }

}
binmode(OUT);
binmode(STDOUT);
print OUT $upfile;
close(OUT);

chmod (0666,$ImgFile);

この部分をchmodを使わずに構成する事はできませんか?
>>1で指定された書き方が出来そうにないのでこういう形でお聞きします。
どなたかお願いします。
362nobodyさん:02/12/11 16:10 ID:???
お勧めできないかもだけど
open(OUT, "> $ImgFile")より上に umask 0;
363nobodyさん:02/12/11 16:22 ID:IDueDvlE
>>358
いえ、Perl4なんてことはないっす。w
前はActivePerl5.6.1ビルド633でGDBM_FileをPPMインスコした記憶があって、
今回ActivePerl5.8.0ビルド804にする際以前の5.6.1ビルド633は綺麗さっぱり
DISKから消してしまったんです。GDBM_Fileは後からインスコすればいいという
考えで。
そしていざGDBM_Fileのインスコしようと思ったら、Perl5.6用しか見つからなくってお口あんぐり状態な訳です。

エラーは
Can't locate GDBM_File.pm in @INC (@INC contains: C:/perl/lib C:/perl/site/lib .) at (eval 1) line 2. BEGIN failed--compilation aborted at (eval 1) line 2.

と、漏れのマシンにGDBM_Fileが装備されてないって出ます。
ソースの抜粋は。。。自分が作ったスクリプトじゃない配布物なんで、カキコするのもちと・・・。
動作は電話帳データベースのようなもので、電話番号を入力すれば住所が分るといったものと同等です。

暫く待てばPerl5.8(Windows)用のGDBM_Fileが出てくるのかな?
364nobodyさん:02/12/11 16:44 ID:???
>>362
chmodの行を削って
open(OUT, "> $ImgFile")より上に umask 0;
という事でよろしいですか?

ありがとうございました。
365nobodyさん:02/12/11 17:50 ID:???
スクリプトの中で、
require './jcode.pl'; # jcode.plのパス
をしてjcode.plを呼んでるんですけど、コマンドラインで
「C:\>perl "C:\Documents and Settings\***\デスクトップ\unko.cgi"」
を実行すると、
「Can't locate ./jcode.pl at C:\Documents and Settings\***\デスクトップ\unko.cgi line 17.」
と出てしまいます。
(webだとエラーになりません。ローカルではデスクトップでスクリプトを実行しています。)
なぜでしょうか。
366nobodyさん:02/12/11 18:14 ID:???
require 'jcode.pl';
require '.\jcode.pl';
367nobodyさん:02/12/11 19:35 ID:???
>>365
カレントディレクトリに jcode.pl がないんでしょ。
そのコマンドラインだと、カレントは C:\ で、スクリプトのある場所と違ってるし。
368nobodyさん:02/12/11 20:42 ID:???
>>363
5.8は使ってないので的外れかもしれんが。
5.6用しかないというのはどこでわかったんでそ?
ppmでも見つからない?
369nobodyさん:02/12/11 20:59 ID:???
>>367
じゃぁいちいち、perlのスクリプトがある場所までcdしてからやらないといけないのですか?
毎回cdするのは結構面倒だと思うんですけどどうなんでしょうか。
370nobodyさん:02/12/11 21:03 ID:3ApX3k5Y
面倒だと思うなら、useしませう。
371nobodyさん:02/12/11 21:08 ID:???
デスクトップでスクリプトはしらすのは・・ワラタ
372nobodyさん:02/12/11 21:32 ID:IDueDvlE
>>368
そうなんです。Perl5.6用は見つかるんですが5.8用に全く行き当たらなくって。
グーグルしか使ってませんが。w
暇を見てぼちぼち探してみます。
>>365
いっぺんお使いのPerlにJcodeをインスコしてみてはどうでしょ。
コマンドプロムプトで

perl -MCPAN -e shell

してから、プロムプトがcpanに変化しますんで

>cpan install Jcode

でいけるかと。
373nobodyさん:02/12/11 21:57 ID:???
>>371
え?デスクトップではしらすのはトーシローですか?
374nobodyさん:02/12/11 22:10 ID:a27i1ZyR
半角スペースで区切られたファイルを split を使って並び替えたい&いらないものを破棄したいんですが
上手くいきません。Perl5を使っています。

#!/usr/bin/perl

$file = 'split.txt';

open(IN,$file);
@data = <IN>;
close(IN);
foreach(@data){
($1,$2,$3,$4) = split(/ /,$_);
$newdata = "$4,$3,$2";
open(OUT, ">$file");
print OUT "$newdata\n":
close(OUT);
}
exit;

これを走らせると
Modification of a read-only value attempted at split.cgi line 9.
と split の部分にエラーが出てしまいます。
どうしたらいいんでしょうか?
375nobodyさん:02/12/11 22:15 ID:qA0+bOBO
>>374
$1とか$2というのはマッチの特殊変数。
任意の値を代入することは出来ない。
変数名を別なのに変えるべし。
376nobodyさん:02/12/11 22:22 ID:???
>>373
もしくはヘビーユーザー( ´∀`)

>>374
同じファイル2回もopenするのは無駄っぽいから、
>>331(の下のやつ)みたいに1回にまとめた方がいいかもね。
377nobodyさん:02/12/11 22:26 ID:???
っていうかforeachの中でopenしてんのかぁ・・(´Д`;)
378374:02/12/11 22:34 ID:???
やっぱり OPEN させすぎですかね?(;´Д`)
とりあえず、出来ました。ありがとうです。
chomp(だっけ?) だかなんだかを使ってやるやり方があったような…
379nobodyさん:02/12/11 22:47 ID:???
>374
つーか、chomp使ってないから、できたファイルは意図したようにはなってないはずだが?
380ありゃ:02/12/11 23:15 ID:pgarahTm
すみません、ハッシュの全データの全角スペースを
削除したいのですが、
foreach (values %array){
s/ //g;
print "$_\n";
}
とした場合と、
foreach (values %array){s/ //g;}
foreach (values %array){print "$_\n";}
とした場合、私のローカル環境(パールのバージョン:5.6.0 built for i386-linux)
では、同じ結果が出るのですが、ほとんどのレンタルサーバ上で
実行すると、違った結果が出力されてしまいます。
なぜでしょう?
}

381353:02/12/12 00:03 ID:???
>>354
レス、サンクスです。

>モードは"+>"だよね。そのコードからすると。
"+>"と"+<"は意味は同じですよね?ちなみに僕は"+<"です。

open(FILE,"xxxx");
@file = ();
push @file, scalar <FILE> for 0..8;
seek(FILE,0,0);
print FILE "zzzz";
print = @file;
close(FILE);

こんな感じでいいんですよね?
いまいち”scalar <FILE> for 0..8”この辺の書き方が曖昧にしか理解できていないど、
本でも読んで理解したいと思います。

382nobodyさん:02/12/12 00:04 ID:???
そんなバナナ
383nobodyさん:02/12/12 00:53 ID:???
まさか、スクリプトとテスト用データの文字コードが違ってるとかの
話じゃないよね? っていうか「違った結果」の
希望とする値
実際の結果
の両方が見たいんですけど。
384nobodyさん:02/12/12 01:25 ID:ZGG2sBOp
>>381
違うよ。
"+>"は内容を消す。
"+<"は内容がそのまま残ってしまう。
素直に一旦読んだ後書き込みで開き直した方がいい。
385ありゃ:02/12/12 01:56 ID:DcSt6eP2
>>383
すみません、
%array = ('one' => '0 1','two' => '0 2','three' =>
'0 3');
とした場合、希望する結果は01と02と03が表示されることで、
私のローカル環境(パールのバージョン:5.6.0)
では、上下どちらの書き方でも同じ結果が出ますが、
実験した複数のサーバでは、
上の場合では0 1と0 2と0 3が表示され、
下の場合では01と02と03が表示されてしまいます。
実験したサーバのひとつは、パールのバージョンが5.0
だったので、単にバージョンの違いでしょうか・・・。
386Q1:02/12/12 03:43 ID:???
質問です。
ランダムリンクを作成して、
処理で
print "Location: http://xxxx.xx.xx/\n\n";
として飛ばしているのですが、
サンプルで自分のホームページを登録したのですが、
試して見ると、 302 FOUNDと表示されます。
この処理はアンカータグを使い、getの処理で呼び出しているのですが、
呼び出すページと飛ぶページが同じだと、302が表示される様なのですが、
これを回避する方法はないでしょうか。
「302を表示させずに、そのページへ飛ぶ。」というのは可能でしょうか。
387マリモーマ:02/12/12 05:04 ID:ItnO3SiH
メタタグで 飛ばしてみたら?
&header;
print "<meta http-equiv=refresh content=0;url=http://$url>";
exit;
388Q1:02/12/12 05:39 ID:???
ありがとうございます。やはり、それしかないですかね。
検討してみます。
ありがとうございました。
389nobodyさん:02/12/12 09:19 ID:???
質問です。いまフリーのスクリプトを見て勉強中なのですが

> if ($mode %2 != 1) {

っていうのがあるんですけど、これの %2 って何ですか?
390nobodyさん:02/12/12 09:23 ID:???
>>389
2で割った余り。
$modeを2で割って余りが1じゃなかったら
= $modeが偶数なら の意味だね。
391nobodyさん:02/12/12 09:30 ID:???
>>386
ステータスヘッダ送ればいいじゃん。

print "Status: 200 OK\n";
392391:02/12/12 09:33 ID:???
あっダメだわ・・さ
393389:02/12/12 11:25 ID:???
>>390
>2で割った余り。
あっそうか。% と 2 がくっついてるので
「またPerlの記号的な記法か」と思ってしまいました。
ありがとうございます。
394nobodyさん:02/12/12 11:55 ID:???
sendmailでReturn-Pathがうまく入らないんですけどなぜですか。
395nobodyさん:02/12/12 12:09 ID:???
>>394
勝手に変えられないように設定してあるから。
396353:02/12/12 15:33 ID:???
>>381
と言うことは

open(IN,"<xxxxx");
flock(IN,2);
@file = ();
push @file, scalar <IN> for 0..8;
close(IN);
open(OUT, "+>xxxxx");
flock(OUT,2);
seek(OUT,0,0);
print OUT "zzzzz\n";
print OUT @file ;
close(OUT);

とした方が良いみたいですね。
なんとなくopenを2回するのは、あんまりいいことではないと思っていました。
"+<"と"+>"の違いも教えてもらって、感謝します。
397353:02/12/12 15:34 ID:???
>>384でした・・・
自分にレスした・・・
398nobodyさん:02/12/12 18:05 ID:???
>>395
誰が設定してるんですか?
399nobodyさん:02/12/12 18:32 ID:???
>>398

400336:02/12/12 19:14 ID:BLMNLzB2
エラーつぶせました!!<<レス下さった方ありがとう。
ここ間違ってました。
sub decode {
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("長すぎます"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

# S-JISコード変換
&jcode'convert(*value,'sjis');
}
}←このカッコを忘れていた。

エラーメッセージよりだいぶ上(^^;

・・・でも動かない。なんでだろう。
ファイルへの書き込みが出来ていないみたいなんですが。。。

>>344
それはここに書き込む時に付け加えたので問題ないです(^-^;
401336:02/12/12 19:18 ID:BLMNLzB2
この部分なんですが、
#入力された内容をファイルを作って保存する。
sub words {
$file = "./pass.txt";
if($in{'pass'} eq ""){ &error("設定できませんでした"); }
open PD, ">$file" or &error("システムエラー発生");
@pwd = ('a'..'z','A'..'Z','0'..'9','.','/','%');
srand;
$kw = $MIX[int(rand(@pwd))] . $MIX[int(rand(@pwd))];
$words = crypt("$in{'word'}", $kw);
print PD "$words";
close PD;
}
@pwdの変数をちょっと変えているんですが、これは使っては駄目ですか?
(%とか/とか。)
#参考にした掲示板スクリプトでは中身が9までしかないです。
#それ以降は私の付け加え。
402336:02/12/12 19:19 ID:BLMNLzB2
↑ファイルへの書き込み、を行うサブルーチンです。
403nobodyさん:02/12/12 19:51 ID:???
>>401
@MIXって @pwd じゃない?(別に@MIXがあるのかな)
あと、cryptの salt($kw) は '%' は使えません。
それ以外の64文字は使えるので、 int(rand(@pwd)) は int rand 64 でもOK。
404nobodyさん:02/12/12 20:01 ID:???
すみません。頭悪いのでアルゴリズムが浮かびません。

以下のようなsort したデータがあります。

名前,点数というデータの形(配列)です。

山田,28
山田,39
佐藤,94
加藤,83
加藤,28
加藤,28
木下,23
木下,33

ここから、各人の合計点を出したいのですが、どうするのが良いでしょうか?
名前でuniqする方法は分かるのですが、点数を足していく方法がわかりません。
ヒントだけでよいので、お願いします。
405nobodyさん:02/12/12 20:07 ID:ZGG2sBOp
>>404
@dataに入ってるとして、
%hash=();
for (@data) { my @array = split/,/; $hash{$array[0]} += $array[1]}
で%hashに入る。
406nobodyさん:02/12/12 21:01 ID:???
>>404
すげーー!目からウロコ。thanx

12行位かかって書いてたのに、一行って!(for は foreachでなくてもOK?)
平均点(合計点 / 名前の出現回数)を出すには、

%hash=();
$no =1;
for (@data) {
my @array = split/,/;
$hash{$array[0]} += $array[1];

if ( $prev_name eq $array[0]){ $no ++; }else{ $no = 1; }
$avg = $hash{$array[0]} / $no;
$prev_name = $array[0];

}

??? とか? やっぱ頭悪い。
407nobodyさん:02/12/12 21:16 ID:???

割り算の後に小数点を下2桁まで表示したいのですが、

sprintf("%4.2f",$a) すると割り切れる時でも小数点以下に 3456.00
と出てしまいます。

割り切れない場合、 1234.56
割り切れる場合 1000

と表示するにはどうしたらよいのでしょうか?
408nobodyさん:02/12/12 21:20 ID:H3YHNRGs
最近、始めてPerlを使い出したんだけど
use strictってなんでみんな使わないの?
409nobodyさん:02/12/12 21:23 ID:???
>>407
普通に条件分岐するのはダメ?

>>408
みんな使ってると思うよ。
410nobodyさん:02/12/12 21:26 ID:???
>>409
そうかなあ。ちゃんとしたPerl使いならもちろん
使っているだろうけど、CGIだけのためにPerlやってる
人ってなんかそういうのあんまり意識してないような。。。
411nobodyさん:02/12/12 21:33 ID:???
>>407
$a =~ s/\.00$//;

>>410
巷で配布してるCGIはピンからキリまであるからなあ。
あと配布用にPerl4でも動くようにしてるところもあるでしょうし。
412nobodyさん:02/12/12 21:35 ID:???
>>411
>配布用にPerl4でも動くようにしてるところもあるでしょうし
なるほど。それもあるかもしれませんね。
413ななし:02/12/12 22:17 ID:???
隠しページがありそうなとこのソースみたら文字化けしていました。
なんとか方法は分かったんですが、ブラウザにドラッグするののやり方が
わかりません。おしえてください。おねがいします。
414nobodyさん:02/12/12 22:20 ID:???
・・・
415nobodyさん:02/12/12 22:21 ID:LUwqAPKo
>>407
ありがとうございます。
そういう方法しかないんですかね。結局。

あるサイトに

$a = int($a * 100)/100;

ってあったんですけど、これだと無駄が多そうですよね。

$a =~ s/\.00$//;
$a =~ s/\.0$//;

の方が早そうですね。
416nobodyさん:02/12/12 22:39 ID:???
>>413
日本語を勉強してください
大体の意図を頑張って汲み取ると、EUCとかの文字コードに対応してるエディタを使え、と
417nobodyさん:02/12/12 22:50 ID:rgoFlUwc
418:02/12/12 22:51 ID:rgoFlUwc
419nobodyさん:02/12/12 23:05 ID:???
>>415
int $a でも逝けるっぽい
420nobodyさん:02/12/12 23:16 ID:???
>419
>407を読み直した方がいいかも。
421nobodyさん:02/12/12 23:19 ID:i62/L17Z
sprintf($a=~s/\.0+//?"%4f":"%4.2f",$a)
422nobodyさん:02/12/13 00:03 ID:???
>>407
$b=sprintf('%4.2f', $a); a+=0;
423422:02/12/13 00:04 ID:???

$b+=0;
の間違い。
424nobodyさん:02/12/13 00:12 ID:???
>>406
ベタだけど、

%hash1=%hash2=();
for (@data) {
my @array = split/,/;
$hash1{$array[0]} += $array[1];
$hash2{$array[0]}++;
}
$hash1{$_} /= $hash2{$_} for keys %hash1;

でどうかな。(結果は%hash2)
425398:02/12/13 00:53 ID:???
誰か本当のことをおしえてください。
426nobodyさん:02/12/13 07:15 ID:???
>>425
偉い人 夜勤くらい
427424:02/12/13 08:15 ID:???
結果は%hash1でした。
428nobodyさん:02/12/13 11:37 ID:???
>>425
検索すれば理由は簡単に判りそうな気がするけど・・・

ttp://www.ryu.dyn.to/cgi-bin/tree.cgi?action=clip&no=771
※※※これは「Return-Path」のみの検索キーで見付けた※※※

注)自力で調べる努力を怠ってる人はまともに相手をして貰えません
429425:02/12/13 14:46 ID:???
>>428
あなたみたいな人が居るので甘えちゃうんです。ごめんなさい。
430nobodyさん:02/12/13 15:58 ID:???
>>407
の者ですが。色んな方法がありますね。

sprintf($a=~s/\.0+//?"%4f":"%4.2f",$a)



$b=sprintf('%4.2f', $a); $b+=0;

が一番シンプルそうです。

>>419
int $a ではいけないですよね?
431nobodyさん:02/12/13 17:39 ID:iG+3sspL
誕生日と名前フォームデータ($yyyy,$mm,$dd,$name)を
CSVで貯めるのですが、その際、CSVデータが誕生日$yyyy,$mm,$ddで
ソートしたいのですがいつソートするんでしょう?

1回そのまま書き込んで、もう一回呼んで、ソートしかないですか?
書き込む前にソートできますか?
432nobodyさん:02/12/13 18:07 ID:???
>>431
マルチ
433nobodyさん:02/12/13 18:16 ID:???
>>431
好きなように決めてくれ。
書き込みが追加書き込みなら、読んでからソートのほうが改造が楽。
基本的には頻度が少ないほうでソートするべきだろう。
434nobodyさん:02/12/13 19:29 ID:4EJmzvt/
>>403
@MIX??・・・は、ないです。
$MIXではなく@MIXにしないといけないのでしょうか。
あ、あと%の件ありがとうございました(^^;

で、書き直しましたが、これでもできてないです。
文法エラーとかInternalエラーとかは一切出ず、フォームに
言葉を入れてボタンを押すとリロードされます(これはちゃんとした処理)
動いているように見えるんですけど、PDへの書き込みが出来てません。
どこで引っかかっているのかな・・・。
cryptが動いていないのか、ファイル書き込みが動いていないのか。。。
435nobodyさん:02/12/13 19:54 ID:???
>>434
$MIX を $pwd でどう?
それ以外は問題なさそうだけど。
436nobodyさん:02/12/13 20:12 ID:???
>>434
そもそも、
$kw = $MIX[int(rand(@pwd))] . $MIX[int(rand(@pwd))];
は、
$kw = $pwd[int(rand(64))] . $pwd[int(rand(64))];
であるべきでは?
あと、
print PD "$words";
は、何かセパレータを入れておくべきかも?
例:
print PD "$words\n";
13文字ずつで切り出せばよいけれども。
437nobodyさん:02/12/13 20:13 ID:???
今掲示板を作成中で、よくある「次の何件」と言うやつを付けようと思って試行錯誤しているところなんですが、僕の今のスキルでは以下の物を書くのがやっとでした。
これはちょうど表示部分のところです。

#このスクリプトの名前,"bbs.cgi"
$pagemax = "1ページの表示数";
$file = "データファイル";

open(OUT, "<$file");
flock(OUT,2);
@view = <OUT>;
$log = @view;
if($ARGV[0] =~ /\d{1,3}/){
print @view[$ARGV[0]..$ARGV[0]+$pagemax];
$ARGV[0] += ++$pagemax;
if($ARGV[0] < $log){
print "<a href=\"bbs.cgi?$ARGV[0]\">NEXT</a>";
}
}else{
print @view[0..$pagemax];
if($log > $pagemax+1){
$pagemax++;
print "<a href=\"file.cgi?$pagemax\">NEXT</a>";
}
}
close(OUT);

とりあえずこれで動作はしたんですが、もっとスマートな方法はないですかね?何かすごく効率が悪そうなんで。
438nobodyさん:02/12/14 01:20 ID:???
25歳。
去年まで金無し君だったけど、オンラインカジノとパチンコで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、1ドル以上のチップを買えば30ドル(4000円くらい)貰える。
もらうだけもらってプレイせずに換金することもできるし、ルーレットで赤か黒に
思い切って賭けてしまえば50パーセントで二倍になる。
金なきゃオフラインでゲームすればいいだけ。暇つぶしになる。
ビデオポーカーとかスロとか色々あるのでマジでお勧め。
http://www.imperialcasino.com/~1kl5/japanese/
439nobodyさん:02/12/14 11:40 ID:???
perl で \nで区切られたログファイルを読み込みたいんですが
無駄なところは読み込みたくないので
何行目〜何行目 を ハンドルに放り込む方法はないのでしょうか?
440439:02/12/14 11:57 ID:???
配列使わないでやるのは無理なのかな?
ちょっとログがMB級あるんで
必要なところだけ読み込めたら楽なんだけど
441nobodyさん:02/12/14 12:20 ID:???
>440
原始的な方法でいいなら、100〜200行の場合。

$from = 100;
$to = 200;
open(IN,$file);
foreach $l(1 .. $from-1){<IN>;}
foreach $l($from .. $to){push(@data,<IN>);}
close(IN);

とか。

過去スレで出た方法だと、行の始まりのインデックスを別ファイルに保存して
readで呼び出すとかあったかな?
442nobodyさん:02/12/14 12:59 ID:???
行の頭から数B読み込む程度の方法しかないんじゃないかな。
データを展開しないで指定行に飛ぶのは無理っぽい。
443439:02/12/14 13:08 ID:2kNAmjtj
やっぱり難しいのかな?
ログファイルの記録方法を考え直して見ます
444nobodyさん:02/12/14 13:12 ID:???
漏れに不可能はないぜ
445nobodyさん:02/12/14 15:48 ID:???
>>439
$from = 100;
$to = 200;
$lines = $to - $from + 1;
open IN, "head -$to | tail -$lines |";
446439:02/12/14 17:39 ID:???
>>445
んん すまんです
とほほ見ながらやってるくらいのレベルなんで
ファイル名はどうすればいいんでしょうか?
447439:02/12/14 17:45 ID:???
>>445
open IN, "head -$to $filename | tail -$lines |";
で逝けそうですね ありがとうございます。
448nobodyさん:02/12/14 19:22 ID:???
俺がよくやるのは、

while (<IN>) {
next if ++$count < $from;
last if $count > $to;
...
}

ファイルの大きさと、指定範囲によるけど、
数千行ぐらいなら十分かなぁと。
パイプは起動コスト高いから、ベンチとって見るのがいいと思う。
perlメモにperlでtailするサンプルあったけど、正直大して早くなかった。
でもお勧めは、バークレイDBかな。。身も蓋も無いけど。
449nobodyさん:02/12/14 21:36 ID:???
フォームから送信された内容を溜めて
自動で、別窓で一覧にして永久的に表示するというのをやりたいのですが
どうしたらいいでしょう
450nobodyさん:02/12/14 21:46 ID:???
>>449
プリントアウトしてモニタ画面に張り付ける。
451nobodyさん:02/12/14 21:49 ID:???
あーあ
452nobodyさん:02/12/14 22:57 ID:???
>>407
激しく亀レスで悪いがprintf関数の変換指定に%gを使えば一発だよ。
453nobodyさん:02/12/14 23:14 ID:TSZsnHUG
電波少年は意味不明な終わり方をしたわけで・・・


An electric wave boy is the reason which carried out the way which finishes being incomprehensible...


電波少年は不可解な方法を実行した理由です...



微妙ですが
454nobodyさん:02/12/15 00:32 ID:???
誤爆?
455nobodyさん:02/12/15 01:03 ID:???
>>448
それ結構時間かかるよ
あまりスマートじゃないけど配列に読んだほうが
速い
456nobodyさん:02/12/15 02:18 ID:???
元データに行番号うっとけよ。
457nobodyさん:02/12/15 02:56 ID:N8e98l/q
$value{'key'}
$value{key}
この二つではどちらが書き方として正しいのでしょうか?
458nobodyさん:02/12/15 03:13 ID:brjLalCm
http://www.media-0.com/www/sal/
↑ここはどうですか?
459nobodyさん:02/12/15 03:13 ID:???
>>457
定数か文字列かに依る
460nobodyさん:02/12/15 04:02 ID:N8e98l/q
>>459
いちおうどちらの形にしても、同じ値が見れるので
どっちでもいいのかなと思ったのですが。。。
461nobodyさん:02/12/15 11:28 ID:???
Perl4対応なら$value{'key'}
perl5以降なら$value{key}
462nobodyさん:02/12/15 12:43 ID:???
>>461 ありがとうございます
なるほど、そうなんですか。よく頭に叩き込んでおきます。
463nobodyさん:02/12/15 21:08 ID:5VtRENUn
HTTPSクライアントを作りたいのですが、
参考になるサイト、書籍等ありますでしょうか?
464nobodyさん:02/12/15 22:17 ID:V1pBf1ml
すごくおかしな質問かもしれませんが
どなたか教えてください。

use strict;

print ${&return_html};

sub return_html {
 return \"<p>てすと</p>";
}

これを実行すると当然のごとく<p>てすと</p>が出力されますが、

1.この”<p>てすと</p>”が記憶される領域は変数を宣言して確保するのとどう違うのでしょうか。
2.これが記憶されている領域はいつまで読めることが保証されているのですか?
(読まれる可能性があるときまで保持して置くように勝手にコンパイルされるのですか?)
3.このように値の参照を返す方法は返す内容が膨大になった時に、
値そのものを返すよりパフォーマンスの点で期待できますか?

いまいち上手く説明できないので質問の意図がわからないかもしれませんがよろしくお願いします。
465nobodyさん:02/12/15 23:20 ID:1E3ue/P5
>>464
よくわからんけど・・

1. 無名のスカラーのリファレンスだという所。
2. 参照されている間、だから、printの次の行では、もう消滅している(読む手段がなくなるから)、かな??
3. 期待できる
466464:02/12/16 03:56 ID:???
なるほど、無名のスカラーなんですね。
それで納得いきました。
467nobodyさん:02/12/16 14:33 ID:P42iaa2L
textarea から入力したデータ(つまり掲示板みたいなの)の改行コードを置換して
上手く <p>文章</p> としてやりたいのですが、上手くいきません。
改行コードを </p><p> に置換しても、最初の部分で </p> が余ってしまうし。
どうにか上手く囲えないですかね?
468nobodyさん:02/12/16 14:51 ID:3MTAHZ/X
>>467
データを$detaに入れるとして

$deta = "<p>$deta</p>";
$deta =~ s/[\r\n]/<\/p>\n<p>/g;

これでダメ?
469nobodyさん:02/12/16 18:06 ID:y6GM3n5O
#タグのエスケープはしてあるものとして

#改行コードを統一
$str =~ s/\x0D\x0A/\n/g;
$str =~ s/\x0D/\n/g;
$str =~ s/\x0A/\n/g;

#行末の改行を削除
$str =~ s/\n+$//;

#空行があれば段落とみなす
$str =~ s/(.+?)(\n{2,}|$)/($_ = $1) =~ s!\n!<br \/>!gs; "<p>$_<\/p>\n";/gse;

これじゃダメかな。
470nobodyさん:02/12/16 20:20 ID:???
>>469
467じゃないけど、
いま改造してるヤツでありがたく使わせてもらいます。
うまくできました。

でもなんでそれでできるのか解らない漏れ・・・
471nobodyさん:02/12/16 23:10 ID:???
なんてーかさー、ソースに直接HTMLタグ打つのって気持ち悪いんだけど。
俺だけ?

CGI.pm使ったら、すっきりするような。
472nobodyさん:02/12/17 00:06 ID:x9yr2U77
CGI.pmだったらどのように書くのですか?
473471:02/12/17 00:56 ID:???
その前にさ、仕様をもっとはっきりさせようよ。

改行をそのまま<p></p>にするのか、それとも<br/>にするのか、
それとも二行以上あいているのを<p></p>にするのかとかさ。

その辺の処理をきちんとしないときちんとしたものはできないと思う。
474nobodyさん:02/12/17 01:07 ID:???
>>473
場当たり的にてきとうにやってるんでしょ。
475469:02/12/17 02:04 ID:???
perl(もしくは正規表現を使うほかの言語)を勉強している方なら、例をあげればあとは自分の望む仕様にできると思います。

こういう所にレスをつけるときは、答えを書くというより参考になればなと思って書いています。

今回の例だと少し正規表現いじれば、471さんの言うようなケースには合わせられるわけですし・・・
476nobodyさん:02/12/17 15:15 ID:/cJ6LV5I
perlで別サーバにあるファイルを読むにはどうすればいいでしょうか?
477nobodyさん:02/12/17 15:36 ID:???
>>476
use LWP::UserAgent;
とか
use Scket;
478nobodyさん:02/12/17 15:37 ID:???
×use Scket;
○use Socket;
479434:02/12/17 16:27 ID:dfOkftcJ
@pwdにしましたけど、やっぱり状況かわらないです・・・。
う〜ん、パスワードを別ファイルに保存するのは無理なのかな・・・。
480nobodyさん:02/12/17 16:59 ID:dfOkftcJ
掲示板のスクリプトで、投稿者の名前が管理人の名前じゃなかったらメール通知
する、っていうのをつけようとしています。
が、500エラーになってしまいました。こういうふうに書いたのですが、何が
間違っているでしょうか。
#設定部
#メール通知機能
#0:使用しない
#1:管理人の投稿も通知する
#2:管理人の投稿は通知しない
$mailing = 2;
#管理人の名前(メール通知2の時設定)
$adname = "管理人";
#sendmailのパス
$sendmail = '*****';
# 通知先
$mailto = '****@*****';
#ここまで。
#以下を「書きこみ処理」サブルーチンの一番最後に追加。
if ($mailing == 1) { &mail_to; }
elsif ($mailing == 2 && Form{'name'} ne "$adname") { &mail_to; }
}
↑サブルーチンの締めかっこ。
元になってる掲示板はLiteboard。
481nobodyさん:02/12/17 17:00 ID:???
下げるつもりだったのに・・・。
482nobodyさん:02/12/17 17:31 ID:???
>>479
>>401の $MIX[] を $pwd に変えて
sub words { ... };
&words;
でやったらちゃんとできた。
&wordsはちゃんと呼び出されてる?

もしかしたら crypt() がMD5専用かもしれないので(BSD系の場合?)、
$words = crypt($in{'word'}, '$1$' . $kw);
でやってみたら。
483nobodyさん:02/12/17 17:31 ID:???
>480
ttp://pc.2ch.net/test/read.cgi/php/1028193595/
【 スクリプト改造工房 PART 5 】
484nobodyさん:02/12/17 18:21 ID:???
>>480
> Form{'name'}
$Form{'name'}じゃないのか?
それと、なぜ$adnameを引用符でかこんでいるのかわからん。
485nobodyさん:02/12/17 18:44 ID:c+lM3tmR
-------変態・MTTどこでも-------

---●●●変態痴女を紹介致します。●●●---

例えば>欲求不満オマ●コヌレヌレ女・露出オナニー痴女・

フェラチオおしゃぶり女・ミニスカ・ノーパン娘・巨乳パイズリ娘・

アナルSEXおねだり娘・オマ〇コ弄られマン汁グチョグチョ女・

SM牝豚・緊縛・浣腸・スカトロ・等・・・刺激を求めています。

●●●学生・OL・主婦・モデル・牝豚・女王様・オカマ等・多数!●●●

 090-8002-8356番   
下のカタカナを小文字に変換してください。
  http://www.エムティーティー.jp/i
質問です。

既婚女性板
● ちょっと奥様今年のご主人のボーナスおいくら?
http://human.2ch.net/test/read.cgi/ms/1039952630/

のスレの書き込みのボーナスの金額をスマートに抜き出して
統計処理したいのです。どうすればいいでしょうか。
487nobodyさん:02/12/17 19:35 ID:???
system(">>486 自分で抜きだせ!");

こんな感じ。
>>487
アドバイスありがとうございます。
できれば、人間の手でやるのではなくて、
もっとスマートにできないものでしょうか?
489nobodyさん:02/12/17 20:02 ID:???
全角も混じってるし 書き方もバラバラだし 無理!
おやおやおや。
2ちゃんねらーにしては、あきらめが速いですね?
不可能を可能にするのがプログラマーでは?

ま、私自身もうまい方法が思いつかないので
ここで相談してるわけですが(@w餅
491nobodyさん:02/12/17 23:25 ID:???
>>486
こういうのはゴリゴリソースを書いていくしかないね。

.datを取得して、行に分解する。
その一行一行に対して以下の処理を行う。
・書き込みのみを抜き出し、
・全角数字を半角に変え(正規表現にひっかかるように)、
・半角カタカナを全角に変え(ひっかかりやすくするように)、
・数字の連続+「マン/マソ/万」をボーナス額と考えて正規表現で取得する。
・例外として「ゼロ」は0として扱う。
・以上の条件にあてはまらない時は、その行には金額が書き込まれていないと判断する。

こうして得られたデータを表示するなり別ファイルに書き出したりして保存する。

こういう流れだろうな。
後は実際にスクリプトを起こすだけだが、
それぐらいなら初心者と言ってもできるだろう?

んで、実行してみてうまく抜き出せない場合は、条件を見直す訳だ。箇条書きの部分な。

そんじゃ健闘を祈る。
>>491
おお。詳しい説明ありがとうございます。
やってみます。今後ともよろしくお願いします。
493木田:02/12/18 00:04 ID:???
ここにPHPのSourceがあります。


http://www.diohosting.com/jp
494nobodyさん:02/12/18 00:23 ID:???
なんかノーベル賞云々とかの額もあったけど、あれも足されるわけね。
495491:02/12/18 01:12 ID:???
>>494
そこまで読んでねーよー。
不都合があるなら、自分でなんとかするだろ。
496 :02/12/18 01:27 ID:uR+QrFPj
同じディレクトリにあるテキストファイルの一括置換をたいのですが
エラーがでてしまいます。検索してもおかしくなさそうに見えるのですが…

perl -e"s/aaaa/bbb/g;" *.txt

<エラーメッセージ>
Unquoted string "perl" may clash with future reserved word at
"C:\WINDOWS\デスクトップ\test.pl" line 1.

syntax error at "C:\WINDOWS\デスクトップ\test.pl" line 1, near "perl -e"
Unquoted string "txt" may clash with future reserved word at
"C:\WINDOWS\デスクトップ\test.pl" line 1.

"C:\WINDOWS\デスクトップ\test.pl" had compilation errors.

以上、よろしくお願いします。
497nobodyさん:02/12/18 01:31 ID:1Ah7QOiO
print << "HOGE"; から
HOGE
までの中で計算する方法ってなにか無いのでしょうか?
498nobodyさん:02/12/18 01:49 ID:cSfhj2ax
>>496-497
夜も更けて参りましたので今宵はお休み下さい。
499496:02/12/18 02:01 ID:???
>498
そうですか、ではまた明日伺います。お休みなさい。
500nobodyさん:02/12/18 03:35 ID:???
>>497
【Perl 】初心者コーナーPart5
http://corn.2ch.net/php/kako/988/988728069.html

ここの256あたりからやり方が書いてあるよ。
501nobodyさん:02/12/18 04:29 ID:???
>>496
それはスクリプトの中に書くものではなく、コマンドラインから実行するもの。

スタート>プログラム>MS-DOS プロンプト(またはコマンドプロンプト)
C:\WINDOWS>cd デスクトップ
C:\WINDOWS\デスクトップ>perl -e "s/aaaa/bbbb/g;" *.txt
502nobodyさん:02/12/18 06:19 ID:+CI84VDc
@a = ('一','二','三','四');
@a = sort {$a cmp $b} @a;
print @a;

実行すると、一三四二 となります。
漢字の数字って、どうやって並べるの?
できればこれを 一二三四 にしたいんだけど、
どうすればいい?
503nobodyさん:02/12/18 08:24 ID:???
>>502
漢数字は、漢字コード上では順番に並んでないから、ソートできないよ。
通常は普通の数字で処理して、表示するときに漢数字に変換するといい。
504nobodyさん:02/12/18 11:45 ID:8xOlQixN
教えて下さい。検索CGIを作ろうとしているのですが、
処理にいささか困ってます。送信フォームから来る情報は
検索文字 and検索(ラジオボタン)にするか 検索ファイル(チェックボックス) です。
and検索にするかと検索ファイルは情報が可変長なので困っています。
このような場合は受け取った情報を一つずつ解析していくのがベストなのでしょうか?
検索という性質上、0.1秒でも処理を早くしたいのでベストな手順を
教えていただけないでしょうか。お願いします。
505nobodyさん:02/12/18 11:48 ID:???
Perlの質問じゃねーな。
506nobodyさん:02/12/18 12:27 ID:???
処理を0.1秒でも早くしたいならCで書け。(定説
507nobodyさん:02/12/18 13:44 ID:dss5kZ4m
$t=~s/ //g;
とやっても全角スペースが消せません。sjis
簡単な正規表現か何か希望。
\Q\Eつけても、一時的にEUCにしてもだめでした。
いい正規表現かなにかないですか?
508nobodyさん:02/12/18 14:50 ID:???
509トリップはマイクロソフト ◆lKiTB20t66 :02/12/18 16:55 ID:9mUf2zGi
たのもー
配列の任意の場所に値を入れたらそれ以降をずらしてくれる
関数有りますか?
ex.
[a][b][c]
[b]と[c]のあいだに[x]を入れると
[a][b][x][c]
こういう風なイメージです。こんなのありますか?
510nobodyさん:02/12/18 16:58 ID:???
つまり3次元配列を4次元配列にしたいんです。
511トリップはマイクロソフト ◆lKiTB20t66 :02/12/18 17:00 ID:9mUf2zGi
>>510
いえいえ単次元配列で構いません
配列に値を入れたらそれ以降がずれてくれれば
それで構いません
512nobodyさん:02/12/18 17:17 ID:???
日本語を

s/"活動内容",//;

のように消去させると
<AD><A1>
のようなへんなコードが出来てしまいます。

日本語を安全に置換するにはどうすればいいでしょうか?



513いきぬきを:02/12/18 17:26 ID:xIqy3Dxb
みんなでいってあげよう。いかせてくれるから。

ダウンロード  世界標準
http://www.kisslovetoco.com/
514bloom:02/12/18 17:30 ID:fboSAjfA
515nobodyさん:02/12/18 17:39 ID:???
>509
splice
516 ◆lKiTB20t66 :02/12/18 17:54 ID:???
test
517nobodyさん:02/12/18 18:06 ID:???
>>512
EUCコードで試してみた?
518nobodyさん:02/12/18 18:12 ID:R82phE4X
すぐわかるPerlのP.17に載っているファイルの先頭に
 #! Perlのフルパス
を書くことによりファイル名を指定するだけで実行できるというのはLinuxでは出来ないのでしょうか?

519nobodyさん:02/12/18 18:32 ID:???
PerlでWin32のアプリを作成したいのですが、
コンパイラー、リファレンスの情報が探しても見つかりません。
ご存じの方はいらっしゃらないでしょうか?
520nobodyさん:02/12/18 18:57 ID:???
>>518
できる。パスが合ってるならパーミッションが間違ってる。
>>519
perl2exe
521518:02/12/18 19:08 ID:R82phE4X
>>520
実行権限を与えないと
Permission denied
の警告が出るんですよね?
実行権限を与える前も与えた後も
そんなコマンドねえよハゲみたいなメッセージがでるんです。
どうしたものでしょうか。
522nobodyさん:02/12/18 19:32 ID:???
>>521
そのディレクトリまで移動して
./hogehoge.cgi
って実行する
これでいけるのならPATHが通ってない
523nobodyさん:02/12/18 22:06 ID:???
DOSで作ったファイルをうpすると/usr/local/bin/perl^Mが無いので実行できない場合もある。
524496:02/12/19 00:44 ID:Duvh3oq4
>496です。教えていただいた方ありがとうございます。
さっそくプロンプト上で同じコマンドを打ち込んでみたのですが、
なぜかそんなファイルはないというエラーがでました。

試しに存在するファイル名を直接打ってみると、これは動作しました。
ワイルドカードが効かない原因はなんなのでしょうか。
525nobodyさん:02/12/19 06:29 ID:ZsaWrRnV
perl5.6のdbmopenで作ったファイルをperl5.8で読み書きしたいのですが、可能ですか?
どうやら仕様が変更されて読み込めない。。。
526 ◆hMJAPH9PWA :02/12/19 11:05 ID:???
>>524
Windowsでは(というかWindows標準のコマンドシェルでは)ワイルドカードは無意味だからね。
Googleで「Perl Windows Wildcard」で探してみるといい。

>>525
dbmopenは、インストールしてあるDBMモジュールから使用できるものを
動的に選ぶ仕様だから、5.6の方に標準以外のDBMモジュールをインストールしたなら
5.8にも同じモジュールをインストールしてみるといいかもしれない。
まぁ、仕様が変わったのかもしれないけど。
527 ◆hMJAPH9PWA :02/12/19 11:07 ID:???
525はマルチか…。
528496:02/12/19 13:52 ID:???
>526
なるほど、そうだったんですね。どうりでできないはずです。
perl windows wildcardやActive perl wildcardなどで
ググってみましたが、日本語サイトでは諦めている人の
情報しかありませんでした。
英語サイトを見ると解決法があるかなあ、
ここを見ろというサイトがありましたらどなたか教えて頂けませんか。
529 ◆hMJAPH9PWA :02/12/19 15:07 ID:???
>>528
http://www.google.co.jp/search?q=perl+windows+wildcard&ie=UTF-8&oe=UTF-8&hl=ja&lr=lang_ja
この一番上の"jperl"というタイトルのページで紹介されている"Wildcard.pm"なんてどうかな。
使い方は
perl -MWildcard script.pl *.txt
という感じで。

または、CPANにあるWin32::Autoglobでもいいね。
530496:02/12/19 16:11 ID:???
>528
ありがとうございます、ばっちり走りました!
実はwildcard.pmはDLしていたのですが、使い方の説明も
書いてなかったので、どうしていいか分からなかったのです。

インストール先も分からなかったのですが、フォルダを覗いていたら
libフォルダに.pmファイルがたくさんあったので、入れてみたら正解
だったようです。

3日渡りお世話になりまして、皆さんありがとうございました。
531518:02/12/19 17:17 ID:gnHgtnzE
>>522
ありがとうございます。
やってみましたところそれでも
command not found
となってしまいます。
Perlのパスはtype -a perlで表示されたものでいいんですよね?
532 ◆lKiTB20t66 :02/12/19 18:12 ID:???
>>531
ちゃんとファイルの先頭に「ドットスラッシュ」を書いてください。
ファイルネームだけだとコマンドパス(/binとか/usr/binね)にあるコマンドのみを探します。
533518:02/12/19 18:34 ID:gnHgtnzE
>>532
./ファイル名 と打ち込むのでいいのですか?
それでもやっぱり駄目ですね・・・。
どこかおかしいのかもしれないです。
534nobodyさん:02/12/19 18:43 ID:???
>>533
どうダメだったのかが知りたいが
perl  hogehoge.cgi
はちゃんと動作するのかい
535518:02/12/19 19:10 ID:gnHgtnzE
>>534
Perl ファイル名 だとちゃんと動作します。
保存してあるディレクトリに移動して
#! Perlのパス や ./ ファイル名 では command not foundとなります。
536nobodyさん:02/12/19 19:23 ID:sSjdESWg
誰か、C-BOARDの、./lib/file/tre.pl, msg.plを解読するスレ。
っていうのを作ってほしいな・・

鬼のようなコードになってる。。
537nobodyさん:02/12/19 19:49 ID:???
C-BOARDのコーディングを見ると、神の降臨を感じる。
同じことをやるにしても、あのコーディングは凡人にはできない。

解析ガンバレ>536
538nobodyさん:02/12/19 20:27 ID:???
C-BOARD(改造版)ってはじめてソース落としてみたけど、なんでこんなデカいの!?(450KB?)
ビビッタ
539nobodyさん:02/12/19 21:25 ID:???
ソースはでかいが使用メモリは小さく、処理は小粋に軽快。
540nobodyさん:02/12/19 22:58 ID:SoXwX8I8
perl でこんな感じのグラフを書くにはどうすればいいんでしょうか?
http://www.yakin.cc/ch2.gif
541nobodyさん:02/12/19 22:59 ID:lw7wMpYE

http://petitmomo.com/mm/

ここがちょっぴりエッチ系のめぐが運営している出会いサイトです。
もしよかったら使ってみて、、、
ヨロシクです。

めぐ(^o^)-☆
542nobodyさん:02/12/19 23:14 ID:ZsaWrRnV
別のスレに間違えて書いてしまったのでこっちに書きます

mother
hanako
father
taro
grandfather
kenzo
grandmother
hana

上記のようなテキストファイルがあります。
これを奇数番目をキーとし、偶数番目を値とする連想配列にしたいのですがどうしたらいいでしょうか?

つまり、
motherは、hanako
fatherは、taro
grandfatherは、kenzo
grandmotherは、hana
としたいのです。ご教授ください。
543nobodyさん:02/12/19 23:29 ID:???
544nobodyさん:02/12/19 23:31 ID:sSjdESWg
>>542
1.
%hash = map {
return chop($_);
} <TEXT>;

2.
while (<TEXT>) {
my $key = $_; chop($key);
my $value = <TEXT>; chop($value);
$hash{$key} = $value;
}

もうちょっとまともな手段で改行文字を消すこと。
545nobodyさん:02/12/19 23:37 ID:sSjdESWg
あぁ。全然だめっぽい・・
546nobodyさん:02/12/19 23:37 ID:???
>>543
はちょっと不親切のような気がする。
>>544
はちょっと冗長な気がする。

俺なら。

# ファイルを取得してリストに入れる。
open (IN, 'file.txt');
@line = <IN>;
close (IN);

# リストの全ての要素から、末尾の改行を取る。
chomp @line;

# そのまま代入する。
%hash = @line;

こんなもんかな。
547修正版:02/12/19 23:42 ID:sSjdESWg
%hash = map {
chop($_); $_;
} <TEXT>;
548nobodyさん:02/12/19 23:44 ID:sSjdESWg
>>546
こう書いたほうが面白いと思って・・・
549nobodyさん:02/12/19 23:47 ID:???
>>547
動くの?
550nobodyさん:02/12/20 00:01 ID:LLjHcAeK
読めない? map BLOCK LIST

あと、新バージョン。どちらかが空行で終了
while ((my $key = <> ) ne '' and (my $value = <>) ne '') {
chop $key, $value;
$hash{$key} = $value;
}

もしかしたら、ご希望の品はこっちかも。空行をkeyにしない
while (<TEXT>) {
 chop;
 next if ($_ eq '');

 my $key = $_;

 my $value = <TEXT>;
 chop($value);

 $hash{$key} = $value;
}
551nobodyさん:02/12/20 00:03 ID:???
あれれ。少し間違えてる。<>は<TEXT>の予定だった
552542:02/12/20 00:07 ID:???
>>546さんので完璧に動きました!
>>550さんのも試してみます!ただ、例外処理は特に考えなくて良いんです。
みなさん、ありがとうございました!
553544=547=550:02/12/20 00:15 ID:???
あ。そうそう。。554の2番や、550は、メモリを沢山使わないように書いたんだけど・・
そのあたりも考えて使ってね...

冗長とか言われてるけど。。
554nobodyさん:02/12/20 00:26 ID:???
grep {chomp} <text>;
555nobodyさん:02/12/20 00:38 ID:Av7thQVn
unixパスワードを使用して
そのサーバ上にあるアカウントとそのアカウントパスワードで
認証させるにはどうすればいいんでしょうか?
556nobodyさん:02/12/20 00:40 ID:Av7thQVn
あ 板違いでしたね・・すんません
557nobodyさん:02/12/20 00:47 ID:???
perlで掲示板を作っているのですが、

http://www.hoge.co.jp/index.html //comment

のように投稿者が書いた場合、//commentの部分の色を変えたいの
ですが、どのようにしたらいいのでしょうか?
正規表現を使って、取り出した文字列をタグで挟んだ形にしてやるという
ことはわかるんですが、 //commentの部分の取り出し方がわかりません。
お教え願えないでしょうか。お願い致します。
558nobodyさん:02/12/20 01:03 ID:???
$ echo http://www.example.com/index.html //comment |
perl -pe 's{\s(//.*$)}{ <tag>$1</tag>}'
http://www.example.com/index.html <tag>//comment</tag>

で、どうでしょ。
559nobodyさん:02/12/20 01:03 ID:iYZ6MU3U
ろくな例ではないけど
$str =~ s|([\s]+)(//[\S]+)|$1<tag>$2</tag>|g;
$str =~ s|^(//[\S]+)|<tag>$1</tag>|g;
こんな感じかしら。
正規表現苦手。
560nobodyさん:02/12/20 01:42 ID:4aAUDwG2
>>558さん >>559さん
レスありがとうございます。
んー、どうもうまくいかないです。

$value =~ s~([\s]+)(//[\S]+)~$1<span class="comment">$2</span>~isg;
$value =~ s~^(//[\S]+)~<span class ="comment">$1</span>~isg;

と記述してみましたが変化なしです。
どうもとりだせてないようです。
^(//[\S]+)の部分を書き換えると部分的には色が変わるのでタグはあってるんですが。
どこに問題ありでしょうか?
561nobodyさん:02/12/20 02:00 ID:p0zZgi4w
$value =~ s|([^:])(//[\S]+)|$1<tag>$2</tag>|g;

562nobodyさん:02/12/20 02:11 ID:???
こんなのはどぉ?
$value =~ s/(?<!http:)(\/\/.+)$/<a>$1<\/a>/;
563nobodyさん:02/12/20 02:11 ID:4aAUDwG2
>>561
ありがとうございます〜。
できましたー。これで今日はゆっくり寝られます。

>>558さん >>559さん >>561さん
ご協力ありがとうございました。
564nobodyさん:02/12/20 02:18 ID:4aAUDwG2
>>562
レスありがとうございます。
なるほど、こういうふうにすればいいんですね。
バッチリです。勉強になりました。
ありがとうございました^^。
565519:02/12/20 08:51 ID:???
>>520
ありがとうございました。
遅れてスマソ
566nobodyさん:02/12/20 11:52 ID:???
perlのスクリプトで、他のホスト(ローカル上)にあるファイルの有無を確認する
スクリプトを組みたいのですが、出来る限り動作の軽い物にしたいと思っています。

単純に
if(-e $ARGV[0]){
print "ok";
}else{
print "no";
}
のようにしようと思っていたのですが、-eでは他のホストのものは
調べられないそうですね。
他のホストを調べられ、かつ軽くする方法はありますか?
567566:02/12/20 11:56 ID:???
すいません、質問追記。

それをイントラのweb上で、formにファイル名入れて確認させる形にするつもりです。
ので、実際には$ADGV[0]とかにはならないと思います。
568nobodyさん:02/12/20 12:21 ID:???
>>567
404 Not Found
ってレスポンスを拾ってくればよいこと。(HTTPのばやい)
569nobodyさん:02/12/20 12:24 ID:???
>>566
他のホストでhttpサーバとかFTPサーバが動いていてそのファイルにアクセスできるなら可能。
570nobodyさん:02/12/20 12:51 ID:kZj4R1Az
連想配列から指定した要素を取り除くにはどうすればいいでしょうか?
添え字で指定したいのですが、
ループ処理で何番目かを自分で取得するしかないんでしょうか
571nobodyさん:02/12/20 13:13 ID:???
聞いてください!!

まえにココで、質問したのですが、
いま、過去ログに行っていて読めません。

もう一回質問します。


ディレクトリにある全てのファイルから
最後の3行を取り除くのにはどうすればいいでしょうか?

始めの3行ならば
% perl -ne 'print unless 1..3;' *.txt

でいいはずです。
572566:02/12/20 13:31 ID:???
>>569
逆に言うと、動いてなきゃ出来ないって事ですか…
connectとか使うしかないんですかね。

どもでした〜。
573nobodyさん:02/12/20 14:01 ID:???
>>570
delete(key);

内部ではループで回してると思いますが。
574nobodyさん:02/12/20 14:14 ID:???
とりあえず、エレガントな解が出てくるまでは、

ファイル読み込み
N=行数カウント
1..(N-3)まで出力

こんなスクリプトで我慢汁!
575nobodyさん:02/12/20 14:34 ID:???
聞いて聞いて!!

谷口 腕太 タニグチ ワンタ 1977年生まれ

谷口 腕太,タニグチ ワンタ,1977年生まれ
に置換したいです!!!

"2つめの全角スペース"→","
"4つめの全角スペース"→","
という風に置換するにはどうすればいいのでしょうか?


そんなことできますか??


576570:02/12/20 14:51 ID:kZj4R1Az
>>573
ありがとん

ループでやってるとさすがにコードが長くなるんで
助かったわ〜
577nobodyさん:02/12/20 15:01 ID:N/iHD9mS
my $test="入力テスト";
$test = jcode($test)->jis;
print jcode($test)->mime_encode;

はできるのに、

my $test="入力テスト";
print jcode($test)->jis->mime_encode;

すると、
Can't locate object method "jis" via package "NO%F%9%H"
って怒られる。

なぜ?
578nobodyさん:02/12/20 15:05 ID:???
>>577
jcode($test)->jis の返値はJcodeのオブジェクトじゃないもんで。
579nobodyさん:02/12/20 17:03 ID:AHOklkZ9
<select name="\$box">
<option>
<option selected value=$data[1]>$out[0]
<option value="0">yes
<option value="1">no
     <option value="2">ok

</select>

$data[1]には0,1,2が入っていて
$out[0]にはyes,no,ok が入っています。

これを画面表示させると(仮に$data[1]=1,$out[0]=noとする)
______
|no | ←当然ながらここに<option selected value=$data[1]>$out[0]
|yes |
|no |
|ok |
~~~~~~

こんな感じで画面にでてしまうんですが。

これをfor文でまわして同じヤツは表示しないで
($data[1]=1,$out[0]=no)のときだったらselectedをつけて表示させる

______
|yes |
|no |←ここに<option selected value=$data[1]>$out[0]
|ok |
~~~~~~

こんな感じでやるにはどうしたらいいんでしょうか?
580nobodyさん:02/12/20 17:19 ID:???
>>579
$data[1]に0,1,2ガハウィッテイウィルノカ?
ヲマエハバカカ?
581579:02/12/20 17:26 ID:AHOklkZ9
$data[1]に0,1,2のどれか1つが入っている。
ってことです。
あと
$out[0]にyes,no,ok のどれか1つが入っている。
ってことです。
書き方がおかしくてすみません
582nobodyさん:02/12/20 17:29 ID:???
あるDBからデータを呼び出して、それらを条件によって分類、
それをテキストファイルとして出力するスクリプトを組んだところ、
コマンドラインから実行すると問題なく動くのですが、
phpなどから呼び出すと、out of memoryとなってしまいます。
止まるは常に同じところなのですが、一体何が原因なのでしょうか?

phpからは
system ("hogehoge.pl $a $b $c");
というように動かしています。
$a等は、formのtype=textで指定するようになっていて、
pl側で表示させて、問題なく渡せていることは確認できたのですが・・・
583nobodyさん:02/12/20 17:31 ID:???
>>579
どう見てもPerlに見えないけど・・・
スマートじゃないがこんな感じ

@chknum = (0,1,2);
@chkstr = ('yes','no','ok');

$data[1] = 2;
$out[0] = "no";

$chkflg = 1;
for($i = 0 ; $i < 3 ; $i++) {
if($chknum[$i] == $data[1] && $chkstr[$i] eq $out[0]) {
$selected = "selected";
$chkflg = 0;
}
else {
$selected = "";
}
$outstr[$i] = "<option " . $selected . " value=" . $chknum[$i] . ">" . $chkstr[$i] . "\n";
}
if($chkflg) {
print "<option " . $selected . " value=" . $data[1] . ">" . $out[0] . "\n";
}
for($i = 0 ; $i < 3 ; $i++) {
print $outstr[$i];
}

ちなみに難しい処理は一つも無い・・・聞く前に自分で考えてみたのか?
584nobodyさん:02/12/20 18:04 ID:???
perlでBasic認証って出来ますか?
具体的には
/home/user1/user.pass に htpasswdで暗号化したのをアップしてもらって
user1で認証しようとした場合
/home/user1/user.pass をパスワードファイルに読み込みたいのですが...
585bloom:02/12/20 18:18 ID:V4mJQRW4
586nobodyさん:02/12/20 19:00 ID:???
>>584
とりあえず「BASIC認証」「Perl」でググルとかなり出てくるだが、それらを
調べてみたのか?
587nobodyさん:02/12/20 20:18 ID:???
>>586
愚問だな。
588579:02/12/20 20:35 ID:AHOklkZ9
>>583
どうもありがとうございました。

私はIDにAHOと出るくらいアホなんで
こんなのもわからないんです。
589579:02/12/20 20:41 ID:AHOklkZ9
if($chkflg) {
print "<option " . $selected . " value=" . $data[1] . ">" . $out[0] . "\n";
}

あと、この部分は何のためにあるんですか?
590nobodyさん:02/12/20 20:54 ID:Av7thQVn
setuidなperlプログラム作っているのですが
特定のディレクトリのサイズを取得するためにはどうすればいいんでしょうか?
unixプログラムならduで一発なんですが
setuidなもんで外部プログラムがうまく動かないっス
591nobodyさん:02/12/20 21:00 ID:mZ5RE2AI
すみません。。
>>540
よろしくお願いします、、
592nobodyさん:02/12/20 21:09 ID:???
グラフといえば、GD使うのどう?
593fg:02/12/20 22:02 ID:1ptZgAGx
The script did not produce proper HTTP headers. Please see the error log to see the detail of
the errors. Depending on the server configuration, you can also run this script under CGIWrap
debugging. Usually, either rename or link the script temporarily to a file which ends with .cgid
extension, or add a AddHandler cgi-script-debug .cgi line to your .htaccess file

このエラーはいったいなんでしょうか?
解読出来ませんでした。
imgboard v1.22 R6 です。
594571 :02/12/20 22:32 ID:???























聞いて
595571:02/12/20 22:32 ID:???
我慢汁ですか?
596nobodyさん:02/12/20 22:41 ID:???
>>595
@ARGVでも使えや。
597nobodyさん:02/12/20 22:46 ID:???
>>>595
>@ARGVでも使えや

具体的には。
598nobodyさん:02/12/20 23:31 ID:???
>>550
ごめん。勘違い。ちゃんと動く。悪かった。

槍田氏
599nobodyさん:02/12/20 23:34 ID:???
>>593
別に難しいことじゃない。
エラーの内容自体は最初の.までだ。
後はシステムからのありがたいアドバイス。
辞書ひけ。ヴォケ。
600546:02/12/20 23:40 ID:???
>>553
冗長とか言って悪い。俺は心情的な富豪的プログラミングの信奉者なんで。

>>554の出したヒントにより、3行に集約できた。

open ( IN, 'file' );
%hash = grep { chomp } <IN>;
close ( IN );

ソースは短ければ短いほどいい。と思う。
601595:02/12/21 00:05 ID:???
>>597
> 具体的には。
そんなもんまでしらんがな。
それくらいわれが調べたれや。
602546:02/12/21 00:14 ID:???
まだやってんのとかつっこまれそうだが。

open ( IN, 'file' );
$eval = join ( '', <IN> );
close ( IN );
$eval = '%hash = qw('.$eval.');';
eval $eval;

これなら、途中で余分な改行が入ってたり、
改行のかわりにタブや半角スペースが入っていても問題なく読み込める。

ま、そゆことで。
603nobodyさん:02/12/21 00:20 ID:???
>>575
$line = '谷口 腕太 タニグチ ワンタ 1977年生まれ';

@token = split / /, $line;
$line = "$token[0] $token[1]\,$token[2] $token[3]\,4token[4]";

print $line;
# 谷口 腕太,タニグチ ワンタ,1977年生まれ

これからは、こんな糞みたいなフォーマットで記録せずに、
最初からきっちり設計するんだぞ。
604nobodyさん:02/12/21 01:00 ID:???
%hash = split(/\s+/,join('',<IN>));
605nobodyさん:02/12/21 09:46 ID:???
>>575のようなヤシって
名前: 谷口, 腕太
フリガナ: タニグチ, ワンタ
生年: 1977
などというデータ仕込まれてパニックに陥るんだろうな。
606nobodyさん:02/12/21 09:57 ID:94hGjCxm
すみません。
入力されたsjisの日本語をcryptしてパスワードを発行することに
何か問題があるのでしょうか。

文字によってサーバーエラーになるとか、
文字によって暗号化したものにセキュリティホールが発生するとか。
文字の長さは同じです。
607nobodyさん:02/12/21 10:47 ID:???
気にするな
608nobodyさん:02/12/21 11:08 ID:???
Proxyの255.255.255.255:80
のポート80の部分ってどうやってわかるんですか?
$ENV{hoge}でしょうか?
609544=547=550:02/12/21 11:21 ID:???
>>608
普通は、ポートスキャンするしかない。と思う。

Via:に入ってたりするかもしれないけど・・・
610nobodyさん:02/12/21 11:31 ID:QdhN2u6I
うわ。。変な名前が・・
611お?:02/12/21 12:00 ID:SSXanoCB
初めまして。
SSIからCGIを呼び出したらクッキーの読み書きが出来ない問題もここでお聞きしてよろしいでしょうか?
単体では動くのですが、
execでCGIを呼び出すと引数が送れないので
include virtual="cgi-bin/xxx.cgi?yyy"
で呼んでます。
612nobodyさん:02/12/21 12:03 ID:???
>>611
クッキーってどうやって発行してるか知ってる?
それが分かってればSSIでダメな理由はすぐ分かるはずだけど。
613nobodyさん:02/12/21 12:12 ID:???
>>661
JavaScript
614お?:02/12/21 12:51 ID:???
>>612
早速のレスありがとうございます。
色々WEBで検索をかけて無理そうだとは思ったのですが、スキルの高いこちらの方々なら何か力技でも無いだろうかと思いまして。
やはり無理ですか。ありがとうございました。

>>613
私は普段javaSc切ってますので出来るだけ使いたくないんです。
615nobodyさん:02/12/21 16:42 ID:???
なにをインクルードして表示してるのかわからないけど
力技ていうなら<img>タグでクッキー発行する為だけの
イメージ吐いてみる。
616お?:02/12/21 22:34 ID:???
>>615
ありがとうございます。
取りあえず別の方法で逃げました。

imgタグで呼び出すのも試したのですが、他の方のスクリプトを参照して真似ても、どうも正常に動かないので投げました。
まだまだ基本が出来てません。
ありがとうございました。
617nobodyさん:02/12/22 01:52 ID:???
PerlでLWPモジュール使ってPOSTしたときにヘッダーを見る方法を教えてください。
618lopper:02/12/22 02:19 ID:iYo7T5on
Encode モジュール分からん。
Encode::JP には、
$euc_jp = encode("euc-jp", $utf8);
と書いてあるが、utf8 の文字列からしか変換できんのか?shiftjis 変換は
from_to( "shiftjis", "euc-jp", $strings )
をすれば出来るが、変換元文字コードを指定しなければならん。自動で判別して
文字コードを変換するにはどうさればいいのか?
619_gunzip ◆eiH/XdoCNg :02/12/22 03:54 ID:???
>>618
use Encode::Guess;
---------------------------
#!/usr/bin/env perl

use strict;
use Encode;
use Encode::Guess qw[euc-jp shiftjis 7bit-jis];

my $jpstring = "日本語文字列";
my $utf8_string = decode("Guess", $jpstring);
my $encode = guess_encoding($jpstring, qw[euc-jp shiftjis 7bit-jis]);
620lopper:02/12/22 13:08 ID:dY2TGdd7
やはりそうですか。Guess モジュールを使用しますよね。
Guess モジュールって $jpstring が短い文書の場合、判別つかずに
shiftjis or euc-jp
などと返してしまうのですよね。
たとえば上記を $jpstring = '結論' とすると判断がつかず
$encode の中身は 'shiftjis or euc-jp' が入ってきます。

やっぱりそういうものですか。
621nobodyさん:02/12/22 13:38 ID:y/X/HeeK
今Lock関数を勉強しているのですが、その中に

if ((-M $lockdir) * 86400 > 600)

このような処理があります。
変数の前に-Mや-Eなどを見かけるのですが、検索が掛けられませんのでこれら-をつけた英字の総称(?)を教えてください。
622nobodyさん:02/12/22 13:51 ID:???
>>621
ファイルテスト演算子
623621:02/12/22 14:02 ID:???
>>622
ありがとうございました。
検索を掛けても2件しかヒットしなかったですが、少し情報が入りましたのでなんとか自力で調べてみます。
ありがとうございました。
624nobodyさん:02/12/22 14:09 ID:???
>>621
ファイルテスト・オペレータ
man perlfuncに一覧が有る
625621:02/12/22 14:23 ID:???
>>624
ファイルテキスト演算子で検索していますた・・・
色々詳しく解説しているサイトを見つけましたのでゆっくり勉強します。

本当にありがとうございました。
626りゅう:02/12/22 17:29 ID:9RnyP9Mx
active perlを使ってcgi形式で
gifのグラフィックカウンターを作りたいんですけど。
全然、先が見えてきません。
どなたかご教授よろしくお願いします。
サイトを検索してもSSIのやつがほとんどなんです。
(´・ω・`)ショボーン
627nobodyさん:02/12/22 17:38 ID:???
628nobodyさん:02/12/22 18:11 ID:???
perl 画像 連結
てキーワードで検索かけよう。
とほほさんのgifcat.pl使うと簡単
629りゅう:02/12/22 18:42 ID:9RnyP9Mx
>>627
>>628

ありがとう!
630nobodyさん:02/12/22 19:57 ID:???
windows環境でPerlを勉強しています。
本にあったサンプルを記述して動かしてみたのですが、
何も表示されません。シンタックスエラーはないですし、
記述ミスもなさそうなのですが、windows環境では
走らないのでしょうか。

<目指す結果>
[ABCABC]
[WindowWindow]

<ソース>
while (<DATA>) {
chomp;
/ (\w{3}) (\w{3}) / && ($1 eq $2) && print "[$&]\n";
/ (\w{6}) (\w{6}) / && ($1 eq $2) && print "[$&]\n";
}

__END__
ABCABCDEFG
X-WindowWindows
631nobodyさん:02/12/22 19:58 ID:???
ActivePerl
HTTP-Lite
Time-HiRes
のインストール法がよくわからないんですけど
誰か教えてもらえませんか?
632nobodyさん:02/12/22 20:03 ID:???
>>630
/(\w{3})(\w{3})/ && ($1 eq $2) && print "[$&]\n";
/(\w{6})(\w{6})/ && ($1 eq $2) && print "[$&]\n";

でしょ。/ /の中の空白には意味があるよ。
633nobodyさん:02/12/22 20:09 ID:???
>632
あああああ、本当だ…。
もしあのままの記述だと、空白がないとマッチしないという事に
なるのですね。なるほど。
レスありがとうございます。とても勉強になりました。
634nobodyさん:02/12/22 20:30 ID:???
635nobodyさん:02/12/22 21:55 ID:ICjO1mQt
system,execで実行したプロセスのプロセスIDを得ることは出来ますか?
kill INT => $pid;したいんですが。
636yumi:02/12/22 23:28 ID:???
637nobodyさん:02/12/23 00:08 ID:???
>>635
systemは無理だろう。execならpidは代わらないからexecする前にpid取っとけ。
つーか、普通execする前にforkしたときに親の方で取っとく。
638nobodyさん:02/12/23 00:36 ID:3vP0jNwS
スレッド型掲示板をFLASHでやりたいと思います。
「ActionScript+CGIプログラミング」(ソフト バンク)ではスレッド
を立てられないのですが、少なくともデザインだけはオリジナルに
したいです。どこかにいい資料はないでしょうか?
639nobodyさん:02/12/23 01:21 ID:cOyl9Q7w
@compressedをgzipに渡して解凍させ、結果を受け取りたいのですが
どうもうまくいきません。

open GZIP, "| /usr/bin/gzip -d";
print GZIP @compressed;

こんな感じで実行してみましたが
結果が標準出力に出力されて、受け取れないです。
どうしたらいいですか?
640nobodyさん:02/12/23 01:27 ID:???
open GZIP, "| /usr/bin/gzip -d >file";
641nobodyさん:02/12/23 01:38 ID:cOyl9Q7w
>>640
レスありがとうございます。
なるほど、ファイルを経由させれば簡単ですね。
ですが、ファイルを経由しないで、解凍結果を受け取りたいのです。

@compress -> gzip -> file
file -> gzip @decompress
これは分かるのですが

@compress -> gzip -> @decompress
このように処理したいのです。もう一つお願いします。
642640:02/12/23 02:06 ID:???
うーん、調べたけどできないんじゃない?

パイプ "|" を使うと内部でフォークされて子プロセスの標準出力へ吐き出される

っぽい。。。
643nobodyさん:02/12/23 02:12 ID:cOyl9Q7w
わざわざ、調べていただきありがとうございました。

単純な「フォームから送られてきたGETデータ」で躓いてます。

<FORM METHOD="GET" ACTION="ans_check.cgi" TARGET="main_disp">
<INPUT TYPE="HIDDEN" NAME="question" VALUE="001">
Ans. <INPUT TYPE="TEXT" NAME="ans">番
<INPUT TYPE="HIDDEN" NAME="dummy" VALUE="ABCDEFGHIJKLMN">
<INPUT TYPE="SUBMIT" VALUE="プレゼント開封">
</FORM>

とした時(Ansには1234と記入・・・) $ENV{'QUERY_STRING'}の中身が

question=001&ans=1234&dummy=ABCDEFGHIJKLM

と、末尾1文字(たまに2文字)抜けてる時点でなんかヤバそうなのですが、さらに
このデータに対して
@buff = split(/&/, $ENV{'QUERY_STRING'});
とした際のbuffの中身が

buff[0] = 'question=00'
buff[1] = 'and=123'
buff[2] = 'dummy=ABCDEFGHIJKL'

とさらに末尾が1文字消えてしまっているのです……。
可能性…何が考えられるでしょうか? お力添えお願い致します。
追記:
さらに buff を = で split すると・・・

($key,$val) = split(/=/); の結果
$key='questio' $val='00'
$key='an' $val='123'
$key='dumm' $val='ABCDEFGHIJKL'

と今度は分割の先頭($key)が一文字抜ける……ワケわかりません。 T−T
646nobodyさん:02/12/23 10:41 ID:???
>644-645
ソースを示せ。
まずはそれからだ。

どうせchopかchompを入れちまってるだけだろう。
647nobodyさん:02/12/23 11:05 ID:???
>>641
#!/usr/bin/perl
$pid = open P, '-|';
die unless(defined($pid));
if ($pid) {
このブロックで受け取る
while (<P>) {
print;
}
} else {
close P;
my $pid2 = open GZIP, '|-';
die unless(defined($pid));
if ($pid2) {
このブロックで書く
print GZIP <STDIN>;
} else {
exec 'gzip', '-d';
}
}

if ($pid) {
} else {
このブロックは
close P;
open GZIP, 'gzip -d' || die;
print GZIP <STDIN>;
でもよい。
}
>>646
Σ(゜д゜ ) PHPとちがって末尾1文字なんでも消すのかッ > chop
ごめん、私が悪かった。 せっかくの休みなのにマヂでごめん。
649nobodyさん:02/12/23 11:46 ID:???
>>648
変数の扱いや、動作、振る舞いなど微妙に違うので幼虫居。
同じ漢字なのに、でんでん違う日本語と中国語みたいだから(w
650nobodyさん:02/12/23 12:21 ID:???
>>648
chompなら大丈夫でないか?
651nobodyさん:02/12/23 13:42 ID:???
あほな質問かもしれませんが、
『=>』
これってどういう動作をする物なんでしょうか?
宜しければ教えて下さい。お願いします。
652nobodyさん:02/12/23 13:46 ID:???
653nobodyさん:02/12/23 14:14 ID:???
p "10" #=>"10"
p 10 #=>10
print("こんにちは") #=>こんにちは
654nobodyさん:02/12/23 15:27 ID:UoY7N20E
=>は,と同じ。見かけが違うだけ
655nobodyさん:02/12/23 16:01 ID:???
なるほど=>そうなのか
656nobodyさん:02/12/23 16:19 ID:3KeBindS
今カウンタを作ってます。
今までずっとcount.cgiとかでそのままHTMLに数値を出力していたのですが、
<img>タグで呼び出すにはどうするんでしょうか?
count.cgiと呼び出すカウンターの違いはなんなんでしょうか?
どうかご教授お願いします。
657nobodyさん:02/12/23 16:51 ID:mDd0PRmu
どっかで答えた気がするが、PHPスレだったかも知れん...
今までのcount.cgiは「文字」を返す。
画像の場合は、<img src="img_count.cgi">で呼び出す。
img_count.cgiは、画像(の中身)を返すCGI。(readしてprint)
こうすれば、ブラウザがHTMLを読んだ後に画像としてimg_count.cgiを取りに行く。
658nobodyさん:02/12/23 17:31 ID:???
read(STDIN,$i,$ENV{CONTENT_LENGTH});
foreach(split(/&/,$i)){
    /=/;
    $in{$`} = $';
}

read(STDIN,$i,$ENV{CONTENT_LENGTH});
foreach(split(/&/,$i)){(
    $key,$val) = split(/=/,$_);
    $in{$key} = $val;
}

どちらが効率が良いでしょうか。
あんまり変わりません?
659nobodyさん:02/12/23 19:16 ID:???
配列に1行1文の要素が入っていて、/zzz/でマッチした1行を削除するにはどのようにしたら良いですか?
ヒントだけでもいいのでお願いします。
660nobodyさん:02/12/23 19:25 ID:???
>659
foreach(配列){
if(/xxx/でマッチしたら){その行を削除}
}
661nobodyさん:02/12/23 20:14 ID:???
>660
レスありがとうございます。
ループを使ってマッチしたら、その行を削除というのは分かるのですが、「その行を削除」の所が分からないんです・・・

while(@配列){
if($_ =! /zzz/){
push (@新しい配列,$_);
}
}
@配列 = @新しい配列;

こんな感じでしか思い付かないのですが、何かいい方法お願いします。
662nobodyさん:02/12/23 20:30 ID:???
@line = grep{ ! /zzz/} @line;
663nobodyさん:02/12/23 20:43 ID:???
>>654 嘘教えちゃいかんよ。
perl -w -e '%s = (a , 1); print $s{a};'
perl -w -e '%s = (a => 1); print $s{a};'
664641:02/12/23 20:50 ID:???
>>647
そのように外部プロセスと通信するのですか。

手持ちのWindows環境だと、'-|'は(forkを使っているみたいなので)
動きませんが、UNIX環境で試した所、見事に動いてくれました。

それと調べた所、IPC::Open2という標準モジュールでも
外部プロセスとの通信ができるようで、こちらを使うことにしました。

わざわざサンプルコードまで付けて頂き、ありがとうございました。
謎が一つ解けました。。
665nobodyさん:02/12/23 20:51 ID:???
>661
それで悪い理由は何?
=!の部分がわけわからんけど。
666nobodyさん:02/12/23 20:54 ID:???
プログラミングで速度は重要だが、それと同等以上に安定性と保守性は重要。
速度を軽視するのは良くないが、だからと言って、自分に不相応な高速化に挑んで安定性や保守性がなくなっては意味がない。
高速化のコードを教えられても、自分で保守しきれないと思ったら、自分でわかるやり方に戻すのも利口な人間の判断だよ。
プログラミングはタイムトライアルじゃないんだから。
667nobodyさん:02/12/23 21:11 ID:???
で、自分は利口だと、そう言いたいわけですね? :-)
668659:02/12/23 22:00 ID:???
>662
ありがとうございます。
その方が僕のよりかなり良さげですね。
>665
=!じゃなくて!=でした。
何か配列を無駄に出し入れしている気がしたので。
669nobodyさん:02/12/23 22:08 ID:???
!~ ですが・・
670nobodyさん:02/12/23 22:40 ID:ty3RFcqj
今a.cgiというページに入りいくつかのフォームを選択して
その選択した結果をb.cgiに送りb.cgiで結果を表示、ファイルに書き込み
をするということができています。

これをa.cgiで選択したものをa.cgiに送り表示、ファイルに書き込みさせたいのですが
どうやらhiddenという、コマンドをもちいて
1回目と2回目のページの閲覧を場合わけすればできるみたいなんですが
どうやればいいのですか?

<INPUT type="hidden" name="action" value="write">
こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
671nobodyさん:02/12/23 22:44 ID:ExE7e9sR
672nobodyさん:02/12/23 23:12 ID:???
>>670
> <INPUT type="hidden" name="action" value="write">
> こんなのを送信ボタンと一緒につけてやるみたいなんですが…。

書き込みフォームのなかにこれを入れておくと、CGI側では他のフォームと同じように
$in{action} という感じで値が取り出せる。(この場合、中身はもちろん write)
ただ単にCGIが呼ばれただけだと $in{action} の中身は空。
これをCGIの冒頭で判断して、表示だけするなり書き込みするなり処理を行う。
ちなみに"action"と"value"の部分は、他の name の中身と重複しなければ
好きな文字列でいいよ。
673nobodyさん:02/12/23 23:14 ID:/nqoyrjh
2ch風の掲示板作りたいんですけど、どうすればいいですか
674nobodyさん:02/12/23 23:15 ID:???
>>673
さがせや。そして自分好みに改造。それが一番楽。
675670:02/12/24 01:03 ID:o+cSQN2k
>>672


$in=$form{action};

if($in eq "write"){
&write_file;
}

<FORM METHOD="POST" ACTION="a.cgi">

<INPUT TYPE="submit" VALUE="実行">  
<INPUT TYPE="hidden" name="action" value="write">
 
こんな感じでやれば、ただページを閲覧した1回目の時は何もしないで
フォームを選択した2回目のときはifの中の&wite_fileを実行するってことでよいですか?
676nobodyさん:02/12/24 01:32 ID:???
>>675

微妙に甘い。それではwriteがあった場合、
write_fileが実行されるが、その後で本来の表示もされる。

if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
exit;

この方がよかないか?
677670=675:02/12/24 01:57 ID:o+cSQN2k
#!/local/bin/perl

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$cgi_url = './hid.cgi';
$in=$form{action};

if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}

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

<FORM METHOD="POST" ACTION="$cgi_url">
<tr><td align=right>選択<br></TD><td align=left>
<select name="box"><option><option value="1">yes<option value="0">no</select></td></tr><br>
<INPUT TYPE="submit" VALUE="実行">  
<INPUT TYPE="hidden" name="action" value="write">
END
sub write_file{print "2回目ですね<br>";}
sub read_file{print "1回目ですね<br>";}
exit;


これだとできないんですけどなぜですか?
678nobodyさん:02/12/24 02:03 ID:???
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ。
>良い回答は良い質問から。一緒に勉強しましょう。
679nobodyさん:02/12/24 02:28 ID:???
>>677
HTTPヘッダ吐く前にprintしたらいかんだろう。

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

をif の前に置く。
680nobodyさん:02/12/24 10:42 ID:???
>>588
アホを怒ったりはしないが自分で努力せずに「聞きゃいいや」って考え方に
教える気力を奪われる
>>589 はどういう場合に実行されるか考えれば貴方にとって必要か不必要か
判るはず。アホを自慢せずに自力で考えましょう
681nobodyさん:02/12/24 16:14 ID:V710Vuw6
大きな容量を扱うのできになります。
rindexって便利そうなのですが、
1バイトずつ戻ってくれるのでしょうか。
頭から調べなおすのでしょうか。
682nobodyさん:02/12/24 21:26 ID:0ZCnncs6
滅多に使わないクラスモジュールを、必要なときだけ読み込みたいと思い、
eval "use $module";
と書いてみました。
しかし、useとevalでぐぐってみてもヒットしません。
不安なので、ベターな方法を教えてください。
683nobodyさん:02/12/24 22:43 ID:???
>>682
それはできないよ
684nobodyさん:02/12/25 00:41 ID:???
>>682 man perlfunc
use Module LIST
use Module
Imports some semantics into the current package from the named module,
generally by aliasing certain subroutine or variable names into your package.
It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
685nobodyさん:02/12/26 02:12 ID:wZ43brtn
fork()した後、親プロセスと子プロセスで共通に使える変数(一方の変更が他方に影響を与える変数)
っていうのは使えませんかねぇ。
686685:02/12/26 02:53 ID:wZ43brtn
次のようにしても親の変更が子に反映されません。
実は685を書き込むまで参照を知りませんでした。
cのポインタみたいに理解しているのが間違いなのだろうか…?

$i = 774;
$ip = \$i;

$$ip++;

if( fork() ){
  while(1){
    print "親:$$ip\n";
    $$ip++;
    sleep(2);
  }
}else{
  sleep(1);
  while(1){
    print "子:$$ip\n";
    sleep(2);
  }
}
687nobodyさん:02/12/26 02:55 ID:WbFeNueP
split の逆を うまいことやる方法はないでしょうか?

$abc = "a&b&c";

@pairs = split (/&/, $abc);

↑このような場合に、@pairs から $abc を作り直したいのですが・・・

私では、@pairs の要素数を求めてから、$abc_2 = "$pairs[0]&$pairs[1]&$pairs[2]&・・・"; のようにやっていく方針しか立てられないのです・・・

うまいことやる方法があったら、教えてください。
688nobodyさん:02/12/26 03:09 ID:???
>>687
join
689687:02/12/26 03:11 ID:WbFeNueP
>>688
ごめんなさい・・・本当にありがとうございました・・・
690nobodyさん:02/12/26 04:56 ID:???
ちょいと質問です。
Image::Magick の利用で困っているので教えてください。
img.pl というファイルを実行すると下記のエラーがでます。
---
Can't load '/usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/Magick.so' for module Imag
e::Magick: cannot open shared object file: cannot load shared object file: No such file or d
irectory at /usr/lib/perl5/i386-linux/DynaLoader.pm line 206.
at img.cgi line 4
Compilation failed in require at img.cgi line 4.
BEGIN failed--compilation aborted at img.cgi line 4.
---
一応CUI上でImageMagick は利用可能で、
Perldoc Image::Magic でもマニュアルが見れてます。
Image::Magick をインストールするとデフォルトで
PerlMagickがインストールされるみたいですが、一応再度PerlMagickをインストールしてみたところ、
make test で下記のエラーを見つけました。
---
make: *** [test_dynamic] Error 2
なにか対処法があれば教えてください。
当方の環境
Linux Slackware 8.0
Perl 5.6.1
Image::Magick 5.5.3
691nobodyさん:02/12/26 04:57 ID:???
img.pl
---
#!/usr/bin/perl
use lib('/usr/local/lib/site_perl/5.6.0/i386-linux');
use Image::Magick;
$ImageFile = './test.jpg';
$ImageFile2= './test2.jpg';
$i = Image::Magick->new(size=>'320x240');
$x = $i->Read($ImageFile) ;warn "$x" if "$x";
$x = $i->Magnify() ;warn "$x" if "$x"; # 画像を縦横2倍に拡大
$x = $i->Write($ImageFile2);warn "$x" if "$x";
undef $i;
print "Content-type: text/html\n\n";
print "<html><a href=\"../imgtest/test.jpg\">使用前</a><br><a href=\"../imgtest/test2.jpg\">
使用後</a></html>\n";
exit;
692nobodyさん:02/12/26 04:59 ID:???
補足:
1 img.pl ではなく .cgi の間違いでした。
2 img.cgi の 4行目は use Image::Magick; になってます。

一度に投稿できなかったので分けて投稿しました。
板汚しですいません。
693nobodyさん:02/12/26 05:15 ID:???
自己解決?

vi /etc/ld.so.conf で /usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/ を追加したら
正常動作しました。

ImageMagickってこういうものなんでしょうか?^^;
694nobodyさん:02/12/26 11:23 ID:DQIeVDZ8
質問です。
ただCGIでHTMLを読み込んで表示させたいのですがどうすればよいでつか?
本当にただindex.htmを外から読み込んでそのまま表示させるだけです。
695nobodyさん:02/12/26 11:37 ID:???
>694
index.htmをファイルオープンして読み込んで表示するだけだが、
本当にそれしかしないなら、直接index.htmを表示しなさい。
696nobodyさん:02/12/26 11:48 ID:???
>>694
index.htmlを読み込んで出力するまえに
適切なヘッダも出力しなきゃだめよ。

Content-Type: text/html

とか
697nobodyさん:02/12/26 14:46 ID:???
>>694
なんだ、マルチポストじゃねえか。
別スレで答えて損した。てめえ氏ねよ。
698nobodyさん:02/12/26 18:04 ID:???
perlで一定時刻毎に処理をするようなスクリプトはどうすればよいですか?
処理するところは書けたのですが、「一定時刻に」というところでつまづいています。
699nobodyさん:02/12/26 18:04 ID:jnr3kh76
G(3);
sub G{
my $a=shift;
if($a>0){
G($a-1);
print"$a\n";
G($a-1);
}print" \#$a\n";
}
この処理の流れが良く理解できません
アドバイスなどお願いします
700nobodyさん:02/12/26 18:14 ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
701nobodyさん:02/12/26 18:45 ID:???
>>698
ループを作り時刻をチェックし希望の時刻になったら目当ての処理実行が単純
702698:02/12/26 18:54 ID:???
>>701 それだと常にperlが実行されている状態になりますよね?
703nobodyさん:02/12/26 19:00 ID:???
>698
ありがちな方法なら、「最後のアクセスと時間帯が違えば処理をする」という方法。
1時間に1回の方法なら、最後にアクセスした時の「時間(11時とか)」を保存しておき、
「前回の時間と違ったら(11時じゃなくなったら)処理をする」などでやる。
ただし、1時間以上アクセスがなかったら困ったりする事もある。

あと、鯖がかなり限られるがcronもある。
これはスレ違いだから自分で検索すれ。
704nobodyさん:02/12/26 21:25 ID:???
>>685
別プロセスのメモリ(変数)をいじることは不可能。
705nobodyさん:02/12/26 23:31 ID:???
>>699
普通に関数を再帰的に呼び出してるだけだが?
それ以上説明のしようがない。
706nobodyさん:02/12/27 00:12 ID:BkvjWsIw
厨質で申し訳ないんですが、
mod_perl を入れるために、use strict をしておこうと思ったんですが、

$| = 1;
$ENV{いろんな環境変数};

こういうのも my しないとだめなの?
707nobodyさん:02/12/27 00:15 ID:???
>>706
グローバル変数っしょ?

つぅか自分で試しても罰は当たらんと思われ・・・
708nobodyさん:02/12/27 00:54 ID:qm28R9Zo
https://self.0038.net/cgi-bin/fcc_tel_dialup_inquiry_usage_form.cgi.pl
フュージョン料金明細で必須項目をテキストにあらかじめ記入しておいて
それと現在の日時をもとに一発で明細結果がでるようする方法はあるでしょうか?
いちいち項目をコピペするのが面倒なんです。
709706:02/12/27 01:30 ID:BkvjWsIw
use strict; って、全部のファイルにしなあかんの?
例えば、
sample.cgi というCGIプログラムがあったとして

use strict;
$| = 1;
require './common.pl';

としていたとしよう。このとき、common.pl にも use strict は書くべきなのか。
それとも、sample.cgi の use strict を引き継いで、
common.pl には、何も書かなくても自動的に use strict されるのか?
710nobodyさん:02/12/27 01:33 ID:???
やってみればいーじゃんかよー
711699:02/12/27 01:36 ID:BtYEwdxr
実行した際に吐き出される値の流れが
途中からよ〜分かりません
どこで値が保持されどの様に順番に吐き出されるのか?
712nobodyさん:02/12/27 01:37 ID:???
common.plはなによ?
パッケージならパッケージ変数になってるし、
use strict; しなくてもそのスクリプト内でしか使わないなら、my とかしとけばいいだけじゃない?

>common.pl には、何も書かなくても自動的に use strict されるのか?
no!
713nobodyさん:02/12/27 02:31 ID:???
G(3);
sub G{
>>699
実行してみて。
これでわかる?

G(3);
sub G{
my $a=shift(@_);

my($space) = "";
for(my($i)=$a; $i<3; $i++){$space .= " ";}
print "$spaceここからG($a){\n";

if($a>0){
G($a-1);
print"$space$a\n";
G($a-1);
}
print"$space\#$a\n";
print "$space}ここまでG($a)\n";
}
714699:02/12/27 08:47 ID:???
>>713
ありがとう
なんとなく感じはつかめました
715nobodyさん:02/12/27 10:20 ID:???
>>701
その通り、常に実行ですね
>>703
で出てる様にcronを使う手がありますがユーザーに開放している鯖はかなり少な
いし、perl(スクリプト)での質問でしたので>>701としておきました

笑える手として、webサーバーがあるならhtmlより定期的に呼び出すとかもあるけ
ど、これもスレ違い
716nobodyさん:02/12/27 10:46 ID:???
>>715
答えが目の前にあるのにすれ違いか。おめでたいな。
717nobodyさん:02/12/27 20:28 ID:pRxcckDo
リファレンスについて、詳しく解説している日本語サイトを
ご存知の方がいらっしゃいましたら、是非教えてくださいまそ。
718nobodyさん:02/12/27 20:35 ID:yQoOgQCT
719nobodyさん:02/12/27 20:38 ID:???
>>717
javaの参照とかCのポインタとかをつまみ食いするのも手だと思う。
720nobodyさん:02/12/28 00:49 ID:???
>>719
なるほど。javaは出来ないので、Cの方をつまんで来ます。
721nobodyさん:02/12/28 01:10 ID:???
ハッシュのリファレンスで

foreach(keys %HASH){
・・・
}

に相当する処理ってできないんでしょうか?
できるのならやり方教えてホスイ。
722nobodyさん:02/12/28 01:34 ID:???
>>721
もっと具体的に書く方がよいラスイ。
723nobodyさん:02/12/28 01:39 ID:???
$ref= \%hash;
for (keys %$ref){
    print $_,"\n";
}
724りゅう:02/12/28 12:37 ID:7mOI1Cp3
参考書に書いてあった簡易掲示板を真似て作ってるんですが、
その本に付属していたCDのサンプルをLocalhostに置くと動くんですが、
自分で真似て作ったやつだと、エラーが出てしまいます。何回も見なおしたけど
違いが分かりません。どなたか違っている個所を教えてくれるとありがたいです。
725りゅう:02/12/28 12:38 ID:7mOI1Cp3
CDに入っているサンプル

#!/usr/local/bin/perl

#==========================================================
#メイン処理
#==========================================================
#ヘッダを表示する
&print_header;

#トップを表示する
&print_top;

#==========================================================
#ヘッダの表示
#==========================================================
sub print_header {
  print "Content-type: text/html\n\n";
   print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
   print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}

726りゅう:02/12/28 12:39 ID:7mOI1Cp3
#==========================================================
# 入力画面の表示
#==========================================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>Back To Homepage</a> ] <hr></center>\n";
 print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://></td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=massage wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}

_END_
727りゅう:02/12/28 12:40 ID:7mOI1Cp3
漏れが作ったものです。よろしくお願いします。(・A・)

#!/usr/local/bin/perl

#=========================================
#メイン処理
#=========================================
#ヘッダを表示する
&print_header;

#トップを表示する
&print_top;

#=========================================
# ヘッダの表示
#=========================================
sub print_header {
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}

728りゅう:02/12/28 12:41 ID:7mOI1Cp3
#=========================================
# 入力画面の表示
#=========================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://></td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=message wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}

_END_
729nobodyさん:02/12/28 13:15 ID:???
真似て作ったつーか、丸写ししただけかよ。短いスクリプトなんだから、
本と自分で打ったのを一行ごとに交互に並べ替えて見比べろ。
730nobodyさん:02/12/28 13:19 ID:???
>>724
どの段階でどういうエラーが出たのかな?

ちなみに単純に違いと言えば最後から3行目のnameが
「message」<=>「massage」
731nobodyさん:02/12/28 13:20 ID:???
>>730ミスった
最後から3行目のprintで・・・でした
732nobodyさん:02/12/28 13:30 ID:???
>>730
甘やかさん方が良い。それくらい自分で見つけられんと成長できない。
733nobodyさん:02/12/28 13:54 ID:aT8fBpaX
>>724
エラーメッセージ貼れ。
734nobodyさん:02/12/28 13:59 ID:???
>>732
とも思ったけど「何回も見なおしたけど」辺りが自分とかぶってつい(汗
しかもタイプミスって辺りが尚更かぶってしまた(激汗

しかし参考書もどうかと、完全にトラップでし>massage
735 :02/12/28 14:07 ID:???
736nobodyさん:02/12/28 17:51 ID:???
エラーメッセージも読めんような糞ったれに情けなんかかけるな。もったいない。
737nobodyさん:02/12/28 19:10 ID:tgcla43L
imgboardの話なのですが、削除にパスワードは不要ですよね?あれは一体どうやっているのでしょうか。

http://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi
↑現在、配布を中止しているようなのですが、なにかご存じの方、よろしくお願いします。

あ、よく知らないのですがimgboardはPerlではないかも・・・
738nobodyさん:02/12/28 19:15 ID:???
>>737
ここってさ、使う低脳用の板じゃないんだ。すまんな。
739737:02/12/28 19:20 ID:tgcla43L
ごめーん。
740nobodyさん:02/12/28 19:52 ID:???
「エラーメッセージ貼れ」といったところで、「Internal Server Errorって出てます」って
オチだろうな。

>>724
あんたの作ったやつ、うちのローカル環境で正常に動いたぞ。
741nobodyさん:02/12/28 19:54 ID:???
>>740
じゃあ、

#perl -w omaenokuso.cgi

とかの結果張ってもらう?
742nobodyさん:02/12/28 19:57 ID:???
解決した質問にいつまでしがみつきやがりますか?
743nobodyさん:02/12/28 21:06 ID:???
>>737
IPの第三セグメントまで一致したら削除する仕様
744721:02/12/28 23:54 ID:???
>>723
ありがとうございます!
それがやりたかったのです。
>>722分かりにくくてスマソ。
745nobodyさん:02/12/29 02:36 ID:9gTPrGHJ
"1" を "<" に、"2" を "<<" に、"3" を "<<<" に、・・・、"99" を "<<<・・・<<<" に・・・

こんな感じに置換したいのですが、どのようにすれば良いでしょうか?
例えば、これの逆なら、

for ($i = 99; $i >= 1; $i--)
{
 $text =~ s/(<){$i}/$i/g;
}

という感じにすれば良さそうなのですが・・・

for ($i = 99; $i >= 1; $i--)
{
 $text =~ s/$i/(<){$i}/g;
}

こう書くことができれば、いちばん早いんですが・・・
746nobodyさん:02/12/29 02:44 ID:VsdGeM22
>>745

$text=~s/(\d+)/"<"x$1/ge;

不具合がなくもないが。
747nobodyさん:02/12/29 03:06 ID:9gTPrGHJ
>>746
ありがとうございました!

ちなみに勉強不足で "\d+" が何を表しているのか分からなかったりするので、それを調べてから試してみます ^^;
748745 = 747 = 748:02/12/29 03:08 ID:9gTPrGHJ
\d は [0-9] でしたね ^^;
749nobodyさん:02/12/29 10:13 ID:???
不具合が気になる。
750nobodyさん:02/12/29 13:11 ID:apFJB7sH
$hoge = "hoge";
の状態で
$hoge の一番後ろに hageと言うのを足す時は
$hoge = $hoge."hage";
とやるしかないのでしょうか?
751nobodyさん:02/12/29 13:12 ID:???
>>750
まぁ、それが一番簡単じゃないの?何か不満?
752 ◆hMJAPH9PWA :02/12/29 13:23 ID:???
>>750
$hoge .= "hoge";
753nobodyさん:02/12/29 16:14 ID:???
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?

754nobodyさん:02/12/29 16:18 ID:???
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
755nobodyさん:02/12/29 17:32 ID:???
>>753-754 > /dev/null
756nobodyさん:02/12/29 17:39 ID:???
>>753
javaれや ブォケ
757nobodyさん:02/12/29 20:05 ID:???
>>753
とりあえず自分のローカルのOS(Win or Mac)でゲーム作れや。
それを移植する段階になってからこのスレで聞け。
758nobody:02/12/30 14:19 ID:???
こんにちは。
WinXP 上でActivePerl を使用しています。
This is perl, v5.6.1 built for MSWin32-x86-multi-thread

何故か do ループの中で last を使用するとエラーになります。

do {
last;
} while (1);

>Can't "last" outside a loop block

while (1) {
last;
}

では問題ありません。last はdo ループの中では使用できないのでしょうか?
last ラベル;
としてもエラーになってしまう…。
759nobodyさん:02/12/30 14:21 ID:???
>758
doループの意味わかってる?
ループの前にdo部分をやるから、その時点ではループになってないぞ。
760nobody:02/12/30 14:29 ID:???
>>759
if (1) { ほげほげ; }

ほげほげ if (1);

の違いみたいな物でしょうか…ちがうかな(苦笑

do ループの中ではlast 文は使えないのかな。
勉強していたサイトの1つの中に
ttp://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k02.htm
do ループの中でlast 使用できるような所がありますけれど…残念。

レスありがとうございます。
761nobodyさん:02/12/30 14:55 ID:???
do はあくまでブロック構文。
whileなどでループ修飾してもループブロックではない。
漏れはPerlはインタプリタ系、スクリプト系だからと妥協してる。
構造化BASICで出来るのもあるし、そのうち対応してくれるとうれしいYO
762nobodyさん:02/12/30 20:31 ID:8PVwYuQF
perlの関数内でstatic変数を宣言できるのでしょうか。
763nobodyさん:02/12/30 21:28 ID:neFLd3GG
>>759

LOOP:
 {
  do {
   last LOOP;
  }
 }
764nobodyさん:02/12/30 21:29 ID:neFLd3GG
あ。>>758だった。
765nobodyさん:02/12/30 21:32 ID:neFLd3GG
>>762
{
 my $static;
 sub hoge {
  $static++;
  return $static;
 }
}
766nobodyさん:02/12/30 21:35 ID:neFLd3GG
>>763
whileも抜けてた。。
767nobodyさん:02/12/31 00:21 ID:???
>>765
ブロック作るんだ。やってみます。ありがとうございます。
768カミ:02/12/31 04:26 ID:eTxvyq7o
>>762
use strict;

$aaaa::val = "Global" ;
↑この記法の変数がGlobal変数として扱われる。
769カミ:02/12/31 05:05 ID:eTxvyq7o
>>213
$test =<<"TEST";
ここから始まりです。
<FOO>
hogehogehoge
hogehogehoge
hogehogehoge
</FOO>
ここで終わりです。
TEST

という文字列から<HOGE>から</HOGE>までを抜き出したい場合。
Perlでどんな風にかきゃいいんでしょう?
------------------------------
<FOO>から</FOO>の間違いだね。

@picup=();
for (split("\n",$test)){
push (@picup) if /<FOO>/ .. /<\/FOO>/ ;
}

for $ol (@picup) {
print $ol."\n";
}

perl1行野郎参照
ttp://www13.cds.ne.jp/~ohsaru/perl/oneline.html
770カミ:02/12/31 05:18 ID:???
>>769 訂正
push (@picup) if /<FOO>/ .. /<\/FOO>/ ;
 ↓
push (@picup,$_) if /<FOO>/ .. /<\/FOO>/ ;
771カミ:02/12/31 06:16 ID:???
他で聞くところ無いので私にも教えてください。
某所のコードをモディファイして作成:try.pl
#try , throw ,catch の定義
sub try( &$ ) {
  my( $tryb, $catchb ) = @_;
  eval { &$tryb };
  if ( $@ ) {
   local $_ = $@;
   &$catchb;
  }
}
sub throw {
  die $_[0] ;
}
sub catch ( & ) {
  shift;
}
print "Throw cath Start\n";
try {
 if ($ARGV[0]=~/Exp1/) { throw "Excep1"; }
 elsif ($ARGV[0]=~/Exp2/) { throw "Excep2"; }
 print "Not throw\n";
}
catch {
/Excep1/ && do { print "catch1:$_\n";};
/Excep2/ && do { print "catch2:$_\n";};
};
772カミ:02/12/31 06:19 ID:???
>>771
これは思いの他思い通り動きましたが、、
sub try ( &$ ) の&$と
sub catch ( & ) の& の意味が分かりません。
773nobodyさん:02/12/31 09:04 ID:???
プロトタイプ厨 降臨

     ↓
774nobodyさん:02/12/31 09:06 ID:???
動きません。助けてください。

mhile($i = 1);
print "gohe"
775nobodyさん:02/12/31 09:19 ID:???
>>774
ネタ?
776nobodyさん:02/12/31 09:19 ID:???
>>775
じゃなきゃ困るだろう。
777nobodyさん:02/12/31 09:20 ID:f3dKkAkh
>>772
perlsubに書いてある。そのままサンプルで出てるよ。

http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
> 、&は“sub”キーワードや連続したカンマを要求 しないような無名サブルーチンを要求します。
778nobodyさん:02/12/31 09:31 ID:f3dKkAkh
777で、引用してきた和訳はわけわからん・・

An "&" requires an anonymous sub-
routine, which, if passed as the first argument, does not
require the "sub" keyword or a subsequent comma.

&のところに入るのは、無名関数だけど、1つ目の引数としてとられるなら、
subキーワードや、次の引数と区切るコンマは必要ない。
779nobodyさん:02/12/31 09:33 ID:???
>>778
&は(“sub”キーワードや連続したカンマを要求 しないような無名サブルーチン)を要求します。

って事じゃないの?subsequentの訳を思いっきり外してる気がするけれど
780nobodyさん:02/12/31 09:41 ID:f3dKkAkh
ぅ。自分はこう理解したんだけど・・

↓実験用
#!/usr/local/bin/perl

sub hoge (&&&) {
print join(':', @_) . "\n";
}

hoge {
}
sub {
},
sub {
};
781nobodyさん:02/12/31 11:10 ID:aM0LcM99
778が正解
782nobodyさん:02/12/31 11:47 ID:YVY0+rTm
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/mona/
783カミ:02/12/31 12:01 ID:???
>>777-781さん感謝。おかげで頭の中の霧が晴れて来ました。
頂いた内容からその意味コメントしました。この理解で宜しいか?
sub try( &$ ) {
  my( $tryb, $catchb ) = @_;#try内のブロック,catch含むブロックを設定(呼び側ではカンマで区切る必要なし)
        #共に引数として事前評価されているので実行コードとなっている?
  eval { &$tryb };#try内のブロックを実行(dieを判断したいので敢えてeval内で実行)
  if ( $@ ) {
   local $_ = $@;
   &$catchb;#cathブロック実行
  }
}
sub throw {
  die $_[0] ;
}
sub catch ( & ) {
  shift;#catch内のブロックをそのまま実行。左辺の無いshiftは引数をそのまま評価する?
}
print "Throw cath Start\n";
try {
 if ($ARGV[0]=~/Exp1/) { throw "Excep1"; }
 elsif ($ARGV[0]=~/Exp2/) { throw "Excep2"; }
 print "Not throw\n";
}
catch {
/Excep1/ && do { print "catch1:$_\n";};
/Excep2/ && do { print "catch2:$_\n";};
};
784nobodyさん:02/12/31 12:09 ID:f3dKkAkh
sub catch (&) {
shift;
}
は、shiftで、引数を一つもってきて、それが最後に評価したものだから、
それを戻り値として返す。っていう意味だね。
sub catch (&) {
return $_[0];
}
と同じ。
結論としては、無名関数のリファレンスが返される。
785nobodyさん:02/12/31 12:51 ID:???
perlの勉強をはじめて半年ほどたち、入門本程度の内容なら理解できました。
ちょっと難しめの本をぱらぱらと読んでみると、
パイプとか、mod_perlとか、よくわからないものばかり。しかも読んでもいまいちぴんとこない。
脱初心者のためにみなさんはどのような事をされましたかっ!?
786nobodyさん:02/12/31 12:55 ID:???
>>785
大げさなことしなきゃ入門書程度の知識で掲示板くらいは組めるからなぁ。
mod_系はlinuxの勉強してたときに覚えた。パイプはDOSの時名前だけ聞いて
これまたlinuxで本格的に使い始めた。
787カミ:02/12/31 14:19 ID:???
>>784氏ありがとう
てことは、実際ctach内のブロックはsub catch内で実行されるのでなく
sub try の&$catchb;にて戻ったレファレンスが実行されると考えればいいのだね。

PS
 ところでmod_perって何?
788nobodyさん:02/12/31 14:37 ID:???
俺も知りたい。mod_perって何?
789nobodyさん:02/12/31 14:51 ID:???
mod_perl だよ。
検索すれ。
790nobodyさん:02/12/31 15:01 ID:???
>>789
みんなmod_perlは知ってると思われ。
791nobodyさん:02/12/31 15:12 ID:TZQCX2rE
ソケットでFTP接続して2ch.txtがあるかないか調べる方法ってありますか?
792nobodyさん:02/12/31 15:17 ID:???
>>791
Socketパッケージはあるだろ。

で、何でhttpで行かないのか問いただして良いかい?
793791:02/12/31 15:19 ID:???
>>792
正直ー、ソケットの方とかあまり詳しくなかったです。
今からhttpでググッてきます。

794791:02/12/31 15:25 ID:???
ほんとは、FTPでログインをしてファイルを削除できればと試行錯誤しているんですが
for (1..10){
last if(FTP先の削除したいファイルが削除できたら)
削除処理
}
のような形にしたいんです。

ホウホウワカリマスデスカ?
795nobodyさん:02/12/31 15:27 ID:???
>>794
ごめん、何がしたいのか1から説明して。
796791:02/12/31 15:33 ID:???
>>795

1. FTPで指定されたホストにログイン
2. ディレクトリィの移動
3. ファイルを削除するまで削除処理を実行する
4. 削除完了後にログアウト

この一連の処理を行いたいです。
797nobodyさん:02/12/31 15:38 ID:???
>>796
いや、それを何に利用するのか。
798nobodyさん:02/12/31 17:34 ID:???
>>796
system(rm -rf /home/user/hoge/data);
じゃだめ?
799nobodyさん:03/01/01 12:49 ID:???
>>791
1 RFC959読む。他に拡張もあるが>>791の目的にはこれで充分だろう。
2 ftpをデバッグモードで動かしてRFCを理解する。
3 Net::FTPを入手して使う。
800nobodyさん:03/01/01 19:44 ID:???
もめでとー  >みんな

今年も過疎板でがんばろー (・□・)ノ
801nobodyさん:03/01/01 22:24 ID:lIl6EtKn
my $hash_ref =
 \(a => \@list_a,
   b => \@list_b,);

の場合、list_aの配列を取るにはどう書けばいいのですか?
802nobodyさん:03/01/01 22:48 ID:lIl6EtKn
すみません。
my @list_a = @{${$hash_ref}{a}};
で逝けました。
803nobodyさん:03/01/01 23:08 ID:???
>>802
ネタ?ヲタ?ヨタ?
804nobodyさん:03/01/01 23:17 ID:ItqiYY13
◆◇◆◇◆最新情報◆◇◆◇◆
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
805nobodyさん:03/01/01 23:31 ID:RvFz9efr
>>802
my @list_a = @{$hash_ref->{a}};
の方が普通・・だと思う。
806nobodyさん:03/01/01 23:33 ID:RvFz9efr
最初のも、、これの方がいい。

my $hash_ref = {
a => \@list_a,
b => \@list_b,
};
807nobodyさん:03/01/01 23:50 ID:RvFz9efr
なんかおかしいぞ・・・
(\$a, \$b, \$c)と、\($a, $b, $c)は同じ。つまり、

my $hash_ref =
\(a => \@list_a,
b => \@list_b,);
これは、(\'a', \\@list_a, \'b', \\@list_b)と同じだから、
左がスカラーだから、コンマ演算子で、、$hash_refには、最後の、
\\@list_bが入る
808nobodyさん:03/01/02 00:32 ID:???
>>807
うーわー
もう何がなんだか・・・
これだからPerlは(以下略
809nobodyさん:03/01/02 00:35 ID:???
>>808
すまんが同意。

Cのポインタは極めたぜ!とか自負してるレベルでは全然倒せないっす。。。
810nobodyさん:03/01/02 01:58 ID:???
>>809
char **a[10][20]へのポインタを宣言してみてください
811カミ:03/01/02 03:38 ID:???

例えば
$aaa = "aaa";
print ${aaa} ;#aaaが表示

このように変数名そのものは$と言う連想配列の要素らしい事がわかる
812nobodyさん:03/01/02 23:36 ID:L6yfXpSS
>>811
それはちょっと無理が・・

その書き方は、単純に、変数名の区切りをはっきりとさせる。というだけだね。
$aaa = "hogehoge";
print "test:$aaabbbccc"; #test:だけ表示
print "test:${aaa}bbbccc"; #test:hogehogebbbccc
813nobodyさん:03/01/02 23:54 ID:L6yfXpSS
>>808
わかりにくい部分は、、コンマ演算子の所かな。違うか。

$a = ('a', 'b', 'c'); #$aにはcが入る
$a = 'a', 'b', 'c'; #これは上の普通の書き方。$aにはcが入る
@a = ('a', 'b', 'c');
$a = @a; #これは$aには3が入る
814yani ◆saNSktNEdQ :03/01/03 00:28 ID:0E5Ge7qR
コンマ演算子の働きと言うよりは、list constructor では
と言ったほうがいいかも知れない。
qw(...)でも同じように働くから。
しかし本当のところはPerlのソースコードを読まないと分からないのかも知れない。
内部的にコンマ演算子使ってるかもしれないし。

815nobodyさん:03/01/03 00:57 ID:???
>>813
コンマ演算子は代入演算子より優先順位が低い。

$a = 'a', 'b', 'c'; # これはaが入る
@a = 'a', $b = 'b', 'c'; # これは @a = ('a'); $b = 'b'; 'c' と同じ
816813:03/01/03 01:13 ID:nupLg+Ov
うー知らんかった。単純に。優先順位についてもっと勉強するか・・
817nobodyさん:03/01/03 01:14 ID:???
>>816
()で囲めば解決。
818カミ:03/01/03 16:20 ID:???
>>812氏、確かにその解釈が正解の様です。
しかし、ちと違うが下の様な実験結果もしてみた。
$hash{array} = [ 1,2,3 ];
$s = scalar $hash{array} ;
if ($s =~/^ARRAY/ ) {
print "scalar :$s\n" ;
for (@{$s}) {
print $_."\n" ;
}
}
1;
これを実行
scalar :ARRAY(0x183f04c)
1
2
3

この場合 @と言う連想配列の要素にARRAY(0x183f04c)が有る様に思える。
819nobodyさん:03/01/03 17:36 ID:???
>>813
何が言いたいのかわからんのだが…。
@{$s} == @$s == ただのデリファレンス
じゃないのか?
820819:03/01/03 17:37 ID:???
間違い、>>813じゃなくて>>818
821nobodyさん:03/01/03 21:46 ID:nupLg+Ov
>>818
そんな難しいことしなくても、Data::Dumperを使うとざざーっと出してくれる

>>811でも変なこと言ってるけど、名前の部分が空っぽの記号だけの変数なんて存在しない。
>>812を読めばわかるじゃろ。
822nobodyさん:03/01/03 22:38 ID:???
>>811の理屈は面白いw
823nobodyさん:03/01/03 22:57 ID:???
どうやって実装しているかが分かれば…
824yani ◆saNSktNEdQ :03/01/04 00:02 ID:8PdubkBh
参考になるかどうか知らないが、%::っていうのがある。
825yani ◆saNSktNEdQ :03/01/04 00:03 ID:8PdubkBh
まあ、::が入ってるから、関係ないかな。
826カミ:03/01/04 00:38 ID:???
>>819-822 単なる参照外しした結果だった様ですね。
先の実験で私が感動したのは
$s = scalar $hash{array} ;して if ($s =~/^ARRAY/ ) {が真になる。

$sにはARRAY(XXXXX)というキーとなる値が入り
@{$s}にて@なる連想配列(配列の親玉の様な)から配列を参照できる。
この様に思えるコードが実行されたところです。

もちっと http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html を勉強します。

PS
 無名関数ってラムダですよね?
827カミ:03/01/04 16:41 ID:???
>>824 氏
その%::ってどう使うのですか?想像つきません。
828nobodyさん:03/01/04 17:29 ID:???
>>826
>$s = scalar $hash{array}

で$sにARRAY〜が入っているのは
scalarがリファレンスを返したりもするのですね。

>@{$s}にて@なる連想配列(配列の親玉の様な)から配列を参照できる。

@なる連想配列云々は普段使用している参照となにも変わらないような・・・

$s = \$hash{array};
for each (@$s) { etc... }

リファレンスが入っているのなら
@{$s} は @$sそのものですし。。
829nobodyさん:03/01/04 18:11 ID:???
>で$sにARRAY〜が入っているのは
で$sにARRAY〜が入っているのね。
の間違いです。ごめん。。

scalar がリファレンスを返したのは
= [1, 2, 3];
で定数配列? を代入させたからですか・・・

納得。
830nobodyさん:03/01/04 18:51 ID:???
>>829

my $a = ['aho'];
print $$a[0];
$$a[0] = 'baka';
print $$a[0];

って代入もできるから定数ではないYO
\[etc...]
で定数配列になる

この変数はアドレスだけで、特に名前は存在しないから
無名変数と言えなくもない

変数名はただのメモリアドレス識別子ともいえるから
特に強調することではないYO
831nobodyさん:03/01/04 19:08 ID:???
質問です。 $urlで指定したファイルを取得するプログラムを作ったのですが、正しいURLを入力していても404 Not Found等を返す事があり困っています。
404 Not Foundを返すファイルへの対処方法を教えてください。

正常 http://www.yahoo.com/index.html ダメ :http://www.google.co.jp/index.html

$url="http://www.yahoo.com/index.html";
$url =~ s/http\:\/\///g;
@list = split('/',$url);
$host = shift(@list);
$file = pop(@list);
push(@list,$file);
$path = join('/',@list);
$addr = (gethostbyname($host))[4];
$name = pack("S n a4 x8", 2, 80, $addr);
@data;
socket(S, 2, 1, 0);
connect(S, $name);
binmode(S);
select(S); $| = 1; select(stdout);
print S "GET /".$path." HTTP/1.0\r\n\r\n";
while (<S>) { push(@data,$_); }
close(S);

$delnum = 1;
foreach(@data){ $delnum++; if(/Content-Type:/){ last; } }
splice (@data,0,$delnum);
open OUT,">$file";
binmode OUT;
foreach $var(@data){ print OUT$var; }
close OUT;
832nobodyさん:03/01/04 19:49 ID:???
>>831
わざわざsocketを使っているのって凄いでつね。
どんな環境(OSなど)かは判りませんが、楽してモジュール使うとか、system 'wget -色々'; とか使った方が楽なような気がしまつでつ。
あと、UA送信した方がよいかもしれません。
それともPerlが、勝手に付けてくれるのかな?
(自鯖ではUA無しは即アク禁にしていまつ。)
833nobodyさん:03/01/04 19:50 ID:???
>>831
件の
http://www.google.co.jp/index.html
は・・・GETだけですと、302のLocationを返すみたいですね。
試してみた限りではHost: を送信するとウェプページが返ってきました。

print S "GET /".$path." HTTP/1.0\r\n";
print S "Host: hogehoge\r\n";
print S "\r\n";

グーグルではHost: もチェックしているようです。
834831:03/01/04 22:18 ID:BNGRljfr
>>832 さん
>>833 さん
レスありがとうございます。
ググルは御陰様で解決しました。
404を返していた(個人サイトなので公開は控えておきます)サーバは
RefererにHostを入れて送ることで正常に取得出来ました。
どうやら直リンクを禁止してたようです。

>system 'wget -色々';
窓ユーザーなのでPerlからUNIXのコマンドが使えるとは知りませんでした。
これを機会にUNIXの勉強をしようかと思います。

#改良版
print S "GET /".$path." HTTP/1.0\r\n";
print S "Accept: */*\r\n";
print S "Referer: http://".$host."\r\n";
print S "Accept-Language: ja\r\n";
print S "Accept-encoding: gzip, deflate\r\n";
print S "User-Agent: Mozilla/4.0\r\n";
print S "Connection: Keep-Alive\r\n";
print S "Host: ".$host."\r\n";
print S "\r\n";
835nobodyさん:03/01/04 22:27 ID:tgEtvNOB
>>827
場所をちゃんと指定した変数(?)を使わないといけない場合(use strict)に使う。かも。
%::a == %main::aだから・・
836偽PG:03/01/05 00:04 ID:X0VKDjVo
Perlで開発するのか分かりませんがご教授を。
オンラインで利用可能なツールの作成を考えている状況です。

あるWEBページがあります。
そのページには「IDNumber的な数字」「誕生国」「人名」が並んでいます。

上記はID=人名の関係です。
例)
ID=1 / 誕生国=日本 / 人名=豊臣秀吉
ID=2 / 誕生国=中国 / 人名=諸葛孔明

【考えているツールの流れ】
@入力フォームを用意して文章を入力する。
 (文章には不要情報も含まれている)

A文章中にIDが存在する場合、そのIDに該当する生まれ情報を
 指定WEBページより取得する。
 (WEBページの中にテーブルでID・誕生国・人名が並んでいる)

B取得した誕生国情報が日本3人・中国2人と複数存在した時には
 それぞれの誕生国の数をカウントする。

C結果をHTML形式にして表示させる。

ローカルの情報ではなくWEBページから情報を取得して
カウントする事は可能なのでしょうか?

いちいちWEBページの情報を参照するのが面倒だと思って
作成を考えた次第です。
方法等はちょっと思いつきに近いものがあります。
スレ違いなら申し訳ないです。
837nobodyさん:03/01/05 00:06 ID:???
>>836
環境によって読めない文字を平気で使う奴にWebプログラマとしての心得があるとはとても思えない。
838偽PG:03/01/05 00:15 ID:X0VKDjVo
機種依存文字については申し訳ないです。
これからWEBプログラムを学ぼうとしたのに
こんな所で突っ込まれては俺もダメですな。マジ勉強しなきゃ。
839nobodyさん:03/01/05 00:17 ID:???
>>838
ああ、すまんな。言い過ぎた。

>ローカルの情報ではなくWEBページから情報を取得して
>カウントする事は可能なのでしょうか?

サーバが外にコネクションを張ることを許可しているならできる。
840nobodyさん:03/01/05 00:29 ID:0ij2w7ok
CGIのためにWindows上でテスト用としてperl使えるようにしたいんですけど
実行できないで困っています。ActivePerlをインストールしました。インストール
先はc:\perl\binになっていました。pathも通っているので、DOSプロンプトで
perl -vとやってみると、ちゃんとバージョン情報がでるので、一応動くようなのですが
ブラウザからCGIを実行させようとするとできません。*.plファイルの最初の一行は
#!/perl/bin/perlとしているのですがこれが間違いでしょうか?
エラーメッセージは

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:

'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

となるんですが、どなたか助言お願いします
841nobodyさん:03/01/05 00:31 ID:???
>>840
で、どのサーバ使ってるかは秘密?
842偽PG:03/01/05 00:34 ID:???
>>839
ありがとうございます!
後は許可しているかの確認とWEBプログラムか。
行うことの目的ができて感謝です。
843nobodyさん:03/01/05 00:50 ID:???
>>840
ウェブサーバソフトの名前を書いてよ。
844840:03/01/05 00:52 ID:0ij2w7ok
>>841 >>843

すいませんでした。
AN HTTPD daemon ver1.42dというやつです。
845nobodyさん:03/01/05 00:54 ID:???
>>844
きちんと一行目のPerlへのパスを解釈するようにANHTTPdを設定した?
846840:03/01/05 01:00 ID:0ij2w7ok
>>845
それはどこで設定するのでしょう?
とりあえずDocumentRootの設定と/~UserNameと /cgi-bin/の仮想パスとローカルパス
というところはチェックしてみました。その他はいじってません
847nobodyさん:03/01/05 01:01 ID:???
>>846
ん?
CGIの設定のところにそれらしい項目がないか?

だんだんスレ違いな話題になってきたな。しかたないけど。
848840:03/01/05 01:04 ID:0ij2w7ok
>>847
すいません。やっとわかりました。
「#!の行を調べる」というチェック項目があってそこに
チェックをいれたら実行することができました。
ありがとうございます。スレ違いごめんなさい。
849847:03/01/05 01:05 ID:???
試しにインストールしてみた。
拡張子ごとの設定の編集のところで、「#!の行を調べる。」という項目があるでしょ。
そこにチェックを入れてみて。
850849:03/01/05 01:05 ID:???
あら・・・
851840:03/01/05 01:08 ID:0ij2w7ok
>>850

ああ!!申し訳ないです。
わざわざインストールまでしてもらって。
親切にありがとう。
852nobodyさん:03/01/05 02:42 ID:TaQfxWs2
チャットのスクリプトで行き詰まっています。どなたかご教授下さい。
在室者リストに(*.dat)に 名前<br> の順で書き込まれている状態から、
退室時にその人の 名前<br> だけを削ろうとして
if (($who ne '') && ($proc eq 'exit')) {
$out_mem = "$who<br>";
open (OUT, "+<$sanka");
flock (OUT,2);
@list = <OUT>;
foreach $outlist(@list) {
$outlist =~ s/$out_mem//g;
print OUT "$list";
}
flock (OUT,8);
close (OUT);
}
と書いたのですが、名前が載りっぱなしになってしまいました。
試しに、 +< を +> に変更したら今度は必要な名前まで
一緒に削れてしまいました。
ご助言をお願いします。
853nobodyさん:03/01/05 03:02 ID:???
その削除したい人の名前以外をメモリーに全て待避して、
ファイルの中身をtruncateしてから待避したものを書き出せばいいんじゃないの。
854nobodyさん:03/01/05 03:02 ID:???
>>852
perlの大罪その1.

print OUT "$list";

print OUT "$outlist";

use strict ;しる。
855852:03/01/05 03:31 ID:TaQfxWs2
>>853
名前以外を退避…。
そちらに頭が全くまわってなかったです。
アドバイス有難うございます!
>>854
なんという基本的な間違いを。ご指摘有難うございます。
早速修正します。
856nobodyさん:03/01/05 09:18 ID:2NV2xWH6
サーバー上に作ったフォルダが削除できません。
(自分でおいたCGIのせい?)
どうしたら削除できますか?
サーバーはinfoseekです.
857nobodyさん:03/01/05 09:19 ID:???
>>856
自分に対する書き込み権限を立てて消す。
858nobodyさん:03/01/05 09:26 ID:2NV2xWH6
>>857
もう少し詳しくお願いします
859nobodyさん:03/01/05 09:28 ID:???
chmod 600 ./*
rm -rf ./
860nobodyさん:03/01/05 09:49 ID:???
>>856
FFFTPとかで消せないって言うか、ファイルが見えないんだろ?
任意のコマンド ってあるから>>859みたいに
chmod 644 ./ファイル名
861nobodyさん:03/01/05 10:05 ID:2NV2xWH6
>>860
FFFTP ですが 任意のコマンドで chmod 使えません。
どのフォルダのパーミッションをかえればいいのでしょうか
862nobodyさん:03/01/05 10:57 ID:???
infoseekでファイル消せないって質問は定期的に出てくるな。
あそこはnobodyで動いてるから、自分でコーディングもできない利用者は
そりゃハマるだろうよ。

っつうか、そもそもPerlと何の関係が?
863852:03/01/05 14:32 ID:C4pjTkfz
一晩眠って、853様のアドバイス通り、一度リストを配列に逃がしてから
不要な名前を削って再度リストに並べ直す方法で巧く出来ました。
本当に助かりました。ありがとうございます。
864nobodyさん:03/01/05 17:51 ID:???
>>855
いやいや漏れが言いたかったのはここまで有用な言語でありながら
変数定義と参照に関する処理系の警告機構が利用されていない
@listとして定義して$listとしてのアクセスは警告に値する。
(というか、この場合$listってどういう意味が有る?)

-wスイッチで起動すると解決するのか?
865nobodyさん:03/01/05 22:51 ID:???
>>864
お前>>854じゃ無いのか?
866nobodyさん:03/01/05 22:53 ID:???
>>864
>-wスイッチで起動すると解決するのか?

ドキュメント読むか実際に試してからほざけ。
867nobodyさん:03/01/05 23:18 ID:LhQ0NrhB
>>864
まだまだPerl初心者だね。
スカラー、リスト、ハッシュには、別々な名前空間(?)が存在するから、
$list @list %listは同時に使うことができる。

-wを付ければ、定義されていない変数がどーたらって警告が出るし、
use strictをつければ、コンパイル時にエラー(グローバル変数の利用)出て、
実行してくれない。から変数名を間違えたって気づくはず。
868nobodyさん:03/01/05 23:31 ID:+d9WGquV
◆◇◆◇◆最新情報◆◇◆◇◆
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
869nobodyさん:03/01/05 23:43 ID:???
Perlのことを勉強しようと思って、本屋に売ってたCGIRescueという本を買ってきた。
その本の作者には何か奇妙な癖のようなものがあって、
スカラー、リスト、ハッシュの変数名に同じ名前を割り当てているケースが多くて、
1行ごとプログラムリストの解説が載っているにもかかわらず、
はじめはわけがわからなかった。

特にforeachのところでは必ずといっていいほど
foreach $hoge(@hoge){}みたいになっていた。
870nobodyさん:03/01/06 00:07 ID:???
一行毎に解説って
$i = $i + 10; # $iを10増やす
でつか?
871おまけ:03/01/06 00:12 ID:hDz3fIfA
1.
my $hoge
foreach $hoge (@hoge) { }

2.
foreach my $hoge (@hoge) { }

1よりも2の方がいい。
872nobodyさん:03/01/06 00:30 ID:???
円グラフで表示されるアンケートを作りたいです。
例えば
価格。COMみたいな製品評価を皆でするタイプ。
http://kakaku.com/prdsearch/detail.asp?ItemCD=001004&MakerCD=30&Product=FMV%2DDESKPOWER%20C18B

あとは
http://www.jinvestor.com/cgi-bin/bbscode.cgi?c=6748
こんな感じで皆で評価できるタイプを作りたいのですが、初心者なのでよくわかりません。
無料のCGI配布してるとこ等、探しましたが、なかなか上記に見合うタイプのがないです。
何か助言お願いします。もし作り方知ってられましたら是非教えてください。お願いします。
873nobodyさん:03/01/06 01:15 ID:???
>872
まずは円グラフがどういうものかの勉強からやり直してきてください。
874nobodyさん:03/01/06 01:32 ID:???
>>872
GD::Graph::pie使えば円グラフ簡単に作れるけど、GD::Graphが
使えるかどうかは管理者に聞いてくだちい。
875869:03/01/06 01:52 ID:???
>>871
その本のプログラムはPerl4で書かれていたからmyは使ってなかった。
localも何故かほとんど使ってなくて、
$hogeや@hogeみたいな変数は全てグローバル変数だった。
876nobodyさん:03/01/06 08:12 ID:???
>>843-4
ありがとうございました。
877nobodyさん:03/01/06 18:53 ID:???
>>875
そんな本ステステ
878nobodyさん:03/01/06 21:42 ID:???
PerlでHTTP鯖みたいなことはできますでしょうか?
アクセスがあるとHTTPの文書を返せればよいのですけれど
879nobodyさん:03/01/06 22:09 ID:???
>>878
たとえば、どんなことですか?
具体的にお願いします。
880nobodyさん:03/01/06 22:20 ID:???
>>878
できます。

>>879
HTTPサーバについて勉強。
881nobodyさん:03/01/06 23:05 ID:???
>>878
Webmin(w
882864:03/01/07 01:48 ID:???
>>878
調べたら簡単に出来るモジュールがあった。
http://search.cpan.org/author/GAAS/libwww-perl-5.68/lib/HTTP/Daemon.pm
そのまんまだ、
サンプルをいじって見れば、、、
883864 2/3:03/01/07 01:49 ID:???
>>882
----httpd.plとして作成
use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
----
884864 3/3:03/01/07 01:50 ID:???
>>883
試しとして同じDIR上にaaaa.htmlを作成
perl httpd.pl 8888 で起動。8888は任意のポート番号
ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
しかし、これだけだとマルチスレッドとならない為完全な同時アクセスには対応していない。
(先のページには同時に5要求の待ち合わせが出来るように書いてある?)

以上
885864 :03/01/07 01:57 ID:???
>>884 訂正
ブラウザからhttp://ホスト名/aaaa.html で表示を確認した。
  ↓
ブラウザからhttp://ホスト名:8888/aaaa.html で表示を確認した。
886nobodyさん:03/01/07 03:26 ID:???
>>884 Linuxならば下の様にfork入れてマルチOK。エロムービーDLと同時にページアクセス出来た。
use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN)
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
887nobodyさん:03/01/07 03:31 ID:???
>>886 fork入ってなかった。再掲
use HTTP::Daemon;
use HTTP::Status;
my $d = new HTTP::Daemon(LocalPort =>$ARGV[0]) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
my ($family, $port, $heraddr) =unpack('S n a4 x8',$c->peername);
my $pid = fork() ;
if ($pid!=0) {
next ;
}
else {
while (my $r = $c->get_request) {
print "Accept from:".Socket::inet_ntoa($heraddr)." Port:".$port."\n";
print " User-Agent:".$$r{"_headers"}{"user-agent"}."\n";
if ($r->method eq 'GET' and (-e '.'.$r->url->path)) {
if ($c->send_file_response('.'.$r->url->path)) {
print "Get file: .".$r->url->path."\n" ;
}
} else {
print "Not Respons ".$r->method." ".$r->url->path."\n" ;
$c->send_error(RC_FORBIDDEN);
}
}
print "Close Connection :".Socket::inet_ntoa($heraddr)."\n";
$c->close;
undef($c);
}
}
888nobodyさん:03/01/07 14:19 ID:???
どうでもいいけど中級者コーナーっていうの作れば?
リファレンスとかバリバリ使ってる初心者は嫌だ。
889nobodyさん:03/01/07 15:42 ID:???
>888
一度立った事があるけど、今は残ってない。
初心者と中級者の線引きを決めないと上手くいかないよ。

tu-ka,中級者は自分で調べる事(自力で解決する術)を知ってるから、
あまりこういうところで聞かないんだよな。
890nobodyさん:03/01/07 23:25 ID:???
つーわけで、自称初心者のみなさん、ほかの質問が小難しくても
どんどん質問してください。
当然、
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
891nobodyさん:03/01/08 00:41 ID:???
自分はフブラウザからアップロードしたファイル名を取得したくて↓の処理をしてみたんですが
if ($fname =~ /filename="(.*)"/){
my $tmp = $1;
if ($tmp =~ /\\/){
for ($fi = (length $tmp) - 1; $fi >= 0; $fi--){
if ("\\" eq substr($tmp, $fi, 1)){
$fi++;
last;
}
}
$fname = substr($tmp, $fi);
}else{
$fname = $tmp;
}
}else{
$fname="";
}
Windowsから十二名の乗客.jpgを取得しようとすると
二名の乗客.jpgとなってしまいます。
どなたか良い方法をご教授ください。
892nobodyさん:03/01/08 03:07 ID:???
\(5C)を含む2バイト文字の話だから$fnameを処理する前に
文字コードをECU-JPにしてその後SJISに戻すとか…
ちなみに処理は1行で

$fname =~ m/([^\\]*)"$/;
print $1;
893nobodyさん:03/01/08 04:18 ID:???
>>892
ありがとうございます。
一行でMACからもUNIXからも取得できますでしょうか?
とりあえず一度やってみます。
894えり:03/01/08 10:27 ID:RjcWJJ7/
activeperlをインストールしたのですが、なんか変になってしまって
アンインストールしたいのですがどうすればいいですか?
アプリケーションの追加と削除で削除したのですがperlのフォルダーが残っており
又、フォルダーの中身ものこったままです
895nobodyさん:03/01/08 11:05 ID:???
>>894
アンインストールで残ったのはゴミ箱に入れてもOKです。
896nobodyさん:03/01/08 13:03 ID:3CJ1U7Io
「辞書」を作りたいんですが、どうすればいいんでしょうか。
たとえば、
テキストファイルに「青」、「うんこ」とあったら
perlで五十音順に並べ替えたりできるんですか?
897nobodyさん:03/01/08 13:05 ID:???
>>896
「青」、あお、せい

少なくとも英語版Perlでは大変。
898896:03/01/08 14:05 ID:???
そうですか、やっぱり大変なんですか。
少なくとも読み仮名が無ければ厳しいんですね。

http://www.mytools.net/cgitools/dictionary0.html
こういうの見つけましたが、構成ファイルが多すぎてセッティングしてません。
899891:03/01/08 14:31 ID:???
>>892
取得できませんでした。
900えり:03/01/08 15:39 ID:RjcWJJ7/
>895
ありがとうございました!!!
901nobodyさん:03/01/08 20:51 ID:OEI4EUTr
>>898
kakasiを使えば、ある程度は、正しい読み仮名を付けれるよ。
902nodody:03/01/08 22:13 ID:1Pe5J1+N
プログラミングを始めて1ヶ月の初心者なのですが、BBSを自作
してみたいと思っています(スキルアップのために)。

ソースの見やすさを考える以外に気をつけておいた方がいいことが
あればご教授下さい。
Perlを使用します。

(特定の記述法は特に効率が悪いからやめろとか)
903nobodyさん:03/01/08 22:16 ID:???
>>902
まぁ、一本書いてみなよ。それにツッコミ入れる方が効率よさそうだ。
904nobodyさん:03/01/08 22:23 ID:???
>>902
変数の初めに数字を使用しない。
905nobodyさん:03/01/08 22:24 ID:???
>902
ローカルでテストする。
これ、最優先事項。
906nodody:03/01/08 22:26 ID:1Pe5J1+N
>>903
マジで見てくださるのですか!?
じゃあ、マッハでつくります。

>>904
ありがとうございます。
気をつけてみます。
907nobodyさん:03/01/08 22:28 ID:???
>>906
use strictと-w
908nobodyさん:03/01/08 22:30 ID:atnjxi5O
use strictってなに?
参考書に載ってなかった。おしえてくだちい。
909nobodyさん:03/01/08 22:32 ID:???
use strictってなんですか?
910nobodyさん:03/01/08 22:32 ID:???
マッハで作るって5分とかで作るつもりかよ。
911nobodyさん:03/01/08 22:53 ID:???
cgiのmethodのgetで送れるバイト数って決まってるんですか?
912nobodyさん:03/01/08 23:15 ID:???
>>911
確か256bytesまで。
それ以上のデータを送りたいならPOSTで。
913nodody:03/01/08 23:15 ID:1Pe5J1+N
>>910
いや、少なくとも数日かかると思いますが…。
意気込みってやつですよ。

>>907
use strict と-w 調べて使ってみました。
out という名前でファイルを開いたあと、

print out "文章";
と書くとoutがクォートで囲まれていないという警告が出ます。
そこで

print "out" "文章";

とするとエラーがでて動作しません。
これは無視した方がいいのでしょうか?
914913:03/01/08 23:18 ID:1Pe5J1+N
エラーは

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。

というエラーです。
915nobodyさん:03/01/08 23:19 ID:???
>>912
http〜255文字
916nobodyさん:03/01/08 23:40 ID:???
>>914

正直、様々な原因が考えられるエラーだ。
本気でデバッグしてもらいたいなら、
スクリプトをどっかに.txtにしてアップするくらいのことはしろ。
917nobodyさん:03/01/09 00:21 ID:???
>>914
ブラウザのエラーを書かれても分からんよ。
Perlが出力するエラーを書いてくれ。
918>>916:03/01/09 00:39 ID:ve0CCzFG
http://cgi21.plala.or.jp/~tay/bbs2.txt

にソース(すごく簡略化してありますが、エラーメッセージは同じです)
とエラーメッセージをテキストにまとめてアップしました。

よろしければご教授下さい。
919nobodyさん:03/01/09 00:56 ID:???
>>918
open OUT, ">test.dat";
 print OUT $text;
close (OUT);

open IN ,"<test.dat";
 my @a = <IN>;
close (IN);
920913:03/01/09 01:01 ID:ve0CCzFG
大文字を使用すれば良かったのですね。

ありがとうございました。
921nobodyさん:03/01/09 01:07 ID:???
>>918
これと比べてみな。

#!/usr/local/bin/perl -w
use strict;
my $text = <<'EOE';
テスト
です
EOE

open ( OUT, '>test.dat' );
print OUT $text;
close ( OUT );

open ( IN, 'test.dat' );
my @line = <IN>;
close ( OUT );

print "Content-type: text/html\n\n";
print "<html><head><title>test</title></head><body>";

print map { $_,'<br>' } @line;

print "</body></html>";
exit;
922nobodyさん:03/01/09 01:13 ID:???
>>918
Perlの文法がどうこう以前に、
変数の名前のつけ方とかをもっとしっかりさせた方がいい。

http://www.rfs.jp/sitebuilder/perl/07/01.html
http://www.rfs.jp/sitebuilder/perl/07/02.html

こんなのでも読むべし。
923nobodyさん:03/01/09 02:51 ID:j8Nogs/U
ime.nuってどうやってるんですか?
ime.nu/hoge.jp/だったらime.nuのあとにhoge.jp/というフォルダを作っているんですか?
それとhttp://ime.nu/test.com/
からtest.comをどうやって取得しているんですか?
リファは無理っぽいです。
924nobodyさん:03/01/09 03:55 ID:???
>>923
#!/usr/bin/perl
use strict;
my $buf_size = 256;
my $query = substr $ENV{PATH_INFO}?$ENV{PATH_INFO}:$ENV{QUERY_STRING},0,$buf_size;
$query =~ tr{-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#}{}cd;
$query =~ s{^/+}{};
print <<HTML;
Content-type: text/html;charset=Shift_JIS\r\n\r
<html><head><title>jump</title></head><b><a href=${query}>${query}</a></b><br>
別のサイトにジャンプしようとしています。宜しければ上記のリンクをクリックしてください
HTML
__END__
925923:03/01/09 04:11 ID:???
>>924
なぞが解けました。
ありがとうございました。
926nobodyさん:03/01/09 09:35 ID:???
>>911
以前実験したことがありますが、IE6では約2000bytes、Netscape7では約8000bytes送れました。
ネスケでは、Apacheから
400 Bad Request
Your browser sent a request that this server could not understand.
Size of a request header field exceeds server limit.
とか
414 Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.
request failed: URI too long
とか言われますた。
927nobodyさん:03/01/09 10:32 ID:???
ロックファイルがついていないスクリプトにロックファイルつけること
できますか?教えてください。
928nobodyさん:03/01/09 10:57 ID:???
ファイルをつけるなんて造作ないです。
929nobodyさん:03/01/09 13:35 ID:???
>>927
できるよ。
930初心者:03/01/09 13:46 ID:???
教えてください。

cgiページの最上部にサイト共通のヘッダを表示したかったので

<!--#include file="header.html"-->

と記載しましたが、そのままコメント文として出力されました。
この場合はどんな方法を使用すればよいのでしょうか?
931nobodyさん:03/01/09 13:59 ID:???
>930
Perlとは一切関係ないので該当スレへ行ってください。
SSIスレとかかな?
Apacheの設定スレの方がいいかな?
どのスレへ行けばいいかわからないからと言って、マルチポストはするんじゃないぞ。
932nobodyさん:03/01/09 14:11 ID:???
>>930
open(IN, "<header.html");
my @header = <IN>;
close(IN);

<!--#include file="header.html"-->
の代りに
@header
とでもしておけYO
933nobodyさん:03/01/09 14:27 ID:???
>>930
CGIでSSIは使えません。
同じことをするスクリプトを記述してください。(>>932みたいに)
934nobodyさん:03/01/09 14:46 ID:???
>>933
漏れの自鯖ではCGI出力からでもSSI記述は使える。
レンタル鯖では見ないけどなー。
935927:03/01/09 15:10 ID:???
>>928
>>929
教えてください。ログがふっとぶことが多いので…よろしくお願いします。
936nobodyさん:03/01/09 15:31 ID:???
>>935
検索サイトで
「排他制御 Perl」
で検索汁。。
937nobodyさん:03/01/09 15:33 ID:???
>>936
Perlで排他制御を行うにはシンボリックリンクをフラグとして使いましょう。

とかまじめに書いてるサイトもあるので要注意だな。
938nobodyさん:03/01/09 15:53 ID:???
特にsymlink関数が要注意だとは思わんが
マルチタスクでの排他処理は要注意。
939nobodyさん:03/01/09 16:21 ID:???
getでパラメータを送るときに、
http://www.hoge.co.jp/hoge.cgi?str=あいうえお
こんな風に日本語を引数にしてもいいんでしょうか。
試したらうまくいったんですけど。
なんか、検索エンジンとかでは、入力するとurlエンコードって言うんですかね、
そうなって訳のわからない文字に変換されますよね。
ああいう風にしなくてもいいんですかね、という事です。
940nobodyさん:03/01/09 16:51 ID:???
>>939
良し悪しで言えば・・・悪し。

フォームでGET送信すれば自動的にエンコードしてくれるけど
直リンでの固有文字はその文字コードを使用していないと文字化けまくり。
しかも文字中に&や=などの区切り文字など混じった場合に対処出来なくなる罠。。

World Wideを意識しないでローカル派なのであればどうぞ。
941nobodyさん:03/01/09 17:15 ID:???
>>939
もちろん必須です。理由はRFCで決まっているから。で良いと思われ。
特定のアルファベットと記号以外を全部%16進の形式にするだけなので割と簡単です。

formのinput要素とかはブラウザが変換する義務を負うので無視して良いです。
942nobodyさん:03/01/09 17:18 ID:???
>>940
なぁ?

URLエンコードしてもそのエンコード前の文字コードに対応してなかったら結局化けると思うんだけれど。
あなた論理だと英語以外送っちゃいけないことに・・・。

SJIS -URLエンコード-> URLエンコードされたSJIS -URLデコード-> SJIS

943nobodyさん:03/01/09 17:35 ID:???
>>942
現状ではまだ英数文字以外のURLは送るべきではない。

http://www.hoge.co.jp/hoge.cgi?str=あいうえお

書かれていたこのURLはただの例にすぎないが
URLを伝える過程(Webだけではなく)で文字化けしていては
第三者がURLを辿っていけない状況は多分にある。

そのURL先が文字化けしているか、はまた別の話。
944nobodyさん:03/01/09 17:46 ID:???
掲示板とかで、記事を投稿されたときに、改行を多く入れられてしまった時のために、
「改行が2つ続いたら、それは改行1個に置き換える」をしたいんですが、
$value =~ s/\r\n\r\n|\r\r|\n\n/\n/g;
これじゃダメっぽいです。なぜでしょうか。
945nobodyさん:03/01/09 17:55 ID:???
>>944
$value =~ s/\n{2}/\n/g;
946nobodyさん:03/01/09 18:00 ID:???
>>944
改行とおぼしきものを一旦違うものに置き換えてからってどうかしらん?
$value ~= s/\r\n|\r|\n/<br>/g;
$value ~= s/(<br>)+/$1/g;
とか。
他の凡例は >>946
947946:03/01/09 18:01 ID:???
>>946
自滅鬱
948nobodyさん:03/01/09 18:13 ID:???
>>944
$value =~ tr/\n//s;
949nobodyさん:03/01/09 18:17 ID:???
>>948
それ良さげ
950948:03/01/09 18:29 ID:???
これだと複数の改行がすべて1つだけになるから、ちょっと質問の内容と違うか。
>>945のほうがいい感じ。
951nobodyさん:03/01/09 18:43 ID:???
s/\r//g;
s/\n\n+/\n/g;
952nobodyさん:03/01/09 18:58 ID:???
$valueのなかで$wordがあるかどうかを調べることが出来ますか?
953nobodyさん:03/01/09 19:02 ID:???

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
954952:03/01/09 19:13 ID:???
>>953 すいません。
ちょっと時間が無いので出直してきます。
955nobody:03/01/09 19:39 ID:???
>>952
正規表現で探せるよ
$value =~ m/$word/;
956nobodyさん:03/01/09 19:51 ID:???
GIFファイルを アニメーションGIFか普通のGIFか判別する方法ないでしょうか?
957nobodyさん:03/01/09 20:27 ID:???
>>956
web制作板向きじゃないの。
958nobodyさん:03/01/09 20:36 ID:???
>>956
0x21F9
が複数入っとったら・・・っつぅのはどないやろ?
959nobodyさん:03/01/09 20:38 ID:???
960nobodyさん:03/01/09 20:54 ID:???
>>958
>>959
どうもありがとう。
961nobodyさん:03/01/09 21:27 ID:???
配列@hogeの中に mona と言う言葉がいくつ入ってるか調べるためには
どのようにすればいいんでしょうか?
962nobodyさん:03/01/09 22:28 ID:???
>>961
$i = grep /mona/,@hoge; #$i = 個数
963nobodyさん:03/01/09 22:31 ID:???
$i = grep {$_ eq "mona"},@hoge;
964nobodyさん:03/01/09 23:50 ID:???
10桁の数値を生成するために以下のように記述したのですが、もっとスマートな書き方
(ループのさせ方)がありましたらお教え下さい。

−−−−−ここから−−−−−
#!/usr/bin/perl

for ($a=0; $a<9; $a++) {
for ($b=0; $b<9; $b++) {
for ($c=0; $c<9; $c++) {
for ($d=0; $d<9; $d++) {
for ($e=0; $e<9; $e++) {
for ($f=0; $f<9; $f++) {
for ($g=0; $g<9; $g++) {
for ($h=0; $h<9; $h++) {
for ($i=0; $i<9; $i++) {
for ($j=0; $j<9; $j++) {
$k = $a . $b . $c . $d . $e . $f . $g . $h . $i . $j;
}
}
}
}
}
}
}
}
}
}
−−−−−ここまで−−−−−
965nobodyさん:03/01/10 00:00 ID:???
>>964
for($i = 0;$i < 10000000000;$i++)
printf("%010d",$i);
966nobodyさん:03/01/10 00:03 ID:???
>>964
AAかとオモタ。
967964:03/01/10 00:04 ID:???
ふぉ〜!すばらしいです。
>>965さんありがとう御座います。(感謝!)
968nobodyさん:03/01/10 00:18 ID:???
>>961

>>962は、「monaを含む要素」の数
>>963は、「monaそのものである要素」の数

この場合質問が複数の解釈を許すからこういうことが起こる。
質問をする方にも、質問をするスキルが求められていると言うことだな。
969nobodyさん:03/01/10 02:37 ID:bsKAU3F+
perlスクリプト内で自分自身のファイルのディレクトリパスを知る
にはどうしたらいいのですか?
`pwd`で得ようとしましたが、そのスクリプトを起動したパスになってしまいます。
どうかお願いします。
970nobodyさん:03/01/10 02:46 ID:???
>>969
SCRIPT_FILENAME?
971えせカミ:03/01/10 04:30 ID:???
perlの言語拡張を使って、ASM言語をエミュレーションできないかと思っています。
例えば)
movf bittimc,w ;1bitタイマカウンタをwに格納し
addlw 2 ;+2
movwf bittimcb ;した値を控えに格納。
といったASM言語の各命令を1関数として
movfについて
sub movf ($$) {
my $freg = shift;
my $fw = shift ;
$REG::W = &LOADF($freg);
}
と定義したとして
movf bittimc,w ;
 のbittimc と wが引数として評価されて当然エラーとなります。
この関数への引数を評価無しで関数にその文字を渡すような事を出来ないでしょうか?
’’で囲って文字列として指定すれば良いのですが極力実際のASMコーディングを生かしたいと、、
わがままですね。。。
972 :03/01/10 08:40 ID:1IvfvcLa
>>969
use File::Basename;
use Cwd 'abs_path';
my ($name,$path,$suffix) = fileparse($0);
my $abs_path = abs_path($path);
print "($name,$path,$suffix),$abs_path\n";
973nobodyさん:03/01/10 08:41 ID:0QU3xkA6
>>969
$0 : 実行している perl スクリプトのファイル名。
$0 に代入を行なうと、ps(1) プログラムが参照する引数領域を変更する。

覚え方:
sh や ksh と同じ。
ttp://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/perl-4.019/perl_169.html#SEC234
974nobodyさん:03/01/10 10:03 ID:???
フォームのパラメータ取得処理についてなんですけど、
今は普通に手書きの
if($ENV{ 'REQUEST_METHOD' } eq "POST"){
 read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
}else{
 $QUERY_DATA = $ENV{'QUERY_STRING'};
}
省略、
をやっています。初めて覚えた時このやり方だったんで。
CGI.pmといのを使うやり方もあるみたいなんですが
どっちでやった方がいいとかあるんでしょうか。
こっちの方が効率がいいとか、バグが無くなるとか。
975 ◆hMJAPH9PWA :03/01/10 12:50 ID:???
>>971
プロトタイプを(**)にする。
そうすると裸のワードを受け付けるようになる。
…なんだけど、movf bittimc, w;としたときに
たとえばbittimcというサブルーチンが事前に宣言されていたり、
予約語だったりするとうまくいかないので注意してね。

他は、使用するシンボルを全て
use constant symbol => 'symbol';
として定数としておくという手もあるかな。
976913:03/01/10 16:49 ID:???
ようやく掲示板基礎部分ができましたので報告します。

http://cgi21.plala.or.jp/~tay/2chbbs/bbs.txt
↑がソースファイルです。

WIN2000、anhttp、ActivePerl5.6の環境下で動作確認済みです。
お時間がありましたら問題箇所(多すぎるとは思いますが)の指摘を
お願いいたします。
977nobodyさん:03/01/10 16:55 ID:???
>>976
#▼グローバル変数は頭を大文字にして区別
my $value;
my $name;
my @query;
my $query;
our %Form;
our $Write;

うそつき・・・。
978nobodyさん:03/01/10 16:57 ID:???
>>977
#▼JAVASCRIPT(クッキー読み出し・書き込み用)

そんなもん使わずとも$ENV{"HTTP_COOKIE"}に入ってるよ。
デコードはQUERY_STRINGのときとほぼ同じ。
979nobodyさん:03/01/10 21:12 ID:???
>>974
直書き:関数呼び出しのオーバーヘッドとか汎用性を考慮しなくて良い分早いであろう。
CGI.pm:少なくともバグの発生を他人のせいにできる。
980nobodyさん:03/01/10 21:21 ID:???
掲示板を作ったのですが、ログファイル(sjis保存)を読み込むとき、
"ス"など2バイト目が\x5c(\記号)の文字だとエスケープされてしまい、
結果的に文字化けしてしまいます。
文字コードはそのままsjisを使う前提で、何か良い対処方法はありませんでしょうか。
981nobodyさん:03/01/10 21:26 ID:???
>>980
読み込むだけならエスケープはされないはず。
どういう処理をしてるのか、もうちょっと具体的に。
982nobodyさん:03/01/10 21:32 ID:KddZS+XL
>>976
use strictでエラーを出さないようにすればいいっていうものじゃない。

スコープを最小?にしないと、myとかやる価値がない。
use strictは、一生懸命努力してるときに、うっかりミスが
発生することを防ぐ、ためのもの。

open "file" => open FILE
こんなファイルハンドルの使い方がちょっと変なところが数箇所
(my $sec,my $min,my $hour,my $mday,my $mon,my $year) => my ($sec,$min,$hour,$mday,$mon,$year)
(localtime)[0,1,2,3,4,5] => (localtime)[0..5]

lock.datの使い方が変

あと、Use of uninitialized value...の意味は、初期化されていない変数の使用、
っていうことだから。これだけ分かれば直せると思う。
983えせカミ:03/01/10 21:53 ID:0QU3xkA6
>>975
おー感謝!
やっぱperlは神だった。。。
984980:03/01/10 22:12 ID:???
>>981
すみません、勘違いだったようです。。
どうもお手数おかけしました。

そろそろ次スレですか・・・
985976:03/01/10 22:37 ID:???
レスを下さったお三方、ありがとうございます。

今度は少し時間をかけて直してきたいと思います。

ご指摘、ありがとうございました。
986Perl 3日目房:03/01/11 03:14 ID:7w0GJrTJ
とほほのWWW入門にPerl入門しますた。
が、mkdir(filename, mode) でデレクトリを作成できると書いてあるんですが
ファイルの作成については何も書いて無いのです。
試しに toucth(filename, mode)と書いてみましたがエラー。

で、結局新規にファイルを生成するにはどう書けば良いんですか?
987nobodyさん:03/01/11 04:48 ID:???
>>986
open
988nobodyさん:03/01/11 08:11 ID:???
ファイルが存在しない場合は新しく作成されます。
989nobody:03/01/11 08:27 ID:WMCRUM05
質問です。

大量の数値を1つのファイルから読み込み、3〜4カ所の関数で使用する場合、
&work($a,$b,$c)
のようにメイン関数からいちいち引数を渡してやるのと

$main::a
などと大域変数にしてしまうのとはどちらが良いのでしょうか?

なお、読み込んだデータのほとんどは1つの関数でしか使用されません。
990nobodyさん:03/01/11 09:59 ID:???
>>989
後者:アホか・
991nobodyさん:03/01/11 11:31 ID:hHeUjYJr
アホ質問です。
例えば
$"/dir1/dir2/dir3/file"

てあるときに"file"を取り除いて"/dir1/dir2/dir3"を得るには
どうしたら出来ますか?
ちなみにこの時点で"file"は何かは分かっていません。
992nobodyさん:03/01/11 11:38 ID:bB6C4Xxs
m!(.*)/[^/]*!;
print $1;
993nobodyさん:03/01/11 13:24 ID:1b8L5mKx
【perl】
ランダムから求められる数値が片寄ってるような気がしてなりません。
ランダムを取得する時、必ず直前に以下のような記述を置いているのですが、
正確な意味も分かりません。
(昔、どこかで見たのを写したのだと思います)

srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);

質問1
上記はどんな初期値(?)を作成してるのでしょうか?

質問2
とても効率が良く、数値が片寄る事を感じさせない記述を教えて下さい。
皆様はランダム前にどんな記述をおくのでしょうか?
イロイロ教えて下さい。

また頭が弱いため、見ても理解出来ないと思うので、どのように求めているのかも簡潔に教えてくれると嬉しいです。
994991:03/01/11 13:29 ID:hHeUjYJr
>>992
ありがとうございます。これでできました。
できましたらこれの解説をお願いできませんでしょうか?
どなたでも結構ですので、よろしくお願いします。
995nobodyさん:03/01/11 13:34 ID:YuKx7bV3
>>993
らくだ本に書いてあるやつですね。
よくわからんけど、本には
「常に変化しているオペレーティングシステムの状態情報の出力を圧縮してチェックサムをとるというのが、よく行われる。
例えば次のようにする」
と書いてあります。
996nobodyさん:03/01/11 13:39 ID:???
>>994
m!(.*)/!;
997nobodyさん:03/01/11 13:41 ID:???
>>993
真の乱数が存在しない罠。

loto6とかの抽選数字を使うとか(w
998nobodyさん:03/01/11 13:41 ID:???
>993
何万の例をとって、どれくらいの率で乱数が偏ってるの?
体感でってのはなしな。
「毎月1日は雨が降りやすい」とかそういう気分の問題であることが多いから。
なお、試す時は必ずローカルで。
999nobodyさん:03/01/11 13:43 ID:???
で、次スレゎ?
1000nobodyさん:03/01/11 13:52 ID:???
get
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。