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って●を認識するのでしょうか?
前すれ
>>991 Socketを使わないとむりぽ。
がむばってネ。
6 :
前スレ991 :02/11/20 22:46 ID:/E1Vbwsz
>>5 ありがとうございます。
あと、いきなり出て来て1000取ってすいません・・・。
>>3 前スレで答えた者だが、HTML(と、変換したCSV)はSJISだろ?
"\x81\x9c"を代わりに書けばよし。
8 :
7 :02/11/21 00:20 ID:???
ちなみに答えは多分683(自然なんちゃら)と126(ビオ)だと思う。
>>前スレ991 LWP::Simpleモジュールが入っているなら perldoc lwpcookして出てくる文書読んでみるとやり方出てるよ。 use LWP::Simple; getstore "http//:www.yahoo.co.jp", "yahoo.html"; みたいな感じ。
10 :
nobodyさん :02/11/21 00:49 ID:izFT1sBO
┏━━━━━┓ ┏━┓┏┳┓ ┏━┓ ┏┳┓
┃ ┃┏━┛ ┗┫┃┃ ┃ ┃┏━┓┃┃┃
┗━┳━ ┃┃ ┗╋┛┏━━━━┓┗━┛┃ ┃┃┃┃
┃ ┃┗━┓ ┏━┛ ┃ ┃ ┃ ┃┃┃┃
┃ ┏━┛┏┓┃ ┃┏┓ ┗━━━━┛┏━━┛ ┃┗┻┛
、 ┃ ┃ ┃┃┃ ┃┃┃ .‘; ゜ ・ ┃ ┃
、 ┃ ┃ ┃┃┃ ┃┃┃ .‘; ゜ ・ ┃ ┃┏┳┓
┗━┛ ” ;┗┛┗━┛┗┛ ノ ┗━━━━┛┗┻┛
∧_∧ ヽ(。、::。.::・'゜・' )〆 .' ,
( ゚∀゚)__ ( 。、 ::。 ).。:: θ) .∴ '
r'⌒ ̄ ̄ ̄ ̄ (。、::。.::・'゜。'゜ )ゝ| ・,‘
|  ̄ ̄ ̄ ̄ ) ヘ( 。、 ::。 )ヽ | | ←
>>1 \ │ ’ Υ γ | |
ヽ │ ⊂.J| ) し`⊃ ヾ
( ヽ | || |
\ \\ | |.| |
\ ヽ ヽ ( 丶( \
> ノ ノ \ \\ \
/ /| / ) \. ) \
/ // / (_/ .(_/
/__// /__
〈_ __〉 _ __〉
11 :
nobodyさん :02/11/21 18:30 ID:La3b0kHh
perlで「#」を変数名に普通に使えるのでしょうか? 例:$#hogehoge
>>11 使えない。
$#hoge は配列 @hoge の最後のインデックス値。
Perl で変数名に使えるのは英数字とアンダーバー。
ただし $ に続く一文字目が数字の場合、
変数名はすべて数字でなくてはならない。
で、あってる?
>>12 やってみれ。
$hoge1ならいけるだろ?
15 :
nobodyさん :02/11/22 16:14 ID:UpQRYD34
質問です。2桁の整数値、たとえば "01","09","01","21" "01090121" としたいのです。各値は実は日付で整数演算で日付の 更新を行っていますが、更新されたあとの数字を繋げると "19121" のように整数2桁にはなりません。 どうしたらよいのでしょうか?
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) というコードを一行にしてください。
>>15 意味がまったく解りません。
数値と数字の違いとか理解してる?
>>15 配列だとしたら、
@array = ("01","09","01","21");
join('', @array);
それ以外なら sprintf で %02d のフォーマットで出力すれば良。
19 :
nobodyさん :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"; } -------------------------
20 :
15 :02/11/22 19:48 ID:UpQRYD34
>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)
( ´,_ゝ`)プッ
23 :
23 :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」となってしまいます。 どうすればいいのでしょう
24 :
23 :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」となってしまいます。 どうすればいいのでしょう
25 :
nobodyさん :02/11/23 00:16 ID:TlwVHlkv
(-_-;)
>>23 $temp[0]の中身を'taro'に置換したんだからそれ以後はマッチしないかと。
なるほど。 $c =~s/\$(\w+)/${$1}/g; は止めて print eval $c; なら「taroJiroSabro」になりました。 でもこれって正しいやり方なんですかね
open(F, "+< xxx.txt"); だとxxx.txtは自動生成されないので直前に open(F, "xxx.txt"); を入れようとしましたけど、その場合直後でcloseすべきですか? となるとflockも必要ですか? ていうか煩雑なのでもっとスマートなやり方はないですか?
>>28 open F, "+>>xxx.txt" or die;
seek F, 0, 0;
30 :
19 :02/11/23 10:38 ID:???
31 :
28 :02/11/23 13:53 ID:???
>>29 +>>なんて初めて見ますた。
flockを使う上で一番安全ぽいと思われたのでわざわざ+<を使っていたわけですが
+>>てのは具体的にどんな動作するんでしょか。
教えてください CGIで、フォームのデータを%inにしまってあって、 それをJcodeモジュールで片っ端からコード変換したいのですが 全部のキーに対して変換をかけるとエラー吐かれますた… んで、次にgetcodeでsjis、euc、jisの時のみ変換をかけるようにしたのですが フォームの中にラジヲボタンとかがあり、配列のリファレンスに対して getcodeしようとするとエラーを吐かれてしまい、困ってます 全部変換しようとする>エラー 日本語だけ変換>コードをゲトしる>エラー これ以上おヴァカな自分には対処方が思いつきません、どうか御教授くださいませ…
エラーメッセージも書かずにお願いするのがperlユーザの典型
すみませんでした ちょっと自分で検証ミスが有ったようで、なんかgetcodeはできるぽでした… その後の処理が上手くいってないのかもです [Jcode.pm:575:die] Not a SCALAR reference at C:/Perl/site/lib/Jcode.pm line 575, <DATA> line 1579. 上記のエラーが出てました… ラジヲボタンのフォームとか場合によってリファレンスだったり普通の値だったりしてわけわかんない・゚・(ノД`)・゚・
35 :
nobodyさん :02/11/23 22:54 ID:zBuUfsU+
ファイル存在確認の if (-e $a) なんですが ファイルをOpenするとかなりパフォーマンスは悪くなりますよね? これも悪くなるのでしょうか?
>>35 ならない。stat(2) を使うから。
# open にしてもそれ程遅いわけではないと思うが。
>>32 >>36 cgi-lib.plかなんかを使っているのではないかと想像してみる。
まあ、自分のやったことを全部言わない
>>32 がアレなんだが。
if ($hoge){〜;} と if ($hoge ne '') {〜;} 上記の場合は、どちらを使うのが普通なのでしょうか?
>>39 用途が違うからなんとも…。
例えば、変数の中身が'0'だと前者は偽、後者は真になるよ。
42 :
23 :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 Σ(´Д`;)そんな関数があたのか…
いろいろヒントいただきましたので、がんがってみます、ありがとうございました
44 :
38 :02/11/26 00:49 ID:???
>>32 CGI::Lite の使い方を最初から勉強しなおせ。
悪いことは言わないからさ。
そもそも、「%inにフォームのデータをしまって」あるのがわかっているなら、
いつ%inに格納したのかわかるだろうに。
45 :
nobodyさん :02/11/26 16:45 ID:Y+XqV5xb
これからperlを使ってデーターベースを構築しようと思うのですが、 これからやるならDBは何を使えばいいんでしょうか。 他のスレ読むと、PostgresSQL+Pg.pmよりもDBIを使えとかいろいろ書いてありましたが 初めてなのでよくわからないです。実際はPg.pmというのを使ってる人が多いみたいですし。 いい方向へ誘導してください。 追伸:InterBaseってどうなのですか?
Pg.pm はデータベースではない。
47 :
.32 :02/11/26 20:09 ID:???
>>44 わかりますた、勉強しなおしまつ…
英語読めねぇよウワァァァァン
perlで外部ファイルから変数を読み込むことができる bashのsourceコマンドみたいなものってないのでしょうか?
50 :
nobodyさん :02/11/26 22:24 ID:kEoHEjhG
>>51 ボタンの値を見ておいてどうすれば?もないもんだ。
passの値だけで判断しろ。
52 :
50 :02/11/26 22:33 ID:kEoHEjhG
>>51 ボタンの値を見ておいて・・・というとどういう事ですか?
フォームタグではなくてCGI側の問題ですか?
アシトンワロタ
55 :
50 :02/11/26 22:54 ID:kEoHEjhG
>>53 た、たしかにスペルは間違ってますが、、、
でもクリックだと認証に飛びますけどね・・
>>55 それはブラウザ依存だ。
IEの場合、formタグのaction属性がない場合、action属性を自分自身に設定する。
だから、クリックだと自分自身に飛ぶ。
>>55 クリックすると、type="submit" のnameとvalueが渡される。Enterキーだと
それが渡されない。
だから、type="password" のほうのnameとvalueだけ見て処理しろと
>>51 は
言っている。
58 :
50 :02/11/26 23:08 ID:kEoHEjhG
>>57 なるほど、分かりました。
どうもすみません
>>45 Perlでデータベースを扱おうと思ったら、その仲立ちをするモジュールを使うのが楽でいい。
Pg.pmはPostgreSQLとの接続専用のモジュール。
だが、DBI.pmとPostgreSQL用のDBDの組み合わせでも同じことができる。
(細かいやり方は違うだろうが)
同じことをするのに二つのモジュールを使うのは無駄だと思うかも知れないが、
こうしておくと、将来別のデータベースを使わなければならなくなった時に、
DBDを差し替えて、スクリプトをちょっと(多分一行)だけ変更すれば、
そのまま動くようになると言う利点がある。
これからの生涯でずっとPostgreSQLしか使わないと言うのであれば構わないが、
そうでなければ、DBI.pmを使うことを勧める。
ま、どっちを選ぼうが自由なんだがな。
すんません、PalmOSで動くPerlってないですか?やっぱ
62 :
60 :02/11/27 01:46 ID:???
>>61 全然順調じゃないじゃん
ぇゃ、ほんと有り難うございますた、なんかスゲェ質素なページでしたが(藁
検索しても引っかからなかったんですけどねぇ…
完成を心待ちにしときます
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 はどれが一番速いのですか?
#!/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
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 ) となっており、このスクリプトでは遅すぎて、話しになりません アフォですみません。
20021231 という、YYYYMMDDという日付データがあった場合に、 「今日からあと何日でその日が来るか」を算出するのにはどうしたらいいのでしょうか。
67 :
66 :02/11/27 10:55 ID:???
あと、 例えば、20020631という日付データがあって、 その日から3ヶ月後は何日か求めたい時はどうすればいいですか。 普通に20020931にしても、9月は31日が無いかもしれないですし、 うるう年とかで2月は28日だったり29日だったりしますよね。。
卒業しなくて良いよ。
>66 timelocal()を使うと楽。 >67 じゃあ、8月31日の3ヵ月後の11月31日が存在しなかった場合はどうするの? なかった場合どうするかを先に決めないと何もできない。
70 :
66 :02/11/27 11:24 ID:???
>>69 11月31日が存在しなかったら次の日の12月1日になると思います。
>70 なると思いますじゃねーだろ。 どういう仕様にしたいか決めないと出来ないってんだよ。
んで、 >70は>66-67みたいな事がしたくて それでどんな風にやってみて、 それだとどんなエラーが出て上手く行かなかった んだ? 自分で何もせずにやり方聞いてるわけじゃないよな? >1読め。
>>71 オマエのほうが勘違いしてないか? よく読め
掲示板から入力した文字データの文字数を数えて、 その文字数分、処理をループさせたいのですが、 これだと何も出来ませんでした…。 要するに、入力されたひらがな($tango)を、 ローマ字に変えてファイルに書き込みたいって事なんですが…。 $mojisu = length $tango; while ( $x < $mojisu ){ $moji = substr($tango,$x,2); if ($moji = "あ"){print $romaji "a"}; ・ ・ ・ $x = $x+2; }
>>74 $tango =~ s/あ/a/g;
$tango =~ s/い/i/g;
ずら〜っとコレじゃダメですか?
でも、「っ」とかって大変そう・・・
後に来る文字で変わるでしょ・・・
>>74 ($moji = "あ") じゃダメだろ
基礎から勉強しなおせ
>>74 それじゃ$mojiに"あ"を代入してから$mojiを評価してるぞ(よーするに真になる
80 :
nobodyさん :02/11/27 17:38 ID:37dF+px+
\x82\xb3\x82\xa0\x82\xc7\x82\xa4 って文字コードになってるファイルがあるんですが コレを元の文字に置換するようなやつはどのように書けばいいんでしょうか?
ネタ
どいつもこいつも、教えんのは善意だぞ、聞く香具師が偉そうにスンナヴォケ! 一生独りでシコってろ!!
ドピュッ
84 :
nobodyさん :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進法で出力される数値 効率のいいコードはないでしょうか?
85 :
nobodyさん :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;
86 :
85 :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];
87 :
84 :02/11/27 22:54 ID:???
>>85 なんとなくわかりました。Perlにしてやってみます。
88 :
84 :02/11/27 22:56 ID:???
>>86 あ、ありがとうございます!
考えてたら
>>86 が遅レスになってしまいました・・・
感謝です!!
89 :
nobodyさん :02/11/27 23:01 ID:XpHW8B1z
$in = 500; $out = (0..9,a..z)[int($in/36)] . (0..9,a..z)[$in%36];
90 :
84 :02/11/27 23:11 ID:???
>>88 すいません日本語おかしいですね。
とにかく感謝です
>>89 ありがとうございます!!
すごく効率的ですね
効率的って。。。
codeがみじけぇってこったろ
(・∀・)タンショウ!!
(・∀・)ホケーイ!
95 :
74 :02/11/28 11:13 ID:???
皆さんのレスとても参考になりました。
今のところ全くの初心者なものでご迷惑をお掛けしました。
とりあえず
>>77 さんのやり方で出来ました。
「っ」や「ゅ」等については後で考えます。
皆さんありがとうございました。
96 :
nobodyさん :02/11/28 12:20 ID:AB88ovMQ
すいません。環境変数が存在するか無いかを判定したいのですが どうしたら良いでしょうか? if( $env(HTTP_REFERER) == NULL) 流石にこれじゃだめっすよね…
if ($ENV{'HTTP_REFERER'} eq '')
98 :
nobodyさん :02/11/28 12:40 ID:9pvjX8Vy
>>96 unless( $ENV{HTTP_REFERER} ) {
.
}
99 :
nobodyさん :02/11/28 12:40 ID:FjFqkJQz
if(exists $ENV{HTTP_REFFERER}) ではだめでつか?
>>99 存在していても、値がないかもしれん。。。
>>98 このばやいはそれでもいいが、値が 0 の環境変数には適さない。。。
103 :
nobodyさん :02/11/28 13:17 ID:n94VkAjj
if (defined %ENV) {...}
>>100 >環境変数が存在するか無いかを判定したいのですが
というお題なので、exists でいいんじゃないか?
0や''を検出するなら、まず仕様を決めてもらわんと。
105 :
96 :02/11/28 13:22 ID:cubtANrC
レスありがとうございます。 CGIを重複で利用したいので フォームからアクセスしたときと表示するだけでアクセスした時 に分けたかったんです。 フォームからアクセスした時にはQUERYなりCONTENT?なりに 残るじゃないですか。 それを判別したかったんです。 いろいろ御意見ありがとです。。
107 :
nobodyさん :02/11/28 13:41 ID:n94VkAjj
>>106 該当するweb管理者にお問い合わせ下さい。
>107 業務口調ワラタ
>>106 初心者に掲示板の制作は無理だから諦めれ。
(余談だけど、初心者って掲示板の設置のことを「作り方」って聞くときがあるんだよなー)
110 :
nobodyさん :02/11/29 11:03 ID:YJ7YkLxM
お願いします。 文字列を一定の長さまで比較したいんですけど 標準関数ありますか? Cでいえばstrncmpみたいなものです。 できれば、今後自力で調べる方法も教えて頂けないでしょうか。
if (substr($s1, 0, 1) eq substr($s2, 0, 1)){ hoge; }
112 :
nobodyさん :02/11/29 17:54 ID:nCXK5uR+
「DBI.pm」の「pm」って何??モジュール化されてるってこと? メモリ上にロードされっぱなしになって速度が速くなったりするの? あと、自分のperlソースをpmにすることはできますか? webで調べたけど情報が無かったです。
114 :
nobodyさん :02/11/29 18:08 ID:FGwKAXnr
例(1) print <<HERE テスト HERE; 例(2) print "テスト"; 例(1)と例(2)ではどちらが表示が速いでしょうか?
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/
117 :
nobodyさん :02/11/29 22:23 ID:JObUfqd/
現在実行中のコードの行番号を調べることってできますか?
118 :
nobodyさん :02/11/29 22:23 ID:lYLiGnC/
ABCADEAFGAHI という文字列があったとして、 例えば3つ目のA以降の文字列を除去するにはどうすればいいでしょうか。 この文字列の場合、 ABCADEA まで残したいのですが。。。(あるいはABCADEまで
>>118 s/(ABCADEA)FGAHI/$1/;
(w
120 :
nobodyさん :02/11/29 23:00 ID:JObUfqd/
/^([^A]*(?:A[^A]*){3})/ ? $1 : '';
121 :
117 :02/11/29 23:06 ID:JObUfqd/
hoge.plから&error; とかすると、 sub error { の中で、 error:line 333 in hoge.pl とか出したいんですが。 &errorは、hoge.plからrequireします。
!user/local/bin/perl -C とかで簡単にコンパイルできたらなぁ
&error(__LINE__); sub error{ die "error: line $_[0] in $0"; }
>>121 KCatch.pmとかの併用をおすすめする。
googleのように、キーワードがあるとあるタグではさんで テキスト内のどこにキーワードがあるか一見してわかるような プログラムを作っているのですが、 jcode::convert(\$_, 'euc', "", "z"); jcode::convert(\$word, 'euc', "", "z"); $_ =~ s/$word/<XX>$word</XX>/; #(XXは任意のタグ) とするとどうしてもうまく置き換えられずに化けてしまう 文字があります(主に全角のカナ)。 処理は入力をすべてEUCにコンバートしてから行っています。 化けてしまう原因が分かりません。 置き換え時の文字化けというのは避けられないのでしょうか?
文字コードの自動判別がうまくいってない?
>>125 情報すくなすぎ。
具体的に$_と$word それぞれがどういう入力のときにうまく
いかないのか。jcode::convertした時点で化けているのか、
置き換えたときに化けてしまうのか。
128 :
125 :02/11/30 03:00 ID:???
125です。お返事ありがとうございます。 jcode::でsjis→EUCコンバート時には まだ化けていないようです。 さらにそのテキストをsjisに戻した場合は 化けてしまうものもあるようですが、今回は sjisに戻しておりませんので無視しています。 現状としてはどうやら置き換えている時に 化けてしまっているようです。 どの文字がどのようなタイミングで化けるか調査して もう一度書き込ませていただきます。
129 :
125 :02/11/30 04:09 ID:???
125です。 確認したところ、置き換え時に同一文字コードながら違う文字? で置き換えが行われていて化けてしまっているようです。 例えば $_ = "007シリーズの最新作「ダイ・アナザー・デイ」"; $word = "次'; としたときに以下のようになります 007シリーズの最新作「ダイ・アナザ。<XX>次</XX>Ε妊ぁ廚・ このように、"次"という文字は含まれていないのですが 文字コードが同一?のため中途半端な所で置き換えが 行われて以後の文章が化けてしまう、という現象に見えます。 このような動作を回避することは出来るのでしょうか?
132 :
nobodyさん :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;} }
134 :
132 :02/11/30 10:21 ID:KwMUsAxf
>>133 よく分からないんですが、perlのバージョン?(仕様上?)に問題があるということですかね?
質問なのですが、 たとえば<txt></txt>で囲まれている間の文字のみを s/</</g; s/>/>/g; という風に変換したいのですが、 どうしたらいいか分かりません。下記の様にしたのですが、できませんでした。 ご教授して頂けませんか? if ($val =~ /<txt>(.*?)<(.*[^>]*)>(.*?)<\/(.*?)>(.*?)<\/txt>/) { $val =~ s/$1<$2>$3<\/$4>$5/ig; } #見にくくてスミマセン…
136 :
135 :02/11/30 12:17 ID:???
勘違いしてました・・・ 上手くいきました、ご迷惑おかけしまスタ
137 :
nobodyさん :02/11/30 13:59 ID:/75slB4U
>>132 Math::Bigint 使ってください。
Perlで大きい整数はまともに扱えません。
使い方は perldoc Math::Bigint 読んでね。
139 :
125 :02/12/01 14:00 ID:???
>>138 求めていた回答がここにありました。
じつはそこのサイトはこのスレッドの頭にあったので
見ていたのですが、ちゃんと読まずに通過していたようです。
解決することができました。ありがとうございました。
他の皆様も考えてくださったり回答してくださったりして
ありがとうございました。では。
my @hogelist = ('hoge','piyo','huga'); で作ったをもとに、 hoge,piyo,huga と表示させたいです。どうやればいいか教えてください。
s/(で作った)(をもとに、)/$1配列$2/;
join
join(",",@hogelist)
>>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;
}
もっと無駄な方法ってないかしらん・・・
147 :
nobodyさん :02/12/01 22:22 ID:SByI0FEM
あの〜今度HP作ろうと思ってるんです。この機会にUPローダも作りたいんです。 誰かUPローダの作り方教えてください。 作り方を説明してるサイトでもいいんで、お願いします。
すみません、どなたか御教授ください 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ってとこですかね"とか与えら、 デコードしたら変になってしまいますし… なにかいい方法はないでしょうか?お知恵をお貸しください…
>>147 レンタルのにしなさい。
>>148 本文につっこみますが日本語がとても難しいです。
もう一度日本語の勉強をしなおしてきます。
($str =~ m#^%.*#)? デコード処理 ;
ではダメ?(やっぱりよくわからん)
>>148 理論的には不可能だ。
'%22'という文字列だけが来たときに、それがもともと
'%22' という文字列をそのまま送信したのか、
'"'(ダブルクォーテーション)を送信したのか、判別できないだろう。
[\x80-\xff]が含まれていたらエンコードされていないと見なす、くらいで
妥協したら?
151 :
nobodyさん :02/12/02 04:38 ID:weXpByrh
確かに、理論的には不可能だが ->decode($str) if $str =~ m/^(?:%[a-fA-F0-9][a-fA-F0-9])+$/; で、十分実用に耐えると思うが・・・ エンタープライズとかだと、デコードしてないと error 400になるけど
152 :
151 :02/12/02 04:39 ID:???
デコードしてないと -> エンコードしてないと
ほの板のスレ一覧の最新5件だけ自分のサイトのTOPに 表示するためには、CGIでどういう記述をすれば良いのか教えて下さい
>>149 ごめんなさい、意図がよく伝わらなかったようで(汗
えと、とりあえず"与えら"は"与えられたら"です、打ちミスりました
>>150 まだまだワカッテナイので、[\x80-\xff]ってのは日本語が入ってたら、ってことなのでしょうかね
あとは"とか&とかそゆモノが入っていた時もエンコされてないなー、って方針でいいのでしょうか
>>151 %xxが含まれてたらエンコード済み、と解釈するということでしょうか?
>>150 さんのと組み合わせたほうがより完璧を期することができそうです
下2行はよくわかんないですけど、ある鯖でやると、ってことでしょうか?
>>153 IO::Socketモジュールとか使えばいいような気がします
にちゃんねる掲示板の仕様はよくしらないのですが、どっかにスレ一覧を保持してるファイルが有った気がします
でもアクセスごとに結構な大きさのファイルを取りに行くと転送料問題とかで怒られそうな気もします
初心者なのでなんか重大な勘違いをしてるかもしれませんがネ…
155 :
150 :02/12/02 14:17 ID:mB0yHtje
>>154 150は適当に書いちゃったけど、
[\x00-\x20"#;<>?{}|\\\\^~`\[\]\x7F-\xFF]
が含まれていたらエンコードされていない、と見なすのは?
まあ
>>151 さんのでOKだと思うけど。
DBにfirebirdを使うと思うのですけど、どうですか?
>>157 キボンと言われましても、他のDBをほとんど使ったことがなく
単純に登録、更新、削除くらいしかしないので感想はあまりないです。
ただちょっとデータ量が多そうなのでDBを使ってみるかとなったのです。
159 :
nobodyさん :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は正常に動いています。
解決策が分かる方、お願いします。
160 :
nobodyさん :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ちゃんねるキラー組織キタ━━━)゚∀‘)・ω・) ゚Д゚)゚∀゚)・∀・) ̄ー ̄)´_ゝ‘)-_)゚∋゚)´Д`)・∀。)━━━━!!!
>>159 ルータ・ファイアウォールとかでポート閉じちゃってるとか?
162 :
159 :02/12/02 18:16 ID:???
>>161 ルーターですか・・・。
大学に持ってきて設置しているせいかも知れません。
もう少し調べてみます。
164 :
nobodyさん :02/12/02 18:28 ID:+ey3nn6h
165 :
159 :02/12/02 19:12 ID:???
>>161-164 レス感謝です。
今日は時間切れの為大学から閉め出されてしまうので、
また明日調べてみようと思います。
ありがとうございました。
つーか自宅サーバちゃうやん( ´_ゝ`)
フリーのゲストブックを落としてきたんですが、 そのファイル内にある.cgiなどをFFFTPでアップするだけでいいんでしょうか?
>>167 WebprogとかCGIのスレ行ってよ。Perlとぜんぜん関係ないじゃん。
169 :
167 :02/12/02 22:22 ID:???
誤爆でしたスンマセン
170 :
nobodyさん :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となるように書きました。 でもこれ、置換処理か何かでもっとスマートに書ける気がするのですが、 具体的にわかりません。どなたか、ご教授願えないでしょうか。
こんなの? ($day,$hour,$min,$sec) = map {sprintf "%02d", $_} ($day,$hour,$min,$sec);
172 :
170 :02/12/02 23:06 ID:???
「初めての〜」じゃなかった。。。 「すぐわかるパール」でした。 古田たかし著の「初めてのCGI&Perl」と混同しました。 今まで読んだ参考書は、上記2冊です。
そんな古くさい処理の本捨ててウェブで勉強した方がいいぞ。 @youbi とか、、ダサすぎでしょ。
174 :
170 :02/12/02 23:16 ID:???
>>171 あら素晴らしい!できました!
即レスありがとうございました!
>>171 さんの方法は1行でスマートだけど、
if($day < 10){$day = "0$day";}
なんて方法は最悪の部類ですよ。かなりひどい本だと
断定してもいいです。たぶんこれもkent-webのソース
をダサいままぱくってるのかな?
176 :
nobodyさん :02/12/03 01:18 ID:ZhYTYd9T
マッチについての質問です。 データファイルを読み込んで、任意の数字がある場合のみprintしたいと思っています。 for(@log){ if($_ =~ /$num/){ print "$_"; } } これでやると、$num=10;とした時、100や101、102....もマッチしてしまいます。 10なら10だけをマッチさせたいのですが可能でしょうか?
変数たくさんあるの嫌いな漏れはこう書くな。。 後で必要なのは$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;
>>176 区切り文字とかってないの?どんなデータファイル?
いちおう /\D$num\D/ で可能だとは思うが
行頭と行末の場合はヒットしないので注意。
179 :
176 :02/12/03 01:44 ID:???
>>178 データファイルは掲示板の書き込みのような文章です。
その文章中(記事番号とかではなくて)に任意の数字がある場合にマッチさせたいのです。
/\D$num\D/を使ったらうまくいきそうです。
ありがとうございました。
自由度はせばまるが、だいたいは日付の出力はこれでやっている。 $t = localtime; print $t, "\n";
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);
<続き> 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);
>>181-182 なにがわからないのかわからん。
とりあえず$iはずっと''だと思うが。
すいません。 >print OUTPUT "<tr>\n<td align=\"center\">$i</td>\n"; の行はいらないんで、$iは無視してください。 sortしたのをforeachでちゃんと回るようにしたいんですが。
どうしてちゃんと回ってないと? 新しい順に並ばないか?
187 :
:02/12/03 21:04 ID:???
foreach() 以下の{ }の中が間違ってるぽいんですが どこをどう直せばいいのかも分からず。。
>187 プログラミングPerlを買ってきて読め。 それで全て解決。
だからさ。 このスクリプトなら新しい順に並ぶでしょう? 並ばないなら、どうなるのか教えて欲しい。エラーが出るのか? で、最終的にどうしたいわけよ。 %filesにどんな値が入るか観察してみるとわかるかもな。
190 :
:02/12/03 22:57 ID:???
並べ替えた順にファイル名と更新日を<table>の形で出力したいんですけど、 実行して生成されるhtml見ると、この部分(foreach(){ }の中)が抜けてて、 ヘッダとフッタの部分だけになっちゃうんで。。
191 :
nobodyさん :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に使えない文字だと駄目なのですが。 よろしくお願いします。
>>191 そんなことをする意味は……それは言わんでおくか。
URLに使える文字のテーブルを作って、仮にそれが50個あった場合は
timeの数値を50進数に変換したあと、テーブル引いて文字化する。
受け取る側では逆のことをやる。これなら5〜6文字ぐらいにできるんでない?
>>181 foreach (readdir(DIR)) {
>>192 ありがとうございます。
目的は携帯サイトの2k制限を如何にクリアするか、ということなんです。
その為にHTMLに出力する部分は出来るだけ文字数を落としたいのです。
(0..9,a..z,A..Z,_,-)
仕様上URLでそのまま送れる文字は上記と、'.'、'*'だけみたいですので、
そうなると64進数が限界でしょうか。。
ご意見ありがとうございました。
>>194 4バイトにできるだろ
ちなみに以下は10桁の数値が代入されることはないと思うが
$time = localtime;
>>195 あ゛あ゛あ゛恥ミス発見!
ご指摘の通り $time = time; でした。
64^4 = 16777216
で、10桁は表現できないと思うのですが・・
4バイトで表現するにはどうしたらいいんでしょうか?
197 :
189 :02/12/04 00:23 ID:???
>>199 おお。すまん。
foreachと言うのでそこばかり気にしていたよ。
while (readdir(DIR)) {
を
>>193 のように
foreach(readdir DIR){
とするか
while($_ = readdir DIR){
としてみれば解決すると思うぞ。
>>196 1970年のデータが必要かどうか判りませんが、
もし最近のものならその数字(timeの戻り値)自体を減らしてみてはどうでつか?
$time = time - 946684800;
2000年01月01日午前00時00分00秒を0とするとか。
>>196 >>195 は、timeの値が4バイトだと言ってる。つまり32ビット。
で、64通り=6ビットの場合、6文字必要。
でも、何十年も使う訳じゃないだろうから、timeから1000000000を
引いた値を5文字(30ビット)で格納、でどうかな。
200 :
199 :02/12/04 01:34 ID:???
うわ。もろかぶった。 1時間前のカキコに…笑
201 :
181 :02/12/04 09:10 ID:???
ありがとうございます。できました。
202 :
196 :02/12/04 11:17 ID:???
>>198-199 なるほど!理解できました。
確かに最近のものだけなので、timeの戻り値を減らしてみます。
この度はどうもありがとうございました。
またよろしくお願いいたします。
単純に10回、回したい時、 for (1..10){ print "うんこ\n"; } こういう書き方はありですか。
205 :
nobodyさん :02/12/04 18:01 ID:7+5xaubm
perlソース中の定数を、外部ファイルに書き出して扱いたいんだけど、 linuxの設定ファイルでよくある「.conf」ってなにか規格があるの? perlから簡単に扱えるようなモジュールはありますか?
>>205 意味があまりよく判りませんが、「.pl」や「.cgi」など、AddHandlerで設定した拡張子にしておくと、直接ブラウザで見られたときに、エラーが返ってくるので安心かもしれません。
>>205 Windowsでいうところの.iniやMac OS Xでよく使われているようなplist
みたいに、設定ファイルのデファクトスタンダードな規格はあるのか?
ってことでしょ? 無いと思う。
CPANにいけば、設定ファイルをごにょごにょするモジュールはいっぱい
あるので、検索してみることをお勧め。
209 :
1/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; }, }); }
210 :
2/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で回すとその心配はないのかな?
あれっ!?foreach のパスが間違ってる!! やっぱりwhile のほうが速いですね・・・・。 すいませんでした。。
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はなにもされてません。
$test =~m[<FOO>(.*?)</FOO>]s; print $1;
$test =~ m[(<FOO>.*?</FOO>)]s; print $1;
216 :
正規表現・・・・ :02/12/05 13:31 ID:vPIO4lyL
なるほどぉ。特殊変数ってのはそう言う意味だったのかぁ。 感謝です。
217 :
nobodyさん :02/12/05 15:55 ID:34DLd1c6
教えて下さい。 ファイルオープンでエラーが出た場合に 処理を続行したいのですがエラーをクリアーする 関数などはあるのでしょうか? また、読み込みの場合でもファイルロックをかける必要は あるのでしょうか?
> ファイルオープンでエラーが出た場合に > 処理を続行したいのですが 開けなかった場合中断するってな風にプログラムしてなきゃ普通に処理を続行しますが。 >また、読み込みの場合でもファイルロックをかける必要は >あるのでしょうか? 読み込みしかしないファイルなら必要ありません。 更新されるファイルならした方がよいでしょう。
219 :
nobodyさん :02/12/05 16:58 ID:34DLd1c6
>>218 さんありがとございました。
勉強になりました
220 :
nobodyさん :02/12/05 18:12 ID:x3XgL2vW
すみませんが、 Jcode.pmをniftyで動かす方法を、教えていただけないでしょうか。
CGI(掲示板スクリプト)をtaintモードで動かしたいのですが、 #!/usr/local/bin/perl -T とするとエラーになって動作ません。 原因としてどんなことが考えられるのでしょうか?
222 :
nobodyさん :02/12/05 23:03 ID:qFEbS8pn
DB_File.pmが必要なんですがプロバイダにインストールされてません。 これってプロバイダに言えばインストールしてくれるもんでしょうかね? 諦めて自宅鯖にしたほうがよいですかね?
>>220 Niftyは標準モジュールも入ってないし無理じゃない?
>>221 Tオプションの意味が分かるなら答えもおのずと分かりそうなモンですが。
>>222 プロバイダによってポリシーが違うだろうし、プロバイダに聞けとしか言いようがない。
>>222 だ・か・ら そういうことって、まずプロバイダに聞けばいいことじゃん
225 :
223 :02/12/05 23:09 ID:???
>>224 ふしだらものですがよろしくお願い致します
>>223 >Tオプションの意味が分かるなら答えもおのずと分かりそうなモンですが。
以外とそうでもないようです。
それどころか質問の仕方も分からない、と。 エラーメッセージぐらい書いても罰あたらんだろうに。
どうせ汚染チェックしてないとかアホ理由だろ。
ちょっと動揺してたのでテンプレの存在を忘れてますた。おめんなさい。 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は多分漏れじゃない誰かです。
The script did not produce proper HTTP headers. Please see the error log to see the detail of the errors. 適切なHTTPヘッダを吐いてない。 エラーの詳細はエラーログで見れ。 って書いてるじゃん。
>>229 エラーメッセージを読め。
簡単な英語くらい理解すれ!
辞書引け!
perlで下記のようにモジュールを作る場合、別ファイルのあるモジュールからは MODULEしか使わないのですが、require 'aa.pl' と use MODULE; では速度や 負荷は変わらないですか? aa.plの内容 #------↓ここから packege MODULE; ・・・ 1; package MODULE2; ・・・ 1; #------↑ここまで
1; が二つある。。
aa.plをuse MODULE;では呼び出せないと思うが。
235 :
232 :02/12/06 00:50 ID:???
スマソ。 a.pm -------------------- package MODULE; ・・・ package MODULE2; ・・・ 1; ------------------- b.pl ------------------- use MODULE; # または require 'a.pm'; # MODULE2は使用しない。
えーとa.pmなら use a; になると思うのですが。 でOOPなら $hoge1 = new MODULE; $hoge2 = new MODULE2; $a = $hoge1->hoge( $xxx ); とかに 単に関数を呼び出すだけなら $a = MODULE::hoge(); $b = MODULE2::hoge();
237 :
232 :02/12/06 01:11 ID:???
>>236 ありがとうございます。基本的に間違ってますた。
で、requireとuseでは速度・負荷的には変わりないんでしょうか?
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
条件によっては読まんモンはrequireで条件分岐後に読み込んだ方が 余計なの読まないから良いんでない? サブルーチンをインポートする必要がなければ、だけど。 あとは大差無いかと。
use だとinitにパラメタを渡せるのがちょい便利。
241 :
nobodyさん :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 としたいのですが可能でしょうか。
>>241 ものすごく安易な解ですがsplitする前に
$aiueo .= "EOL";
とかで後ろに文字をくっつけておいて、
splitした後にpopしてやると逃れることは
できます。
$aiueo = "1■2■■■3■4■5■■■";
$aiueo .= "EOL"
@values = split(/■/, $aiueo);
pop @valures;
$i = 0;
という感じです。
>>242 なるほど。確かに単純で確実ですね。
プログラムはアイデア勝負ですね。ありがとうございます。
244 :
nobodyさん :02/12/06 12:20 ID:q7PjCrzt
画像投稿型掲示板cgiのスクリプトなんですが、 サーバに保存するファイル名に投稿された時間を反映させるには(img200212061220.jpgのように)、 どのような記述が必要ですか?
>>244 スクリプトを見ないとわからん
こんな感じで作った文字列をファイル名につけてやりゃいいんじゃないの
@date = reverse((localtime)[1..5]);
$date[0] += 1900; $date[1]++;
$now = sprintf "%4d%02d%02d%02d%02d", @date;
>244 マルチは市ね
247 :
244 :02/12/06 13:44 ID:y8w9Rsa1
>>245 ありがとうございました。やってみます。
248 :
bloom :02/12/06 13:47 ID:7xw6gZYB
249 :
242 :02/12/06 15:19 ID:0nNWvukl
なんか気になっていたんですが、
>>242 はバグありですね。
あのコードじゃ
$aiueo = "1■2■■■3■4■5■■■6";
とかのときに最後の値を捨ててしまいますんで、
後ろにくっつけるのは区切り記号込みにしないと
だめですね。
$aiueo .= "■EOL"
@values = split(/■/, $aiueo);
pop @valures;
で、うまくいくはず。
>>241 *もし*要素数が一定なのなら、素直にsplitに第3引数を渡すっていう手も。
$aiueo = "1■2■■■3■4■5■■■"; @values = map($_||'NULL', $aiueo=~/(.*?)■/g);
252 :
nobodyさん :02/12/06 17:08 ID:zqw+GwyU
perl5.6で、困っています。 ある文字(\x{100}以上かもしれない)が大文字か小文字か判定したいのですが、たとえば 「任意のアルファベット大文字1文字に一致するメタ表現」などはないんでしょうか。 それとも、UnicodeData.txtをいちいち読まなければならないんでしょうか。
掲示板を作っています。 改行数の多い書き込みは 「省略されました。全部読むには(略」 という感じで省略表示したいのですが 任意の改行数までを取得するにはどうすればいいでしょうか。 よろしくお願いします。
>253 改行でsplitとか・・・、色々あるでしょ。 何故思いつかん?
Perlでスマートに最小値を求めるにはどうすればいいんでしょうか?
258 :
256 :02/12/06 18:40 ID:???
整数です。
>258 1だろ。
>>256 スマートかどうか知らんが、sortじゃだめなんですか?
sub numerically { $a <=> $b; }
@sorted = sort numerically LIST;
これで、最小値が@sortedの先頭に来ます。
261 :
256 :02/12/06 18:55 ID:???
>>260 ありがとうございます。
高度すぎて理解できてませんが、sortでやってみます。
>>260 それでは、あるリストの要素の最小値を求めることはできるけど、
「整数」の最小値を求めることはできないでしょう。
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;
264 :
263 :02/12/06 19:39 ID:Wd1BEmDy
ううっ、だめだ、、、。 @bの内容変わってる。
my(@list) = (20, 19, 100, 75, 6); my($minimum) = sort { $a <=> $b } @list ; print("$minimum\n"); これじゃダメ?
最小値求めるのにソートすんのかよ。これだからperlerは…
268 :
nobodyさん :02/12/07 00:19 ID:ePZJKayy
@hogeに何個か入っていてforeachで最後の1つ前までprintしたいときって どうすればいいんでしょう? 10個あったら$hoge[9]まで、とか。
>>267 もちつけ。
まぁいいじゃん、基本的な原理は同じようなもんだし。
>>268 10要素の配列で$hoge[9]までなら全部じゃん(w
foreach (0..$#hoge-1){
print $hoge[$_];
}
とか。
271 :
nobodyさん :02/12/07 01:08 ID:yEekv6g9
272 :
yani ◆saNSktNEdQ :02/12/07 01:19 ID:KB9hByzA
my $least; foreach (@list) { $least ||= $_; $_ < $least and $least = $_; } ベタな気がする。エレガントな解法求む。
273 :
yani ◆saNSktNEdQ :02/12/07 01:30 ID:KB9hByzA
いや、これじゃだめだな。 my $least; foreach (@list) { defined($least) or ($least = $_, next); $_ < $least and $least = $_; }
274 :
yani ◆saNSktNEdQ :02/12/07 02:26 ID:6Rt0AxGb
こちらのほうがましか。 しかしイマイチ美しさを感じないのは気のせいか。 my($least) = @list; foreach (@list) { $_ < $least and $least = $_; }
Perlは整数32bitだから・・整数の最小値は・・どうなの?
276 :
268 :02/12/07 04:11 ID:ePZJKayy
>>270 あ、確かに全部っすね・・・(w スマソ
こういう方法があるんですねぇ。おかげさまでうまくいきました。
ありがとうございます。
grepでデキルような気がしますが。 forを使ってないだけで中で回ってるのは一緒だけどな。
$min=$list[0]; grep { $min > $_ && ( $min = $_ ) } @list; こんな具合かな。テストしてないけど。
minとmaxが逆じゃん。 駄目だ寝よう。
280 :
yani ◆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);
281 :
yani ◆saNSktNEdQ :02/12/07 11:42 ID:6bq1sAwR
まあ、考えていたものがそのまんまあったわけで、それだけなら大して面白くも ないんだが、「面白い」(ことができるかもしれない)と言ったのは List::Util::reduce のことだ。
やに言ってんだYO!
ひとりごとが多いスレですね。
284 :
nobodyさん :02/12/07 16:24 ID:/TptzaIR
結構前々から思っていた疑問なんだけど、 エラー表示させる場合「&error("文字列");」を使う例を良く見るのだが、 この場合「sub error{}」は用意しなくて良いのだろうか? 所持する本には書かれていなくて……。 ちなみに漏れは「die」関数を使ってます。
ふーん。。。
帰ってこないからgoto error使ってるけど、、、別にいいよね?
>>284 自分でつくるんでねぇ?
>>286 構造化プログラミングとかの本を見ると、GOTO分はプログラムの流れがワープしちまって
全体を把握するのが困難になるからいくないらしい
昭和57年頃の本だけど(藁
goto の先でプログラムがお亡くなりになるということが わかっていたら混乱することもないんじゃない?
>>284 自分で好きなの作ろうぜ。>sub error { }
きちんとエラーメッセージ吐いてその時の環境変数やら標準入力の内容やらも表示すれば、
デバッグに便利。
290 :
nobodyさん :02/12/07 21:54 ID:HolpJHok
外部のWWWサーバからファイルを取得するのに一番負荷が少なくて、早いのは何ですか? SOCKET WGET LWP WGETはサーバに入っていないので。。 LWPよりSOCKETの方が早いと思うんですが。
>>288 自分だけが読むとは限らない罠
そして1年後の自分は別人である
292 :
nobodyさん :02/12/07 22:31 ID:HolpJHok
>>290 Socketの方がなんぼか早いだろうなあ。
でも、それぐらいだったらLwp使って安全かつシンプルに持ってくる方が俺はいいな。
SocketだったらRFCとかきちんと目を通さないと、正しいものは作れないだろ?
294 :
nobodyさん :02/12/08 10:58 ID:H7RlugSZ
perlstyleのよると、サブルーチンは全部小文字のほうがいいと書いてあるけど、どうしてですか?
>>294 「サブルーチン名は、全部小文字の方がいい」だろ?
モジュール名は(プラグマ以外は)大文字で始めろともあるだろう。
それと合わせたんじゃないか? 区別がすぐにつくように。
ま、作法の話だから、あんまり深く考えるな。
従ってれば、いつかきっと自分の中で決着がつく。
sub SuBrOuTiNe{ print "ふーん。。。\n"; }
297 :
nobodyさん :02/12/08 12:07 ID:H7RlugSZ
>>295 なるほど、ソースの読みやすさのためなんですね。
モジュールは使ったことがないので今まで気にならなかったんだと思います。
シツモソです。 Perlで、累計・今日・昨日のアクセス数をカウントするカウンターCGI(IMG or JSタグでCGI起動) を設置しようと思ってるんですが、カウントの方法で少し悩んでます。 count.cgi?total でカウント処理(累計+1, 今日+1) count.cgi?today で今日のカウントをロードするだけ count.cgi?yesterday で昨日のカウントをロードするだけ 上の順でCGIが呼ばれると正常にカウントされるんですが、 昨日、今日、累計の順に呼ばれると、当然昨日と今日のデータはカウントされる前のものになっちゃいます。 今日と昨日のCGI が呼ばれたら、sleep(1)をして、累計のカウントがおわるまで待つ というのも考えたんですが、あまりいい方法じゃないなーなんておもいますた。 また、カウントだけをする count.cgi?count みたいなタグを入れて、 そのタグを一番上に置いて、累計・今日・昨日のタグがきたらカウントデータを読むだけ ってしても、やっぱり設置場所によってはデータがずれたりしてきちゃいます。 おい、おまえら!もしいい方法がありましたら教えて下さい。
count.cgi?totalで累計のカウントを+1して累計のカウントを出力 count.cgi?todayで今日のカウントを+1して今日のカウントを出力 count.cgi?yesterdayで昨日のカウントを出力 で良いべさ。
300 :
298 :02/12/08 13:40 ID:???
301 :
nobodyさん :02/12/08 16:23 ID:GWJer8wb
jcode.plは$hoge{'hoge'}を変換できないんでしょうか? &jcode::convert(\$hoge{'hoge'},'euc'); てやってもだめなので一回普通に変数に代入して変換して元に戻して いるんですが・・・。
今、掲示板を作成中なんですが、ファイルロックの掛け方がいまいち分からない・・・・ flockの使い方教えてくらはい。とりあえずはflockがサーバで使えるみたいなので。 そんなやつが掲示板など作るな!とかいわれそうですがお願いいたします。 参考になるサイトだけでも結構なんでお願い。 半日ググってたら、何が何やら分からなくなってしまいました。
素早い回答ありがとうございます。 今まで「perl cgi flock 掲示板」やら「flock 掲示板」やら、 しらみつぶしにサイトを見まくっていたら頭が変になっていました。 「例」で検索するのをすっかり忘れていました。 本当に感謝です。>304
306 :
nobodyさん :02/12/09 20:40 ID:30vqgT1r
%ex = ( hoge => "hage", xxxx => "$ex{hoge}", ); みたいにしたいのですが、 Global symbol "%ex" requires explicit package name at ファイル名 line 13. みたいにエラーが出ます。 どうすればいいですか? よろしくお願いします。
#use strict;
my %ex
our %ex ;
your %ex;
311 :
nobodyさん :02/12/09 21:34 ID:30vqgT1r
>>307 use strict;をコメントアウトしたら、エラーは出なくなりましたが、
$ex{xxx} に $ex{hoge} の値が代入されていませんでした。
実際には、my %ex; です。写し間違えでした。
てかそんなことできんの?
>>311 (
hoge => "hage",
xxxx => "$ex{hoge}",
)
が評価される時点で$ex{hoge}に何も入っていないなら当然。
314 :
302 :02/12/09 22:25 ID:???
>>311 折角のstrictなソースをクズに変えるから糞
use strict って何?
おまじない
HTML::FillInForm って、 checkboxや、radioのcheckedは、引き継げないんですか?
318 :
317 :02/12/10 00:29 ID:???
出来ました。すいませんでしたー。
変数って変数で作ることできるんでしょうか。 たとえば、 $count; $hoge; foreach $count (1 .. 10){ $hoge$count = "文字:$"; } こんな感じでつまり、 $hoge1 = "文字:1"; $hoge2 = "文字:2"; 〜 $hoge10 = "文字:10"; こういう事はできるのかなという事です。 これだとやはり$hoge$countの書き方がまずいようでエラーになります。
なぜ配列を使わないのかと小一時間問いつめたい。
>319 推奨:$hoge[$count] # ただし$countが数字の場合のみ 推奨:$hoge{"$count"} # $countが文字列の場合 非推奨:${"hoge$count"}
>>320 ごめんなさい、小一時間じゃ済みそうにないんでまた次回。
>>321 その技の名前はなんですか。
配 列 と 連 想 配 列 ( ハ ッ シ ュ ) で す が な に か ?
× 推奨:$hoge[$count] # ただし$countが数字の場合のみ ○ 推奨:$hoge[$count] # ただし$countが自然数の場合のみ 負の数とか小数を使われたらたまらんから訂正。
自然数の定義を教えて下さい。
辞書引け。
327 :
nobodyさん :02/12/10 14:02 ID:+QGYbS02
1バイトと2バイトが混在している文字列から頭の3文字を 抽出するにはどうすればいいのでしょうか? 例えば『あいうえお』,『Aいうえお』などの場合です。 substrを使うと『Aいうえお』がおかしくなってしまいます
>328 Thanks
>>321 すいません、よく考えたらただの配列じゃダメなんです。
$hogeと$iを合体して、
「$hoge1」という変数自体を作りたいんです。
よって、「$hoge1」という変数に文字とかを代入したりしたんです。
質問お願いいたします。 書き込み処理の所なんですが、 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の使い方がちょっと違うだけなんですが・・・。 それ以前に文法的に間違っていたらご指摘お願いします。
>>330 リファレンス使えばよろし。
>>331 下。
既出のような気がするのは思い過ごしでしょうか。
>>331 早速の回答Thanksです。
既出でしたか・・・お手数おかけしました。
過去ログまた読み直して出直してきます。
>331じゃなかった >332さんごめんなさい。
>>330 せめて、配列じゃなくって$hoge1という変数が欲しい
理由を書いてもらえませんか? もしかするとその原因
自体変更することで、全体としてすっきりするっていう
可能性もありますから。
336 :
nobodyさん :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. 」 ってなってしまった。。。
337 :
336 :02/12/10 19:02 ID:4NsDPNiK
あ、上のエラーでるのはパス生成のスクリプト。
ご教授お願い致します。 メールの受信をしたいので、下記のように記述したのですが 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は通りました。 どなたか、分かる範囲で構いませんので ご指摘下さい。
>>336 ただの文法エラーですね。
カッコの付け忘れ。65行目参照。
340 :
336 :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 } 何が違うんでしょう??
341 :
336 :02/12/10 19:07 ID:4NsDPNiK
339>> カッコ?! ・・・見てみます。
>>336 エラーの内容から恐らくヒアドキュメントの書式を間違えてます。
<p>$_[0]</p>
>>336 #ここが65行目。の#が全角になってるのは問題ないのか?
345 :
338 :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 }
APOP
すいません、配列の要素の中に他の配列の全てを叩き込むって出来ないんでしょうか? @test=("か","き","く","け","こ"); @hoge=("あいうえお","テスト","さしすせそ","たちつてと",""); @hoge{1}=@test; $data=@hoge[0]; このようにすると$dataの中には「か」だけが格納されてしまうのですが。
349 :
347 :02/12/10 21:53 ID:???
誤 $data=@hoge[0]; 正 $data=@hoge[1];
$hoge[1] = join('', @test);
つーか、むしろ、こういうことじゃないのか? @test=("か","き","く","け","こ"); @hoge=("あいうえお","テスト","さしすせそ","たちつてと",""); $hoge[1] = \@test; print $hoge[1]->[5]; print $hoge[1][3]; print @{$hoge[1]}
ちょっくら質問! open(FILE,"xxxx"); @file = <FILE>; @file = @file[0..8]; seek(FILE,0,0); print FILE "zzzz"; print = @file; close(FILE); このように添字を使って”xxxx”の記録数を10にしたんだけど、 これはかなりダサイやり方?
354 :
nobodyさん :02/12/11 01:45 ID:fCm39Cv9
>>353 モードは"+>"だよね。そのコードからすると。
@file = ();
push @file, scalar <IN> for 0..8;
のほうがいいと思うよ。
355 :
nobodyさん :02/12/11 11:59 ID:IDueDvlE
そういやWin2000マシンのアクチブパールを5.6.1から5.8に入れ替えたらGDBM_File使えなくなった。 こちらのスレに対策知ってる神はいらっしゃる?
Firebirdなんですけど $sql = "insert into *** values( '***' )"; $statement = $dbHandle->prepare( $sql ); $sqlResult = $statement->execute; この$sqlResultには何が返ってくるのでしょうか。 見たんですけど何も入っていませんでした。
357 :
nobodyさん :02/12/11 13:21 ID:mexeU5Q0
use Time::Local; しても timelocalが使えません。 助けてください。
>>357 実はPerl4ってことはないか?(w
ところでどう使えないんだ?エラーが出るのか?値が不正なのか?
良ければここにソースを書いてみれ。
359 :
nobodyさん :02/12/11 13:25 ID:mexeU5Q0
>>356 Firebirdかなんか知らんが、つまりはDBIだしょ?
$sqlResult = $statement->execute();
で、処理した件数が返ってくるはずだが・・・
361 :
nobodyさん :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 で指定された書き方が出来そうにないのでこういう形でお聞きします。
どなたかお願いします。
お勧めできないかもだけど open(OUT, "> $ImgFile")より上に umask 0;
363 :
nobodyさん :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が出てくるのかな?
>>362 chmodの行を削って
open(OUT, "> $ImgFile")より上に umask 0;
という事でよろしいですか?
ありがとうございました。
スクリプトの中で、 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だとエラーになりません。ローカルではデスクトップでスクリプトを実行しています。) なぜでしょうか。
require 'jcode.pl'; require '.\jcode.pl';
>>365 カレントディレクトリに jcode.pl がないんでしょ。
そのコマンドラインだと、カレントは C:\ で、スクリプトのある場所と違ってるし。
>>363 5.8は使ってないので的外れかもしれんが。
5.6用しかないというのはどこでわかったんでそ?
ppmでも見つからない?
>>367 じゃぁいちいち、perlのスクリプトがある場所までcdしてからやらないといけないのですか?
毎回cdするのは結構面倒だと思うんですけどどうなんでしょうか。
370 :
nobodyさん :02/12/11 21:03 ID:3ApX3k5Y
面倒だと思うなら、useしませう。
デスクトップでスクリプトはしらすのは・・ワラタ
372 :
nobodyさん :02/12/11 21:32 ID:IDueDvlE
>>368 そうなんです。Perl5.6用は見つかるんですが5.8用に全く行き当たらなくって。
グーグルしか使ってませんが。w
暇を見てぼちぼち探してみます。
>>365 いっぺんお使いのPerlにJcodeをインスコしてみてはどうでしょ。
コマンドプロムプトで
perl -MCPAN -e shell
してから、プロムプトがcpanに変化しますんで
>cpan install Jcode
でいけるかと。
>>371 え?デスクトップではしらすのはトーシローですか?
374 :
nobodyさん :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 の部分にエラーが出てしまいます。 どうしたらいいんでしょうか?
375 :
nobodyさん :02/12/11 22:15 ID:qA0+bOBO
>>374 $1とか$2というのはマッチの特殊変数。
任意の値を代入することは出来ない。
変数名を別なのに変えるべし。
>>373 もしくはヘビーユーザー( ´∀`)
>>374 同じファイル2回もopenするのは無駄っぽいから、
>>331 (の下のやつ)みたいに1回にまとめた方がいいかもね。
っていうかforeachの中でopenしてんのかぁ・・(´Д`;)
378 :
374 :02/12/11 22:34 ID:???
やっぱり OPEN させすぎですかね?(;´Д`) とりあえず、出来ました。ありがとうです。 chomp(だっけ?) だかなんだかを使ってやるやり方があったような…
>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) では、同じ結果が出るのですが、ほとんどのレンタルサーバ上で 実行すると、違った結果が出力されてしまいます。 なぜでしょう? }
381 :
353 :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”この辺の書き方が曖昧にしか理解できていないど、
本でも読んで理解したいと思います。
そんなバナナ
まさか、スクリプトとテスト用データの文字コードが違ってるとかの 話じゃないよね? っていうか「違った結果」の 希望とする値 実際の結果 の両方が見たいんですけど。
384 :
nobodyさん :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
だったので、単にバージョンの違いでしょうか・・・。
386 :
Q1 :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;
388 :
Q1 :02/12/12 05:39 ID:???
ありがとうございます。やはり、それしかないですかね。 検討してみます。 ありがとうございました。
質問です。いまフリーのスクリプトを見て勉強中なのですが > if ($mode %2 != 1) { っていうのがあるんですけど、これの %2 って何ですか?
>>389 2で割った余り。
$modeを2で割って余りが1じゃなかったら
= $modeが偶数なら の意味だね。
>>386 ステータスヘッダ送ればいいじゃん。
print "Status: 200 OK\n";
392 :
391 :02/12/12 09:33 ID:???
あっダメだわ・・さ
393 :
389 :02/12/12 11:25 ID:???
>>390 >2で割った余り。
あっそうか。% と 2 がくっついてるので
「またPerlの記号的な記法か」と思ってしまいました。
ありがとうございます。
sendmailでReturn-Pathがうまく入らないんですけどなぜですか。
>>394 勝手に変えられないように設定してあるから。
396 :
353 :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回するのは、あんまりいいことではないと思っていました。
"+<"と"+>"の違いも教えてもらって、感謝します。
397 :
353 :02/12/12 15:34 ID:???
400 :
336 :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 それはここに書き込む時に付け加えたので問題ないです(^-^;
401 :
336 :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までしかないです。 #それ以降は私の付け加え。
402 :
336 :02/12/12 19:19 ID:BLMNLzB2
↑ファイルへの書き込み、を行うサブルーチンです。
>>401 @MIXって @pwd じゃない?(別に@MIXがあるのかな)
あと、cryptの salt($kw) は '%' は使えません。
それ以外の64文字は使えるので、 int(rand(@pwd)) は int rand 64 でもOK。
すみません。頭悪いのでアルゴリズムが浮かびません。 以下のようなsort したデータがあります。 名前,点数というデータの形(配列)です。 山田,28 山田,39 佐藤,94 加藤,83 加藤,28 加藤,28 木下,23 木下,33 ここから、各人の合計点を出したいのですが、どうするのが良いでしょうか? 名前でuniqする方法は分かるのですが、点数を足していく方法がわかりません。 ヒントだけでよいので、お願いします。
405 :
nobodyさん :02/12/12 20:07 ID:ZGG2sBOp
>>404 @dataに入ってるとして、
%hash=();
for (@data) { my @array = split/,/; $hash{$array[0]} += $array[1]}
で%hashに入る。
>>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];
}
??? とか? やっぱ頭悪い。
割り算の後に小数点を下2桁まで表示したいのですが、 sprintf("%4.2f",$a) すると割り切れる時でも小数点以下に 3456.00 と出てしまいます。 割り切れない場合、 1234.56 割り切れる場合 1000 と表示するにはどうしたらよいのでしょうか?
408 :
nobodyさん :02/12/12 21:20 ID:H3YHNRGs
最近、始めてPerlを使い出したんだけど use strictってなんでみんな使わないの?
>>409 そうかなあ。ちゃんとしたPerl使いならもちろん
使っているだろうけど、CGIだけのためにPerlやってる
人ってなんかそういうのあんまり意識してないような。。。
>>407 $a =~ s/\.00$//;
>>410 巷で配布してるCGIはピンからキリまであるからなあ。
あと配布用にPerl4でも動くようにしてるところもあるでしょうし。
>>411 >配布用にPerl4でも動くようにしてるところもあるでしょうし
なるほど。それもあるかもしれませんね。
413 :
ななし :02/12/12 22:17 ID:???
隠しページがありそうなとこのソースみたら文字化けしていました。 なんとか方法は分かったんですが、ブラウザにドラッグするののやり方が わかりません。おしえてください。おねがいします。
・・・
415 :
nobodyさん :02/12/12 22:21 ID:LUwqAPKo
>>407 ありがとうございます。
そういう方法しかないんですかね。結局。
あるサイトに
$a = int($a * 100)/100;
ってあったんですけど、これだと無駄が多そうですよね。
$a =~ s/\.00$//;
$a =~ s/\.0$//;
の方が早そうですね。
>>413 日本語を勉強してください
大体の意図を頑張って汲み取ると、EUCとかの文字コードに対応してるエディタを使え、と
417 :
nobodyさん :02/12/12 22:50 ID:rgoFlUwc
418 :
n :02/12/12 22:51 ID:rgoFlUwc
>419 >407を読み直した方がいいかも。
421 :
nobodyさん :02/12/12 23:19 ID:i62/L17Z
sprintf($a=~s/\.0+//?"%4f":"%4.2f",$a)
>>407 $b=sprintf('%4.2f', $a); a+=0;
423 :
422 :02/12/13 00:04 ID:???
あ $b+=0; の間違い。
>>406 ベタだけど、
%hash1=%hash2=();
for (@data) {
my @array = split/,/;
$hash1{$array[0]} += $array[1];
$hash2{$array[0]}++;
}
$hash1{$_} /= $hash2{$_} for keys %hash1;
でどうかな。(結果は%hash2)
425 :
398 :02/12/13 00:53 ID:???
誰か本当のことをおしえてください。
427 :
424 :02/12/13 08:15 ID:???
結果は%hash1でした。
429 :
425 :02/12/13 14:46 ID:???
>>428 あなたみたいな人が居るので甘えちゃうんです。ごめんなさい。
>>407 の者ですが。色んな方法がありますね。
sprintf($a=~s/\.0+//?"%4f":"%4.2f",$a)
と
$b=sprintf('%4.2f', $a); $b+=0;
が一番シンプルそうです。
>>419 int $a ではいけないですよね?
431 :
nobodyさん :02/12/13 17:39 ID:iG+3sspL
誕生日と名前フォームデータ($yyyy,$mm,$dd,$name)を CSVで貯めるのですが、その際、CSVデータが誕生日$yyyy,$mm,$ddで ソートしたいのですがいつソートするんでしょう? 1回そのまま書き込んで、もう一回呼んで、ソートしかないですか? 書き込む前にソートできますか?
>>431 好きなように決めてくれ。
書き込みが追加書き込みなら、読んでからソートのほうが改造が楽。
基本的には頻度が少ないほうでソートするべきだろう。
434 :
nobodyさん :02/12/13 19:29 ID:4EJmzvt/
>>403 @MIX??・・・は、ないです。
$MIXではなく@MIXにしないといけないのでしょうか。
あ、あと%の件ありがとうございました(^^;
で、書き直しましたが、これでもできてないです。
文法エラーとかInternalエラーとかは一切出ず、フォームに
言葉を入れてボタンを押すとリロードされます(これはちゃんとした処理)
動いているように見えるんですけど、PDへの書き込みが出来てません。
どこで引っかかっているのかな・・・。
cryptが動いていないのか、ファイル書き込みが動いていないのか。。。
>>434 $MIX を $pwd でどう?
それ以外は問題なさそうだけど。
>>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文字ずつで切り出せばよいけれども。
今掲示板を作成中で、よくある「次の何件」と言うやつを付けようと思って試行錯誤しているところなんですが、僕の今のスキルでは以下の物を書くのがやっとでした。 これはちょうど表示部分のところです。 #このスクリプトの名前,"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); とりあえずこれで動作はしたんですが、もっとスマートな方法はないですかね?何かすごく効率が悪そうなんで。
25歳。
去年まで金無し君だったけど、オンラインカジノとパチンコで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、1ドル以上のチップを買えば30ドル(4000円くらい)貰える。
もらうだけもらってプレイせずに換金することもできるし、ルーレットで赤か黒に
思い切って賭けてしまえば50パーセントで二倍になる。
金なきゃオフラインでゲームすればいいだけ。暇つぶしになる。
ビデオポーカーとかスロとか色々あるのでマジでお勧め。
http://www.imperialcasino.com/~1kl5/japanese/
perl で \nで区切られたログファイルを読み込みたいんですが 無駄なところは読み込みたくないので 何行目〜何行目 を ハンドルに放り込む方法はないのでしょうか?
440 :
439 :02/12/14 11:57 ID:???
配列使わないでやるのは無理なのかな? ちょっとログがMB級あるんで 必要なところだけ読み込めたら楽なんだけど
>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で呼び出すとかあったかな?
行の頭から数B読み込む程度の方法しかないんじゃないかな。 データを展開しないで指定行に飛ぶのは無理っぽい。
443 :
439 :02/12/14 13:08 ID:2kNAmjtj
やっぱり難しいのかな? ログファイルの記録方法を考え直して見ます
漏れに不可能はないぜ
>>439 $from = 100;
$to = 200;
$lines = $to - $from + 1;
open IN, "head -$to | tail -$lines |";
446 :
439 :02/12/14 17:39 ID:???
>>445 んん すまんです
とほほ見ながらやってるくらいのレベルなんで
ファイル名はどうすればいいんでしょうか?
447 :
439 :02/12/14 17:45 ID:???
>>445 open IN, "head -$to $filename | tail -$lines |";
で逝けそうですね ありがとうございます。
俺がよくやるのは、 while (<IN>) { next if ++$count < $from; last if $count > $to; ... } ファイルの大きさと、指定範囲によるけど、 数千行ぐらいなら十分かなぁと。 パイプは起動コスト高いから、ベンチとって見るのがいいと思う。 perlメモにperlでtailするサンプルあったけど、正直大して早くなかった。 でもお勧めは、バークレイDBかな。。身も蓋も無いけど。
フォームから送信された内容を溜めて 自動で、別窓で一覧にして永久的に表示するというのをやりたいのですが どうしたらいいでしょう
>>449 プリントアウトしてモニタ画面に張り付ける。
あーあ
>>407 激しく亀レスで悪いがprintf関数の変換指定に%gを使えば一発だよ。
453 :
nobodyさん :02/12/14 23:14 ID:TSZsnHUG
電波少年は意味不明な終わり方をしたわけで・・・ An electric wave boy is the reason which carried out the way which finishes being incomprehensible... 電波少年は不可解な方法を実行した理由です... 微妙ですが
誤爆?
>>448 それ結構時間かかるよ
あまりスマートじゃないけど配列に読んだほうが
速い
元データに行番号うっとけよ。
457 :
nobodyさん :02/12/15 02:56 ID:N8e98l/q
$value{'key'} $value{key} この二つではどちらが書き方として正しいのでしょうか?
458 :
nobodyさん :02/12/15 03:13 ID:brjLalCm
460 :
nobodyさん :02/12/15 04:02 ID:N8e98l/q
>>459 いちおうどちらの形にしても、同じ値が見れるので
どっちでもいいのかなと思ったのですが。。。
Perl4対応なら$value{'key'} perl5以降なら$value{key}
>>461 ありがとうございます
なるほど、そうなんですか。よく頭に叩き込んでおきます。
463 :
nobodyさん :02/12/15 21:08 ID:5VtRENUn
HTTPSクライアントを作りたいのですが、 参考になるサイト、書籍等ありますでしょうか?
464 :
nobodyさん :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.このように値の参照を返す方法は返す内容が膨大になった時に、 値そのものを返すよりパフォーマンスの点で期待できますか? いまいち上手く説明できないので質問の意図がわからないかもしれませんがよろしくお願いします。
465 :
nobodyさん :02/12/15 23:20 ID:1E3ue/P5
>>464 よくわからんけど・・
1. 無名のスカラーのリファレンスだという所。
2. 参照されている間、だから、printの次の行では、もう消滅している(読む手段がなくなるから)、かな??
3. 期待できる
466 :
464 :02/12/16 03:56 ID:???
なるほど、無名のスカラーなんですね。 それで納得いきました。
467 :
nobodyさん :02/12/16 14:33 ID:P42iaa2L
textarea から入力したデータ(つまり掲示板みたいなの)の改行コードを置換して 上手く <p>文章</p> としてやりたいのですが、上手くいきません。 改行コードを </p><p> に置換しても、最初の部分で </p> が余ってしまうし。 どうにか上手く囲えないですかね?
468 :
nobodyさん :02/12/16 14:51 ID:3MTAHZ/X
>>467 データを$detaに入れるとして
$deta = "<p>$deta</p>";
$deta =~ s/[\r\n]/<\/p>\n<p>/g;
これでダメ?
469 :
nobodyさん :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; これじゃダメかな。
>>469 467じゃないけど、
いま改造してるヤツでありがたく使わせてもらいます。
うまくできました。
でもなんでそれでできるのか解らない漏れ・・・
なんてーかさー、ソースに直接HTMLタグ打つのって気持ち悪いんだけど。 俺だけ? CGI.pm使ったら、すっきりするような。
472 :
nobodyさん :02/12/17 00:06 ID:x9yr2U77
CGI.pmだったらどのように書くのですか?
473 :
471 :02/12/17 00:56 ID:???
その前にさ、仕様をもっとはっきりさせようよ。 改行をそのまま<p></p>にするのか、それとも<br/>にするのか、 それとも二行以上あいているのを<p></p>にするのかとかさ。 その辺の処理をきちんとしないときちんとしたものはできないと思う。
>>473 場当たり的にてきとうにやってるんでしょ。
475 :
469 :02/12/17 02:04 ID:???
perl(もしくは正規表現を使うほかの言語)を勉強している方なら、例をあげればあとは自分の望む仕様にできると思います。 こういう所にレスをつけるときは、答えを書くというより参考になればなと思って書いています。 今回の例だと少し正規表現いじれば、471さんの言うようなケースには合わせられるわけですし・・・
476 :
nobodyさん :02/12/17 15:15 ID:/cJ6LV5I
perlで別サーバにあるファイルを読むにはどうすればいいでしょうか?
>>476 use LWP::UserAgent;
とか
use Scket;
×use Scket; ○use Socket;
479 :
434 :02/12/17 16:27 ID:dfOkftcJ
@pwdにしましたけど、やっぱり状況かわらないです・・・。 う〜ん、パスワードを別ファイルに保存するのは無理なのかな・・・。
480 :
nobodyさん :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。
下げるつもりだったのに・・・。
>>479 >>401 の $MIX[] を $pwd に変えて
sub words { ... };
&words;
でやったらちゃんとできた。
&wordsはちゃんと呼び出されてる?
もしかしたら crypt() がMD5専用かもしれないので(BSD系の場合?)、
$words = crypt($in{'word'}, '$1$' . $kw);
でやってみたら。
>>480 > Form{'name'}
$Form{'name'}じゃないのか?
それと、なぜ$adnameを引用符でかこんでいるのかわからん。
485 :
nobodyさん :02/12/17 18:44 ID:c+lM3tmR
-------変態・MTTどこでも-------
---●●●変態痴女を紹介致します。●●●---
例えば>欲求不満オマ●コヌレヌレ女・露出オナニー痴女・
フェラチオおしゃぶり女・ミニスカ・ノーパン娘・巨乳パイズリ娘・
アナルSEXおねだり娘・オマ〇コ弄られマン汁グチョグチョ女・
SM牝豚・緊縛・浣腸・スカトロ・等・・・刺激を求めています。
●●●学生・OL・主婦・モデル・牝豚・女王様・オカマ等・多数!●●●
090-8002-8356番
下のカタカナを小文字に変換してください。
http://www.エムティーティー.jp/i
system("
>>486 自分で抜きだせ!");
こんな感じ。
>>487 アドバイスありがとうございます。
できれば、人間の手でやるのではなくて、
もっとスマートにできないものでしょうか?
全角も混じってるし 書き方もバラバラだし 無理!
おやおやおや。 2ちゃんねらーにしては、あきらめが速いですね? 不可能を可能にするのがプログラマーでは? ま、私自身もうまい方法が思いつかないので ここで相談してるわけですが(@w餅
>>486 こういうのはゴリゴリソースを書いていくしかないね。
.datを取得して、行に分解する。
その一行一行に対して以下の処理を行う。
・書き込みのみを抜き出し、
・全角数字を半角に変え(正規表現にひっかかるように)、
・半角カタカナを全角に変え(ひっかかりやすくするように)、
・数字の連続+「マン/マソ/万」をボーナス額と考えて正規表現で取得する。
・例外として「ゼロ」は0として扱う。
・以上の条件にあてはまらない時は、その行には金額が書き込まれていないと判断する。
こうして得られたデータを表示するなり別ファイルに書き出したりして保存する。
こういう流れだろうな。
後は実際にスクリプトを起こすだけだが、
それぐらいなら初心者と言ってもできるだろう?
んで、実行してみてうまく抜き出せない場合は、条件を見直す訳だ。箇条書きの部分な。
そんじゃ健闘を祈る。
>>491 おお。詳しい説明ありがとうございます。
やってみます。今後ともよろしくお願いします。
493 :
木田 :02/12/18 00:04 ID:???
なんかノーベル賞云々とかの額もあったけど、あれも足されるわけね。
495 :
491 :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. 以上、よろしくお願いします。
497 :
nobodyさん :02/12/18 01:31 ID:1Ah7QOiO
print << "HOGE"; から HOGE までの中で計算する方法ってなにか無いのでしょうか?
498 :
nobodyさん :02/12/18 01:49 ID:cSfhj2ax
499 :
496 :02/12/18 02:01 ID:???
>498 そうですか、ではまた明日伺います。お休みなさい。
>>496 それはスクリプトの中に書くものではなく、コマンドラインから実行するもの。
スタート>プログラム>MS-DOS プロンプト(またはコマンドプロンプト)
C:\WINDOWS>cd デスクトップ
C:\WINDOWS\デスクトップ>perl -e "s/aaaa/bbbb/g;" *.txt
502 :
nobodyさん :02/12/18 06:19 ID:+CI84VDc
@a = ('一','二','三','四'); @a = sort {$a cmp $b} @a; print @a; 実行すると、一三四二 となります。 漢字の数字って、どうやって並べるの? できればこれを 一二三四 にしたいんだけど、 どうすればいい?
>>502 漢数字は、漢字コード上では順番に並んでないから、ソートできないよ。
通常は普通の数字で処理して、表示するときに漢数字に変換するといい。
504 :
nobodyさん :02/12/18 11:45 ID:8xOlQixN
教えて下さい。検索CGIを作ろうとしているのですが、 処理にいささか困ってます。送信フォームから来る情報は 検索文字 and検索(ラジオボタン)にするか 検索ファイル(チェックボックス) です。 and検索にするかと検索ファイルは情報が可変長なので困っています。 このような場合は受け取った情報を一つずつ解析していくのがベストなのでしょうか? 検索という性質上、0.1秒でも処理を早くしたいのでベストな手順を 教えていただけないでしょうか。お願いします。
Perlの質問じゃねーな。
処理を0.1秒でも早くしたいならCで書け。(定説
507 :
nobodyさん :02/12/18 13:44 ID:dss5kZ4m
$t=~s/ //g; とやっても全角スペースが消せません。sjis 簡単な正規表現か何か希望。 \Q\Eつけても、一時的にEUCにしてもだめでした。 いい正規表現かなにかないですか?
509 :
トリップはマイクロソフト ◆lKiTB20t66 :02/12/18 16:55 ID:9mUf2zGi
たのもー 配列の任意の場所に値を入れたらそれ以降をずらしてくれる 関数有りますか? ex. [a][b][c] [b]と[c]のあいだに[x]を入れると [a][b][x][c] こういう風なイメージです。こんなのありますか?
つまり3次元配列を4次元配列にしたいんです。
511 :
トリップはマイクロソフト ◆lKiTB20t66 :02/12/18 17:00 ID:9mUf2zGi
>>510 いえいえ単次元配列で構いません
配列に値を入れたらそれ以降がずれてくれれば
それで構いません
日本語を s/"活動内容",//; のように消去させると <AD><A1> のようなへんなコードが出来てしまいます。 日本語を安全に置換するにはどうすればいいでしょうか?
513 :
いきぬきを :02/12/18 17:26 ID:xIqy3Dxb
514 :
bloom :02/12/18 17:30 ID:fboSAjfA
>509 splice
test
518 :
nobodyさん :02/12/18 18:12 ID:R82phE4X
すぐわかるPerlのP.17に載っているファイルの先頭に #! Perlのフルパス を書くことによりファイル名を指定するだけで実行できるというのはLinuxでは出来ないのでしょうか?
PerlでWin32のアプリを作成したいのですが、 コンパイラー、リファレンスの情報が探しても見つかりません。 ご存じの方はいらっしゃらないでしょうか?
521 :
518 :02/12/18 19:08 ID:R82phE4X
>>520 実行権限を与えないと
Permission denied
の警告が出るんですよね?
実行権限を与える前も与えた後も
そんなコマンドねえよハゲみたいなメッセージがでるんです。
どうしたものでしょうか。
>>521 そのディレクトリまで移動して
./hogehoge.cgi
って実行する
これでいけるのならPATHが通ってない
DOSで作ったファイルをうpすると/usr/local/bin/perl^Mが無いので実行できない場合もある。
524 :
496 :02/12/19 00:44 ID:Duvh3oq4
>496です。教えていただいた方ありがとうございます。 さっそくプロンプト上で同じコマンドを打ち込んでみたのですが、 なぜかそんなファイルはないというエラーがでました。 試しに存在するファイル名を直接打ってみると、これは動作しました。 ワイルドカードが効かない原因はなんなのでしょうか。
525 :
nobodyさん :02/12/19 06:29 ID:ZsaWrRnV
perl5.6のdbmopenで作ったファイルをperl5.8で読み書きしたいのですが、可能ですか? どうやら仕様が変更されて読み込めない。。。
>>524 Windowsでは(というかWindows標準のコマンドシェルでは)ワイルドカードは無意味だからね。
Googleで「Perl Windows Wildcard」で探してみるといい。
>>525 dbmopenは、インストールしてあるDBMモジュールから使用できるものを
動的に選ぶ仕様だから、5.6の方に標準以外のDBMモジュールをインストールしたなら
5.8にも同じモジュールをインストールしてみるといいかもしれない。
まぁ、仕様が変わったのかもしれないけど。
525はマルチか…。
528 :
496 :02/12/19 13:52 ID:???
>526 なるほど、そうだったんですね。どうりでできないはずです。 perl windows wildcardやActive perl wildcardなどで ググってみましたが、日本語サイトでは諦めている人の 情報しかありませんでした。 英語サイトを見ると解決法があるかなあ、 ここを見ろというサイトがありましたらどなたか教えて頂けませんか。
530 :
496 :02/12/19 16:11 ID:???
>528 ありがとうございます、ばっちり走りました! 実はwildcard.pmはDLしていたのですが、使い方の説明も 書いてなかったので、どうしていいか分からなかったのです。 インストール先も分からなかったのですが、フォルダを覗いていたら libフォルダに.pmファイルがたくさんあったので、入れてみたら正解 だったようです。 3日渡りお世話になりまして、皆さんありがとうございました。
531 :
518 :02/12/19 17:17 ID:gnHgtnzE
>>522 ありがとうございます。
やってみましたところそれでも
command not found
となってしまいます。
Perlのパスはtype -a perlで表示されたものでいいんですよね?
>>531 ちゃんとファイルの先頭に「ドットスラッシュ」を書いてください。
ファイルネームだけだとコマンドパス(/binとか/usr/binね)にあるコマンドのみを探します。
533 :
518 :02/12/19 18:34 ID:gnHgtnzE
>>532 ./ファイル名 と打ち込むのでいいのですか?
それでもやっぱり駄目ですね・・・。
どこかおかしいのかもしれないです。
>>533 どうダメだったのかが知りたいが
perl hogehoge.cgi
はちゃんと動作するのかい
535 :
518 :02/12/19 19:10 ID:gnHgtnzE
>>534 Perl ファイル名 だとちゃんと動作します。
保存してあるディレクトリに移動して
#! Perlのパス や ./ ファイル名 では command not foundとなります。
536 :
nobodyさん :02/12/19 19:23 ID:sSjdESWg
誰か、C-BOARDの、./lib/file/tre.pl, msg.plを解読するスレ。 っていうのを作ってほしいな・・ 鬼のようなコードになってる。。
C-BOARDのコーディングを見ると、神の降臨を感じる。 同じことをやるにしても、あのコーディングは凡人にはできない。 解析ガンバレ>536
C-BOARD(改造版)ってはじめてソース落としてみたけど、なんでこんなデカいの!?(450KB?) ビビッタ
ソースはでかいが使用メモリは小さく、処理は小粋に軽快。
540 :
nobodyさん :02/12/19 22:58 ID:SoXwX8I8
541 :
nobodyさん :02/12/19 22:59 ID:lw7wMpYE
542 :
nobodyさん :02/12/19 23:14 ID:ZsaWrRnV
別のスレに間違えて書いてしまったのでこっちに書きます mother hanako father taro grandfather kenzo grandmother hana 上記のようなテキストファイルがあります。 これを奇数番目をキーとし、偶数番目を値とする連想配列にしたいのですがどうしたらいいでしょうか? つまり、 motherは、hanako fatherは、taro grandfatherは、kenzo grandmotherは、hana としたいのです。ご教授ください。
544 :
nobodyさん :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;
}
もうちょっとまともな手段で改行文字を消すこと。
545 :
nobodyさん :02/12/19 23:37 ID:sSjdESWg
あぁ。全然だめっぽい・・
>>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>;
548 :
nobodyさん :02/12/19 23:44 ID:sSjdESWg
550 :
nobodyさん :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; }
あれれ。少し間違えてる。<>は<TEXT>の予定だった
552 :
542 :02/12/20 00:07 ID:???
>>546 さんので完璧に動きました!
>>550 さんのも試してみます!ただ、例外処理は特に考えなくて良いんです。
みなさん、ありがとうございました!
あ。そうそう。。554の2番や、550は、メモリを沢山使わないように書いたんだけど・・ そのあたりも考えて使ってね... 冗長とか言われてるけど。。
grep {chomp} <text>;
555 :
nobodyさん :02/12/20 00:38 ID:Av7thQVn
unixパスワードを使用して そのサーバ上にあるアカウントとそのアカウントパスワードで 認証させるにはどうすればいいんでしょうか?
556 :
nobodyさん :02/12/20 00:40 ID:Av7thQVn
あ 板違いでしたね・・すんません
perlで掲示板を作っているのですが、
http://www.hoge.co.jp/index.html //comment
のように投稿者が書いた場合、//commentの部分の色を変えたいの
ですが、どのようにしたらいいのでしょうか?
正規表現を使って、取り出した文字列をタグで挟んだ形にしてやるという
ことはわかるんですが、 //commentの部分の取り出し方がわかりません。
お教え願えないでしょうか。お願い致します。
559 :
nobodyさん :02/12/20 01:03 ID:iYZ6MU3U
ろくな例ではないけど $str =~ s|([\s]+)(//[\S]+)|$1<tag>$2</tag>|g; $str =~ s|^(//[\S]+)|<tag>$1</tag>|g; こんな感じかしら。 正規表現苦手。
560 :
nobodyさん :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]+)の部分を書き換えると部分的には色が変わるのでタグはあってるんですが。
どこに問題ありでしょうか?
561 :
nobodyさん :02/12/20 02:00 ID:p0zZgi4w
$value =~ s|([^:])(//[\S]+)|$1<tag>$2</tag>|g;
こんなのはどぉ? $value =~ s/(?<!http:)(\/\/.+)$/<a>$1<\/a>/;
563 :
nobodyさん :02/12/20 02:11 ID:4aAUDwG2
564 :
nobodyさん :02/12/20 02:18 ID:4aAUDwG2
>>562 レスありがとうございます。
なるほど、こういうふうにすればいいんですね。
バッチリです。勉強になりました。
ありがとうございました^^。
565 :
519 :02/12/20 08:51 ID:???
>>520 ありがとうございました。
遅れてスマソ
perlのスクリプトで、他のホスト(ローカル上)にあるファイルの有無を確認する スクリプトを組みたいのですが、出来る限り動作の軽い物にしたいと思っています。 単純に if(-e $ARGV[0]){ print "ok"; }else{ print "no"; } のようにしようと思っていたのですが、-eでは他のホストのものは 調べられないそうですね。 他のホストを調べられ、かつ軽くする方法はありますか?
567 :
566 :02/12/20 11:56 ID:???
すいません、質問追記。 それをイントラのweb上で、formにファイル名入れて確認させる形にするつもりです。 ので、実際には$ADGV[0]とかにはならないと思います。
>>567 404 Not Found
ってレスポンスを拾ってくればよいこと。(HTTPのばやい)
>>566 他のホストでhttpサーバとかFTPサーバが動いていてそのファイルにアクセスできるなら可能。
570 :
nobodyさん :02/12/20 12:51 ID:kZj4R1Az
連想配列から指定した要素を取り除くにはどうすればいいでしょうか? 添え字で指定したいのですが、 ループ処理で何番目かを自分で取得するしかないんでしょうか
聞いてください!! まえにココで、質問したのですが、 いま、過去ログに行っていて読めません。 もう一回質問します。 ディレクトリにある全てのファイルから 最後の3行を取り除くのにはどうすればいいでしょうか? 始めの3行ならば % perl -ne 'print unless 1..3;' *.txt でいいはずです。
572 :
566 :02/12/20 13:31 ID:???
>>569 逆に言うと、動いてなきゃ出来ないって事ですか…
connectとか使うしかないんですかね。
どもでした〜。
>>570 delete(key);
内部ではループで回してると思いますが。
とりあえず、エレガントな解が出てくるまでは、 ファイル読み込み N=行数カウント 1..(N-3)まで出力 こんなスクリプトで我慢汁!
聞いて聞いて!! 谷口 腕太 タニグチ ワンタ 1977年生まれ を 谷口 腕太,タニグチ ワンタ,1977年生まれ に置換したいです!!! "2つめの全角スペース"→"," "4つめの全角スペース"→"," という風に置換するにはどうすればいいのでしょうか? そんなことできますか??
576 :
570 :02/12/20 14:51 ID:kZj4R1Az
>>573 ありがとん
ループでやってるとさすがにコードが長くなるんで
助かったわ〜
577 :
nobodyさん :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" って怒られる。 なぜ?
>>577 jcode($test)->jis の返値はJcodeのオブジェクトじゃないもんで。
579 :
nobodyさん :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 | ~~~~~~ こんな感じでやるにはどうしたらいいんでしょうか?
>>579 $data[1]に0,1,2ガハウィッテイウィルノカ?
ヲマエハバカカ?
581 :
579 :02/12/20 17:26 ID:AHOklkZ9
$data[1]に0,1,2のどれか1つが入っている。 ってことです。 あと $out[0]にyes,no,ok のどれか1つが入っている。 ってことです。 書き方がおかしくてすみません
あるDBからデータを呼び出して、それらを条件によって分類、 それをテキストファイルとして出力するスクリプトを組んだところ、 コマンドラインから実行すると問題なく動くのですが、 phpなどから呼び出すと、out of memoryとなってしまいます。 止まるは常に同じところなのですが、一体何が原因なのでしょうか? phpからは system ("hogehoge.pl $a $b $c"); というように動かしています。 $a等は、formのtype=textで指定するようになっていて、 pl側で表示させて、問題なく渡せていることは確認できたのですが・・・
>>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];
}
ちなみに難しい処理は一つも無い・・・聞く前に自分で考えてみたのか?
perlでBasic認証って出来ますか? 具体的には /home/user1/user.pass に htpasswdで暗号化したのをアップしてもらって user1で認証しようとした場合 /home/user1/user.pass をパスワードファイルに読み込みたいのですが...
585 :
bloom :02/12/20 18:18 ID:V4mJQRW4
>>584 とりあえず「BASIC認証」「Perl」でググルとかなり出てくるだが、それらを
調べてみたのか?
588 :
579 :02/12/20 20:35 ID:AHOklkZ9
>>583 どうもありがとうございました。
私はIDにAHOと出るくらいアホなんで
こんなのもわからないんです。
589 :
579 :02/12/20 20:41 ID:AHOklkZ9
if($chkflg) { print "<option " . $selected . " value=" . $data[1] . ">" . $out[0] . "\n"; } あと、この部分は何のためにあるんですか?
590 :
nobodyさん :02/12/20 20:54 ID:Av7thQVn
setuidなperlプログラム作っているのですが 特定のディレクトリのサイズを取得するためにはどうすればいいんでしょうか? unixプログラムならduで一発なんですが setuidなもんで外部プログラムがうまく動かないっス
591 :
nobodyさん :02/12/20 21:00 ID:mZ5RE2AI
すみません。。
>>540 よろしくお願いします、、
グラフといえば、GD使うのどう?
593 :
fg :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 です。
594 :
571 :02/12/20 22:32 ID:???
聞いて
595 :
571 :02/12/20 22:32 ID:???
我慢汁ですか?
>
>>595 >@ARGVでも使えや
具体的には。
>>550 ごめん。勘違い。ちゃんと動く。悪かった。
槍田氏
>>593 別に難しいことじゃない。
エラーの内容自体は最初の.までだ。
後はシステムからのありがたいアドバイス。
辞書ひけ。ヴォケ。
600 :
546 :02/12/20 23:40 ID:???
>>553 冗長とか言って悪い。俺は心情的な富豪的プログラミングの信奉者なんで。
>>554 の出したヒントにより、3行に集約できた。
open ( IN, 'file' );
%hash = grep { chomp } <IN>;
close ( IN );
ソースは短ければ短いほどいい。と思う。
601 :
595 :02/12/21 00:05 ID:???
>>597 > 具体的には。
そんなもんまでしらんがな。
それくらいわれが調べたれや。
602 :
546 :02/12/21 00:14 ID:???
まだやってんのとかつっこまれそうだが。 open ( IN, 'file' ); $eval = join ( '', <IN> ); close ( IN ); $eval = '%hash = qw('.$eval.');'; eval $eval; これなら、途中で余分な改行が入ってたり、 改行のかわりにタブや半角スペースが入っていても問題なく読み込める。 ま、そゆことで。
>>575 $line = '谷口 腕太 タニグチ ワンタ 1977年生まれ';
@token = split / /, $line;
$line = "$token[0] $token[1]\,$token[2] $token[3]\,4token[4]";
print $line;
# 谷口 腕太,タニグチ ワンタ,1977年生まれ
これからは、こんな糞みたいなフォーマットで記録せずに、
最初からきっちり設計するんだぞ。
%hash = split(/\s+/,join('',<IN>));
>>575 のようなヤシって
名前: 谷口, 腕太
フリガナ: タニグチ, ワンタ
生年: 1977
などというデータ仕込まれてパニックに陥るんだろうな。
606 :
nobodyさん :02/12/21 09:57 ID:94hGjCxm
すみません。 入力されたsjisの日本語をcryptしてパスワードを発行することに 何か問題があるのでしょうか。 文字によってサーバーエラーになるとか、 文字によって暗号化したものにセキュリティホールが発生するとか。 文字の長さは同じです。
気にするな
Proxyの255.255.255.255:80 のポート80の部分ってどうやってわかるんですか? $ENV{hoge}でしょうか?
>>608 普通は、ポートスキャンするしかない。と思う。
Via:に入ってたりするかもしれないけど・・・
610 :
nobodyさん :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" で呼んでます。
>>611 クッキーってどうやって発行してるか知ってる?
それが分かってればSSIでダメな理由はすぐ分かるはずだけど。
614 :
お? :02/12/21 12:51 ID:???
>>612 早速のレスありがとうございます。
色々WEBで検索をかけて無理そうだとは思ったのですが、スキルの高いこちらの方々なら何か力技でも無いだろうかと思いまして。
やはり無理ですか。ありがとうございました。
>>613 私は普段javaSc切ってますので出来るだけ使いたくないんです。
なにをインクルードして表示してるのかわからないけど 力技ていうなら<img>タグでクッキー発行する為だけの イメージ吐いてみる。
616 :
お? :02/12/21 22:34 ID:???
>>615 ありがとうございます。
取りあえず別の方法で逃げました。
imgタグで呼び出すのも試したのですが、他の方のスクリプトを参照して真似ても、どうも正常に動かないので投げました。
まだまだ基本が出来てません。
ありがとうございました。
PerlでLWPモジュール使ってPOSTしたときにヘッダーを見る方法を教えてください。
618 :
lopper :02/12/22 02:19 ID:iYo7T5on
Encode モジュール分からん。 Encode::JP には、 $euc_jp = encode("euc-jp", $utf8); と書いてあるが、utf8 の文字列からしか変換できんのか?shiftjis 変換は from_to( "shiftjis", "euc-jp", $strings ) をすれば出来るが、変換元文字コードを指定しなければならん。自動で判別して 文字コードを変換するにはどうさればいいのか?
>>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]);
620 :
lopper :02/12/22 13:08 ID:dY2TGdd7
やはりそうですか。Guess モジュールを使用しますよね。 Guess モジュールって $jpstring が短い文書の場合、判別つかずに shiftjis or euc-jp などと返してしまうのですよね。 たとえば上記を $jpstring = '結論' とすると判断がつかず $encode の中身は 'shiftjis or euc-jp' が入ってきます。 やっぱりそういうものですか。
621 :
nobodyさん :02/12/22 13:38 ID:y/X/HeeK
今Lock関数を勉強しているのですが、その中に if ((-M $lockdir) * 86400 > 600) このような処理があります。 変数の前に-Mや-Eなどを見かけるのですが、検索が掛けられませんのでこれら-をつけた英字の総称(?)を教えてください。
623 :
621 :02/12/22 14:02 ID:???
>>622 ありがとうございました。
検索を掛けても2件しかヒットしなかったですが、少し情報が入りましたのでなんとか自力で調べてみます。
ありがとうございました。
>>621 ファイルテスト・オペレータ
man perlfuncに一覧が有る
625 :
621 :02/12/22 14:23 ID:???
>>624 ファイルテキスト演算子で検索していますた・・・
色々詳しく解説しているサイトを見つけましたのでゆっくり勉強します。
本当にありがとうございました。
626 :
りゅう :02/12/22 17:29 ID:9RnyP9Mx
active perlを使ってcgi形式で gifのグラフィックカウンターを作りたいんですけど。 全然、先が見えてきません。 どなたかご教授よろしくお願いします。 サイトを検索してもSSIのやつがほとんどなんです。 (´・ω・`)ショボーン
perl 画像 連結 てキーワードで検索かけよう。 とほほさんのgifcat.pl使うと簡単
629 :
りゅう :02/12/22 18:42 ID:9RnyP9Mx
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
ActivePerl HTTP-Lite Time-HiRes のインストール法がよくわからないんですけど 誰か教えてもらえませんか?
>>630 /(\w{3})(\w{3})/ && ($1 eq $2) && print "[$&]\n";
/(\w{6})(\w{6})/ && ($1 eq $2) && print "[$&]\n";
でしょ。/ /の中の空白には意味があるよ。
>632 あああああ、本当だ…。 もしあのままの記述だと、空白がないとマッチしないという事に なるのですね。なるほど。 レスありがとうございます。とても勉強になりました。
635 :
nobodyさん :02/12/22 21:55 ID:ICjO1mQt
system,execで実行したプロセスのプロセスIDを得ることは出来ますか? kill INT => $pid;したいんですが。
>>635 systemは無理だろう。execならpidは代わらないからexecする前にpid取っとけ。
つーか、普通execする前にforkしたときに親の方で取っとく。
638 :
nobodyさん :02/12/23 00:36 ID:3vP0jNwS
スレッド型掲示板をFLASHでやりたいと思います。 「ActionScript+CGIプログラミング」(ソフト バンク)ではスレッド を立てられないのですが、少なくともデザインだけはオリジナルに したいです。どこかにいい資料はないでしょうか?
639 :
nobodyさん :02/12/23 01:21 ID:cOyl9Q7w
@compressedをgzipに渡して解凍させ、結果を受け取りたいのですが どうもうまくいきません。 open GZIP, "| /usr/bin/gzip -d"; print GZIP @compressed; こんな感じで実行してみましたが 結果が標準出力に出力されて、受け取れないです。 どうしたらいいですか?
open GZIP, "| /usr/bin/gzip -d >file";
641 :
nobodyさん :02/12/23 01:38 ID:cOyl9Q7w
>>640 レスありがとうございます。
なるほど、ファイルを経由させれば簡単ですね。
ですが、ファイルを経由しないで、解凍結果を受け取りたいのです。
@compress -> gzip -> file
file -> gzip @decompress
これは分かるのですが
@compress -> gzip -> @decompress
このように処理したいのです。もう一つお願いします。
642 :
640 :02/12/23 02:06 ID:???
うーん、調べたけどできないんじゃない? パイプ "|" を使うと内部でフォークされて子プロセスの標準出力へ吐き出される っぽい。。。
643 :
nobodyさん :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
>644-645 ソースを示せ。 まずはそれからだ。 どうせchopかchompを入れちまってるだけだろう。
>>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
ごめん、私が悪かった。 せっかくの休みなのにマヂでごめん。
>>648 変数の扱いや、動作、振る舞いなど微妙に違うので幼虫居。
同じ漢字なのに、でんでん違う日本語と中国語みたいだから(w
あほな質問かもしれませんが、 『=>』 これってどういう動作をする物なんでしょうか? 宜しければ教えて下さい。お願いします。
↓
p "10" #=>"10" p 10 #=>10 print("こんにちは") #=>こんにちは
654 :
nobodyさん :02/12/23 15:27 ID:UoY7N20E
=>は,と同じ。見かけが違うだけ
なるほど=>そうなのか
656 :
nobodyさん :02/12/23 16:19 ID:3KeBindS
今カウンタを作ってます。 今までずっとcount.cgiとかでそのままHTMLに数値を出力していたのですが、 <img>タグで呼び出すにはどうするんでしょうか? count.cgiと呼び出すカウンターの違いはなんなんでしょうか? どうかご教授お願いします。
657 :
nobodyさん :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を取りに行く。
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; } どちらが効率が良いでしょうか。 あんまり変わりません?
配列に1行1文の要素が入っていて、/zzz/でマッチした1行を削除するにはどのようにしたら良いですか? ヒントだけでもいいのでお願いします。
>659 foreach(配列){ if(/xxx/でマッチしたら){その行を削除} }
>660 レスありがとうございます。 ループを使ってマッチしたら、その行を削除というのは分かるのですが、「その行を削除」の所が分からないんです・・・ while(@配列){ if($_ =! /zzz/){ push (@新しい配列,$_); } } @配列 = @新しい配列; こんな感じでしか思い付かないのですが、何かいい方法お願いします。
@line = grep{ ! /zzz/} @line;
>>654 嘘教えちゃいかんよ。
perl -w -e '%s = (a , 1); print $s{a};'
perl -w -e '%s = (a => 1); print $s{a};'
664 :
641 :02/12/23 20:50 ID:???
>>647 そのように外部プロセスと通信するのですか。
手持ちのWindows環境だと、'-|'は(forkを使っているみたいなので)
動きませんが、UNIX環境で試した所、見事に動いてくれました。
それと調べた所、IPC::Open2という標準モジュールでも
外部プロセスとの通信ができるようで、こちらを使うことにしました。
わざわざサンプルコードまで付けて頂き、ありがとうございました。
謎が一つ解けました。。
>661 それで悪い理由は何? =!の部分がわけわからんけど。
プログラミングで速度は重要だが、それと同等以上に安定性と保守性は重要。 速度を軽視するのは良くないが、だからと言って、自分に不相応な高速化に挑んで安定性や保守性がなくなっては意味がない。 高速化のコードを教えられても、自分で保守しきれないと思ったら、自分でわかるやり方に戻すのも利口な人間の判断だよ。 プログラミングはタイムトライアルじゃないんだから。
で、自分は利口だと、そう言いたいわけですね? :-)
668 :
659 :02/12/23 22:00 ID:???
>662 ありがとうございます。 その方が僕のよりかなり良さげですね。 >665 =!じゃなくて!=でした。 何か配列を無駄に出し入れしている気がしたので。
!~ ですが・・
670 :
nobodyさん :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"> こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
671 :
nobodyさん :02/12/23 22:44 ID:ExE7e9sR
>>670 > <INPUT type="hidden" name="action" value="write">
> こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
書き込みフォームのなかにこれを入れておくと、CGI側では他のフォームと同じように
$in{action} という感じで値が取り出せる。(この場合、中身はもちろん write)
ただ単にCGIが呼ばれただけだと $in{action} の中身は空。
これをCGIの冒頭で判断して、表示だけするなり書き込みするなり処理を行う。
ちなみに"action"と"value"の部分は、他の name の中身と重複しなければ
好きな文字列でいいよ。
673 :
nobodyさん :02/12/23 23:14 ID:/nqoyrjh
2ch風の掲示板作りたいんですけど、どうすればいいですか
>>673 さがせや。そして自分好みに改造。それが一番楽。
675 :
670 :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を実行するってことでよいですか?
>>675 微妙に甘い。それではwriteがあった場合、
write_fileが実行されるが、その後で本来の表示もされる。
if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
exit;
この方がよかないか?
677 :
670=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; これだとできないんですけどなぜですか?
>1:自分はこう言う事がしたい。 >2:それでこんな風にやってみたが・・・ >3:それだとこんなエラーが出て上手く行かなかった。 > >1と3が無いと誰も答えられないよ。 >良い回答は良い質問から。一緒に勉強しましょう。
>>677 HTTPヘッダ吐く前にprintしたらいかんだろう。
print "Content-Type: text/html\n\n";
をif の前に置く。
>>588 アホを怒ったりはしないが自分で努力せずに「聞きゃいいや」って考え方に
教える気力を奪われる
>>589 はどういう場合に実行されるか考えれば貴方にとって必要か不必要か
判るはず。アホを自慢せずに自力で考えましょう
681 :
nobodyさん :02/12/24 16:14 ID:V710Vuw6
大きな容量を扱うのできになります。 rindexって便利そうなのですが、 1バイトずつ戻ってくれるのでしょうか。 頭から調べなおすのでしょうか。
682 :
nobodyさん :02/12/24 21:26 ID:0ZCnncs6
滅多に使わないクラスモジュールを、必要なときだけ読み込みたいと思い、 eval "use $module"; と書いてみました。 しかし、useとevalでぐぐってみてもヒットしません。 不安なので、ベターな方法を教えてください。
>>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; }
685 :
nobodyさん :02/12/26 02:12 ID:wZ43brtn
fork()した後、親プロセスと子プロセスで共通に使える変数(一方の変更が他方に影響を与える変数) っていうのは使えませんかねぇ。
686 :
685 :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); } }
687 :
nobodyさん :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]&・・・"; のようにやっていく方針しか立てられないのです・・・ うまいことやる方法があったら、教えてください。
689 :
687 :02/12/26 03:11 ID:WbFeNueP
>>688 ごめんなさい・・・本当にありがとうございました・・・
ちょいと質問です。 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
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;
補足: 1 img.pl ではなく .cgi の間違いでした。 2 img.cgi の 4行目は use Image::Magick; になってます。 一度に投稿できなかったので分けて投稿しました。 板汚しですいません。
自己解決? vi /etc/ld.so.conf で /usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/ を追加したら 正常動作しました。 ImageMagickってこういうものなんでしょうか?^^;
694 :
nobodyさん :02/12/26 11:23 ID:DQIeVDZ8
質問です。 ただCGIでHTMLを読み込んで表示させたいのですがどうすればよいでつか? 本当にただindex.htmを外から読み込んでそのまま表示させるだけです。
>694 index.htmをファイルオープンして読み込んで表示するだけだが、 本当にそれしかしないなら、直接index.htmを表示しなさい。
>>694 index.htmlを読み込んで出力するまえに
適切なヘッダも出力しなきゃだめよ。
Content-Type: text/html
とか
>>694 なんだ、マルチポストじゃねえか。
別スレで答えて損した。てめえ氏ねよ。
perlで一定時刻毎に処理をするようなスクリプトはどうすればよいですか? 処理するところは書けたのですが、「一定時刻に」というところでつまづいています。
699 :
nobodyさん :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"; } この処理の流れが良く理解できません アドバイスなどお願いします
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
>>698 ループを作り時刻をチェックし希望の時刻になったら目当ての処理実行が単純
702 :
698 :02/12/26 18:54 ID:???
>>701 それだと常にperlが実行されている状態になりますよね?
>698 ありがちな方法なら、「最後のアクセスと時間帯が違えば処理をする」という方法。 1時間に1回の方法なら、最後にアクセスした時の「時間(11時とか)」を保存しておき、 「前回の時間と違ったら(11時じゃなくなったら)処理をする」などでやる。 ただし、1時間以上アクセスがなかったら困ったりする事もある。 あと、鯖がかなり限られるがcronもある。 これはスレ違いだから自分で検索すれ。
>>685 別プロセスのメモリ(変数)をいじることは不可能。
>>699 普通に関数を再帰的に呼び出してるだけだが?
それ以上説明のしようがない。
706 :
nobodyさん :02/12/27 00:12 ID:BkvjWsIw
厨質で申し訳ないんですが、 mod_perl を入れるために、use strict をしておこうと思ったんですが、 $| = 1; $ENV{いろんな環境変数}; こういうのも my しないとだめなの?
>>706 グローバル変数っしょ?
つぅか自分で試しても罰は当たらんと思われ・・・
708 :
nobodyさん :02/12/27 00:54 ID:qm28R9Zo
709 :
706 :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 されるのか?
やってみればいーじゃんかよー
711 :
699 :02/12/27 01:36 ID:BtYEwdxr
実行した際に吐き出される値の流れが 途中からよ〜分かりません どこで値が保持されどの様に順番に吐き出されるのか?
common.plはなによ? パッケージならパッケージ変数になってるし、 use strict; しなくてもそのスクリプト内でしか使わないなら、my とかしとけばいいだけじゃない? >common.pl には、何も書かなくても自動的に use strict されるのか? no!
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";
}
714 :
699 :02/12/27 08:47 ID:???
>>713 ありがとう
なんとなく感じはつかめました
>>701 その通り、常に実行ですね
>>703 で出てる様にcronを使う手がありますがユーザーに開放している鯖はかなり少な
いし、perl(スクリプト)での質問でしたので
>>701 としておきました
笑える手として、webサーバーがあるならhtmlより定期的に呼び出すとかもあるけ
ど、これもスレ違い
>>715 答えが目の前にあるのにすれ違いか。おめでたいな。
717 :
nobodyさん :02/12/27 20:28 ID:pRxcckDo
リファレンスについて、詳しく解説している日本語サイトを ご存知の方がいらっしゃいましたら、是非教えてくださいまそ。
718 :
nobodyさん :02/12/27 20:35 ID:yQoOgQCT
>>717 javaの参照とかCのポインタとかをつまみ食いするのも手だと思う。
>>719 なるほど。javaは出来ないので、Cの方をつまんで来ます。
ハッシュのリファレンスで foreach(keys %HASH){ ・・・ } に相当する処理ってできないんでしょうか? できるのならやり方教えてホスイ。
$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_
真似て作ったつーか、丸写ししただけかよ。短いスクリプトなんだから、 本と自分で打ったのを一行ごとに交互に並べ替えて見比べろ。
>>724 どの段階でどういうエラーが出たのかな?
ちなみに単純に違いと言えば最後から3行目のnameが
「message」<=>「massage」
>>730 ミスった
最後から3行目のprintで・・・でした
>>730 甘やかさん方が良い。それくらい自分で見つけられんと成長できない。
733 :
nobodyさん :02/12/28 13:54 ID:aT8fBpaX
>>732 とも思ったけど「何回も見なおしたけど」辺りが自分とかぶってつい(汗
しかもタイプミスって辺りが尚更かぶってしまた(激汗
しかし参考書もどうかと、完全にトラップでし>massage
735 :
:02/12/28 14:07 ID:???
エラーメッセージも読めんような糞ったれに情けなんかかけるな。もったいない。
737 :
nobodyさん :02/12/28 19:10 ID:tgcla43L
>>737 ここってさ、使う低脳用の板じゃないんだ。すまんな。
739 :
737 :02/12/28 19:20 ID:tgcla43L
ごめーん。
「エラーメッセージ貼れ」といったところで、「Internal Server Errorって出てます」って
オチだろうな。
>>724 あんたの作ったやつ、うちのローカル環境で正常に動いたぞ。
>>740 じゃあ、
#perl -w omaenokuso.cgi
とかの結果張ってもらう?
解決した質問にいつまでしがみつきやがりますか?
>>737 IPの第三セグメントまで一致したら削除する仕様
744 :
721 :02/12/28 23:54 ID:???
745 :
nobodyさん :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; } こう書くことができれば、いちばん早いんですが・・・
746 :
nobodyさん :02/12/29 02:44 ID:VsdGeM22
>>745 $text=~s/(\d+)/"<"x$1/ge;
不具合がなくもないが。
747 :
nobodyさん :02/12/29 03:06 ID:9gTPrGHJ
>>746 ありがとうございました!
ちなみに勉強不足で "\d+" が何を表しているのか分からなかったりするので、それを調べてから試してみます ^^;
748 :
745 = 747 = 748 :02/12/29 03:08 ID:9gTPrGHJ
\d は [0-9] でしたね ^^;
不具合が気になる。
750 :
nobodyさん :02/12/29 13:11 ID:apFJB7sH
$hoge = "hoge"; の状態で $hoge の一番後ろに hageと言うのを足す時は $hoge = $hoge."hage"; とやるしかないのでしょうか?
>>750 まぁ、それが一番簡単じゃないの?何か不満?
Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか? Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか? Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか? Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか? Perlでブラウザゲームを作りたいです。 それで、勉強って一体何すればいいんでしょ? とりあえず本読んでBBSの構造くらいは分かるようになりました。 公開されてるゲームのプログラムとか読み漁ればいいのですか?
>>753 とりあえず自分のローカルのOS(Win or Mac)でゲーム作れや。
それを移植する段階になってからこのスレで聞け。
こんにちは。 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 ラベル; としてもエラーになってしまう…。
>758 doループの意味わかってる? ループの前にdo部分をやるから、その時点ではループになってないぞ。
do はあくまでブロック構文。 whileなどでループ修飾してもループブロックではない。 漏れはPerlはインタプリタ系、スクリプト系だからと妥協してる。 構造化BASICで出来るのもあるし、そのうち対応してくれるとうれしいYO
762 :
nobodyさん :02/12/30 20:31 ID:8PVwYuQF
perlの関数内でstatic変数を宣言できるのでしょうか。
763 :
nobodyさん :02/12/30 21:28 ID:neFLd3GG
>>759 LOOP:
{
do {
last LOOP;
}
}
764 :
nobodyさん :02/12/30 21:29 ID:neFLd3GG
765 :
nobodyさん :02/12/30 21:32 ID:neFLd3GG
>>762 {
my $static;
sub hoge {
$static++;
return $static;
}
}
766 :
nobodyさん :02/12/30 21:35 ID:neFLd3GG
>>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 ( & ) の& の意味が分かりません。
プロトタイプ厨 降臨 ↓
動きません。助けてください。 mhile($i = 1); print "gohe"
777 :
nobodyさん :02/12/31 09:20 ID:f3dKkAkh
778 :
nobodyさん :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キーワードや、次の引数と区切るコンマは必要ない。
>>778 &は(“sub”キーワードや連続したカンマを要求 しないような無名サブルーチン)を要求します。
って事じゃないの?subsequentの訳を思いっきり外してる気がするけれど
780 :
nobodyさん :02/12/31 09:41 ID:f3dKkAkh
ぅ。自分はこう理解したんだけど・・ ↓実験用 #!/usr/local/bin/perl sub hoge (&&&) { print join(':', @_) . "\n"; } hoge { } sub { }, sub { };
781 :
nobodyさん :02/12/31 11:10 ID:aM0LcM99
778が正解
782 :
nobodyさん :02/12/31 11:47 ID:YVY0+rTm
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";};
};
784 :
nobodyさん :02/12/31 12:09 ID:f3dKkAkh
sub catch (&) { shift; } は、shiftで、引数を一つもってきて、それが最後に評価したものだから、 それを戻り値として返す。っていう意味だね。 sub catch (&) { return $_[0]; } と同じ。 結論としては、無名関数のリファレンスが返される。
perlの勉強をはじめて半年ほどたち、入門本程度の内容なら理解できました。 ちょっと難しめの本をぱらぱらと読んでみると、 パイプとか、mod_perlとか、よくわからないものばかり。しかも読んでもいまいちぴんとこない。 脱初心者のためにみなさんはどのような事をされましたかっ!?
>>785 大げさなことしなきゃ入門書程度の知識で掲示板くらいは組めるからなぁ。
mod_系はlinuxの勉強してたときに覚えた。パイプはDOSの時名前だけ聞いて
これまたlinuxで本格的に使い始めた。
787 :
カミ :02/12/31 14:19 ID:???
>>784 氏ありがとう
てことは、実際ctach内のブロックはsub catch内で実行されるのでなく
sub try の&$catchb;にて戻ったレファレンスが実行されると考えればいいのだね。
PS
ところでmod_perって何?
俺も知りたい。mod_perって何?
mod_perl だよ。 検索すれ。
>>789 みんなmod_perlは知ってると思われ。
791 :
nobodyさん :02/12/31 15:12 ID:TZQCX2rE
ソケットでFTP接続して2ch.txtがあるかないか調べる方法ってありますか?
>>791 Socketパッケージはあるだろ。
で、何でhttpで行かないのか問いただして良いかい?
793 :
791 :02/12/31 15:19 ID:???
>>792 正直ー、ソケットの方とかあまり詳しくなかったです。
今からhttpでググッてきます。
794 :
791 :02/12/31 15:25 ID:???
ほんとは、FTPでログインをしてファイルを削除できればと試行錯誤しているんですが for (1..10){ last if(FTP先の削除したいファイルが削除できたら) 削除処理 } のような形にしたいんです。 ホウホウワカリマスデスカ?
>>794 ごめん、何がしたいのか1から説明して。
796 :
791 :02/12/31 15:33 ID:???
>>795 1. FTPで指定されたホストにログイン
2. ディレクトリィの移動
3. ファイルを削除するまで削除処理を実行する
4. 削除完了後にログアウト
この一連の処理を行いたいです。
>>796 system(rm -rf /home/user/hoge/data);
じゃだめ?
>>791 1 RFC959読む。他に拡張もあるが
>>791 の目的にはこれで充分だろう。
2 ftpをデバッグモードで動かしてRFCを理解する。
3 Net::FTPを入手して使う。
もめでとー >みんな 今年も過疎板でがんばろー (・□・)ノ
801 :
nobodyさん :03/01/01 22:24 ID:lIl6EtKn
my $hash_ref = \(a => \@list_a, b => \@list_b,); の場合、list_aの配列を取るにはどう書けばいいのですか?
802 :
nobodyさん :03/01/01 22:48 ID:lIl6EtKn
すみません。 my @list_a = @{${$hash_ref}{a}}; で逝けました。
804 :
nobodyさん :03/01/01 23:17 ID:ItqiYY13
805 :
nobodyさん :03/01/01 23:31 ID:RvFz9efr
>>802 my @list_a = @{$hash_ref->{a}};
の方が普通・・だと思う。
806 :
nobodyさん :03/01/01 23:33 ID:RvFz9efr
最初のも、、これの方がいい。 my $hash_ref = { a => \@list_a, b => \@list_b, };
807 :
nobodyさん :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が入る
>>807 うーわー
もう何がなんだか・・・
これだからPerlは(以下略
>>808 すまんが同意。
Cのポインタは極めたぜ!とか自負してるレベルでは全然倒せないっす。。。
>>809 char **a[10][20]へのポインタを宣言してみてください
811 :
カミ :03/01/02 03:38 ID:???
例えば $aaa = "aaa"; print ${aaa} ;#aaaが表示 このように変数名そのものは$と言う連想配列の要素らしい事がわかる
812 :
nobodyさん :03/01/02 23:36 ID:L6yfXpSS
>>811 それはちょっと無理が・・
その書き方は、単純に、変数名の区切りをはっきりとさせる。というだけだね。
$aaa = "hogehoge";
print "test:$aaabbbccc"; #test:だけ表示
print "test:${aaa}bbbccc"; #test:hogehogebbbccc
813 :
nobodyさん :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が入る
814 :
yani ◆saNSktNEdQ :03/01/03 00:28 ID:0E5Ge7qR
コンマ演算子の働きと言うよりは、list constructor では と言ったほうがいいかも知れない。 qw(...)でも同じように働くから。 しかし本当のところはPerlのソースコードを読まないと分からないのかも知れない。 内部的にコンマ演算子使ってるかもしれないし。
>>813 コンマ演算子は代入演算子より優先順位が低い。
$a = 'a', 'b', 'c'; # これはaが入る
@a = 'a', $b = 'b', 'c'; # これは @a = ('a'); $b = 'b'; 'c' と同じ
816 :
813 :03/01/03 01:13 ID:nupLg+Ov
うー知らんかった。単純に。優先順位についてもっと勉強するか・・
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)が有る様に思える。
>>813 何が言いたいのかわからんのだが…。
@{$s} == @$s == ただのデリファレンス
じゃないのか?
820 :
819 :03/01/03 17:37 ID:???
821 :
nobodyさん :03/01/03 21:46 ID:nupLg+Ov
>>818 そんな難しいことしなくても、Data::Dumperを使うとざざーっと出してくれる
>>811 でも変なこと言ってるけど、名前の部分が空っぽの記号だけの変数なんて存在しない。
>>812 を読めばわかるじゃろ。
どうやって実装しているかが分かれば…
824 :
yani ◆saNSktNEdQ :03/01/04 00:02 ID:8PdubkBh
参考になるかどうか知らないが、%::っていうのがある。
825 :
yani ◆saNSktNEdQ :03/01/04 00:03 ID:8PdubkBh
まあ、::が入ってるから、関係ないかな。
826 :
カミ :03/01/04 00:38 ID:???
827 :
カミ :03/01/04 16:41 ID:???
>>824 氏
その%::ってどう使うのですか?想像つきません。
>>826 >$s = scalar $hash{array}
で$sにARRAY〜が入っているのは
scalarがリファレンスを返したりもするのですね。
>@{$s}にて@なる連想配列(配列の親玉の様な)から配列を参照できる。
@なる連想配列云々は普段使用している参照となにも変わらないような・・・
$s = \$hash{array};
for each (@$s) { etc... }
リファレンスが入っているのなら
@{$s} は @$sそのものですし。。
>で$sにARRAY〜が入っているのは で$sにARRAY〜が入っているのね。 の間違いです。ごめん。。 scalar がリファレンスを返したのは = [1, 2, 3]; で定数配列? を代入させたからですか・・・ 納得。
>>829 my $a = ['aho'];
print $$a[0];
$$a[0] = 'baka';
print $$a[0];
って代入もできるから定数ではないYO
\[etc...]
で定数配列になる
この変数はアドレスだけで、特に名前は存在しないから
無名変数と言えなくもない
変数名はただのメモリアドレス識別子ともいえるから
特に強調することではないYO
質問です。 $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;
>>831 わざわざsocketを使っているのって凄いでつね。
どんな環境(OSなど)かは判りませんが、楽してモジュール使うとか、system 'wget -色々'; とか使った方が楽なような気がしまつでつ。
あと、UA送信した方がよいかもしれません。
それともPerlが、勝手に付けてくれるのかな?
(自鯖ではUA無しは即アク禁にしていまつ。)
>>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: もチェックしているようです。
834 :
831 :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";
835 :
nobodyさん :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ページの情報を参照するのが面倒だと思って 作成を考えた次第です。 方法等はちょっと思いつきに近いものがあります。 スレ違いなら申し訳ないです。
>>836 環境によって読めない文字を平気で使う奴にWebプログラマとしての心得があるとはとても思えない。
838 :
偽PG :03/01/05 00:15 ID:X0VKDjVo
機種依存文字については申し訳ないです。 これからWEBプログラムを学ぼうとしたのに こんな所で突っ込まれては俺もダメですな。マジ勉強しなきゃ。
>>838 ああ、すまんな。言い過ぎた。
>ローカルの情報ではなくWEBページから情報を取得して
>カウントする事は可能なのでしょうか?
サーバが外にコネクションを張ることを許可しているならできる。
840 :
nobodyさん :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' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 となるんですが、どなたか助言お願いします
842 :
偽PG :03/01/05 00:34 ID:???
>>839 ありがとうございます!
後は許可しているかの確認とWEBプログラムか。
行うことの目的ができて感謝です。
844 :
840 :03/01/05 00:52 ID:0ij2w7ok
>>841 >>843 すいませんでした。
AN HTTPD daemon ver1.42dというやつです。
>>844 きちんと一行目のPerlへのパスを解釈するようにANHTTPdを設定した?
846 :
840 :03/01/05 01:00 ID:0ij2w7ok
>>845 それはどこで設定するのでしょう?
とりあえずDocumentRootの設定と/~UserNameと /cgi-bin/の仮想パスとローカルパス
というところはチェックしてみました。その他はいじってません
>>846 ん?
CGIの設定のところにそれらしい項目がないか?
だんだんスレ違いな話題になってきたな。しかたないけど。
848 :
840 :03/01/05 01:04 ID:0ij2w7ok
>>847 すいません。やっとわかりました。
「#!の行を調べる」というチェック項目があってそこに
チェックをいれたら実行することができました。
ありがとうございます。スレ違いごめんなさい。
849 :
847 :03/01/05 01:05 ID:???
試しにインストールしてみた。 拡張子ごとの設定の編集のところで、「#!の行を調べる。」という項目があるでしょ。 そこにチェックを入れてみて。
850 :
849 :03/01/05 01:05 ID:???
あら・・・
851 :
840 :03/01/05 01:08 ID:0ij2w7ok
>>850 ああ!!申し訳ないです。
わざわざインストールまでしてもらって。
親切にありがとう。
852 :
nobodyさん :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); } と書いたのですが、名前が載りっぱなしになってしまいました。 試しに、 +< を +> に変更したら今度は必要な名前まで 一緒に削れてしまいました。 ご助言をお願いします。
その削除したい人の名前以外をメモリーに全て待避して、 ファイルの中身をtruncateしてから待避したものを書き出せばいいんじゃないの。
>>852 perlの大罪その1.
print OUT "$list";
↓
print OUT "$outlist";
use strict ;しる。
855 :
852 :03/01/05 03:31 ID:TaQfxWs2
>>853 名前以外を退避…。
そちらに頭が全くまわってなかったです。
アドバイス有難うございます!
>>854 なんという基本的な間違いを。ご指摘有難うございます。
早速修正します。
856 :
nobodyさん :03/01/05 09:18 ID:2NV2xWH6
サーバー上に作ったフォルダが削除できません。 (自分でおいたCGIのせい?) どうしたら削除できますか? サーバーはinfoseekです.
>>856 自分に対する書き込み権限を立てて消す。
858 :
nobodyさん :03/01/05 09:26 ID:2NV2xWH6
chmod 600 ./* rm -rf ./
>>856 FFFTPとかで消せないって言うか、ファイルが見えないんだろ?
任意のコマンド ってあるから
>>859 みたいに
chmod 644 ./ファイル名
861 :
nobodyさん :03/01/05 10:05 ID:2NV2xWH6
>>860 FFFTP ですが 任意のコマンドで chmod 使えません。
どのフォルダのパーミッションをかえればいいのでしょうか
infoseekでファイル消せないって質問は定期的に出てくるな。 あそこはnobodyで動いてるから、自分でコーディングもできない利用者は そりゃハマるだろうよ。 っつうか、そもそもPerlと何の関係が?
863 :
852 :03/01/05 14:32 ID:C4pjTkfz
一晩眠って、853様のアドバイス通り、一度リストを配列に逃がしてから 不要な名前を削って再度リストに並べ直す方法で巧く出来ました。 本当に助かりました。ありがとうございます。
>>855 いやいや漏れが言いたかったのはここまで有用な言語でありながら
変数定義と参照に関する処理系の警告機構が利用されていない
@listとして定義して$listとしてのアクセスは警告に値する。
(というか、この場合$listってどういう意味が有る?)
-wスイッチで起動すると解決するのか?
>>864 >-wスイッチで起動すると解決するのか?
ドキュメント読むか実際に試してからほざけ。
867 :
nobodyさん :03/01/05 23:18 ID:LhQ0NrhB
>>864 まだまだPerl初心者だね。
スカラー、リスト、ハッシュには、別々な名前空間(?)が存在するから、
$list @list %listは同時に使うことができる。
-wを付ければ、定義されていない変数がどーたらって警告が出るし、
use strictをつければ、コンパイル時にエラー(グローバル変数の利用)出て、
実行してくれない。から変数名を間違えたって気づくはず。
868 :
nobodyさん :03/01/05 23:31 ID:+d9WGquV
Perlのことを勉強しようと思って、本屋に売ってたCGIRescueという本を買ってきた。 その本の作者には何か奇妙な癖のようなものがあって、 スカラー、リスト、ハッシュの変数名に同じ名前を割り当てているケースが多くて、 1行ごとプログラムリストの解説が載っているにもかかわらず、 はじめはわけがわからなかった。 特にforeachのところでは必ずといっていいほど foreach $hoge(@hoge){}みたいになっていた。
一行毎に解説って $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の方がいい。
>872 まずは円グラフがどういうものかの勉強からやり直してきてください。
>>872 GD::Graph::pie使えば円グラフ簡単に作れるけど、GD::Graphが
使えるかどうかは管理者に聞いてくだちい。
875 :
869 :03/01/06 01:52 ID:???
>>871 その本のプログラムはPerl4で書かれていたからmyは使ってなかった。
localも何故かほとんど使ってなくて、
$hogeや@hogeみたいな変数は全てグローバル変数だった。
PerlでHTTP鯖みたいなことはできますでしょうか? アクセスがあるとHTTPの文書を返せればよいのですけれど
>>878 たとえば、どんなことですか?
具体的にお願いします。
882 :
864 :03/01/07 01:48 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);
}
----
>>883 試しとして同じDIR上にaaaa.htmlを作成
perl httpd.pl 8888 で起動。8888は任意のポート番号
ブラウザから
http://ホスト名/aaaa.html で表示を確認した。
しかし、これだけだとマルチスレッドとならない為完全な同時アクセスには対応していない。
(先のページには同時に5要求の待ち合わせが出来るように書いてある?)
以上
885 :
864 :03/01/07 01:57 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);
}
>>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);
}
}
どうでもいいけど中級者コーナーっていうの作れば? リファレンスとかバリバリ使ってる初心者は嫌だ。
>888 一度立った事があるけど、今は残ってない。 初心者と中級者の線引きを決めないと上手くいかないよ。 tu-ka,中級者は自分で調べる事(自力で解決する術)を知ってるから、 あまりこういうところで聞かないんだよな。
つーわけで、自称初心者のみなさん、ほかの質問が小難しくても どんどん質問してください。 当然、 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。
自分はフブラウザからアップロードしたファイル名を取得したくて↓の処理をしてみたんですが 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となってしまいます。 どなたか良い方法をご教授ください。
\(5C)を含む2バイト文字の話だから$fnameを処理する前に 文字コードをECU-JPにしてその後SJISに戻すとか… ちなみに処理は1行で $fname =~ m/([^\\]*)"$/; print $1;
>>892 ありがとうございます。
一行でMACからもUNIXからも取得できますでしょうか?
とりあえず一度やってみます。
894 :
えり :03/01/08 10:27 ID:RjcWJJ7/
activeperlをインストールしたのですが、なんか変になってしまって アンインストールしたいのですがどうすればいいですか? アプリケーションの追加と削除で削除したのですがperlのフォルダーが残っており 又、フォルダーの中身ものこったままです
>>894 アンインストールで残ったのはゴミ箱に入れてもOKです。
896 :
nobodyさん :03/01/08 13:03 ID:3CJ1U7Io
「辞書」を作りたいんですが、どうすればいいんでしょうか。 たとえば、 テキストファイルに「青」、「うんこ」とあったら perlで五十音順に並べ替えたりできるんですか?
>>896 「青」、あお、せい
少なくとも英語版Perlでは大変。
898 :
896 :03/01/08 14:05 ID:???
899 :
891 :03/01/08 14:31 ID:???
900 :
えり :03/01/08 15:39 ID:RjcWJJ7/
>895 ありがとうございました!!!
901 :
nobodyさん :03/01/08 20:51 ID:OEI4EUTr
>>898 kakasiを使えば、ある程度は、正しい読み仮名を付けれるよ。
902 :
nodody :03/01/08 22:13 ID:1Pe5J1+N
プログラミングを始めて1ヶ月の初心者なのですが、BBSを自作 してみたいと思っています(スキルアップのために)。 ソースの見やすさを考える以外に気をつけておいた方がいいことが あればご教授下さい。 Perlを使用します。 (特定の記述法は特に効率が悪いからやめろとか)
>>902 まぁ、一本書いてみなよ。それにツッコミ入れる方が効率よさそうだ。
>902 ローカルでテストする。 これ、最優先事項。
906 :
nodody :03/01/08 22:26 ID:1Pe5J1+N
>>903 マジで見てくださるのですか!?
じゃあ、マッハでつくります。
>>904 ありがとうございます。
気をつけてみます。
908 :
nobodyさん :03/01/08 22:30 ID:atnjxi5O
use strictってなに? 参考書に載ってなかった。おしえてくだちい。
use strictってなんですか?
マッハで作るって5分とかで作るつもりかよ。
cgiのmethodのgetで送れるバイト数って決まってるんですか?
>>911 確か256bytesまで。
それ以上のデータを送りたいならPOSTで。
913 :
nodody :03/01/08 23:15 ID:1Pe5J1+N
>>910 いや、少なくとも数日かかると思いますが…。
意気込みってやつですよ。
>>907 use strict と-w 調べて使ってみました。
out という名前でファイルを開いたあと、
print out "文章";
と書くとoutがクォートで囲まれていないという警告が出ます。
そこで
print "out" "文章";
とするとエラーがでて動作しません。
これは無視した方がいいのでしょうか?
914 :
913 :03/01/08 23:18 ID:1Pe5J1+N
エラーは Error 500 CGI エラー - Content-Type ヘッダが正しくありません。 というエラーです。
>>914 正直、様々な原因が考えられるエラーだ。
本気でデバッグしてもらいたいなら、
スクリプトをどっかに.txtにしてアップするくらいのことはしろ。
>>914 ブラウザのエラーを書かれても分からんよ。
Perlが出力するエラーを書いてくれ。
918 :
>>916 :03/01/09 00:39 ID:ve0CCzFG
>>918 open OUT, ">test.dat";
print OUT $text;
close (OUT);
open IN ,"<test.dat";
my @a = <IN>;
close (IN);
920 :
913 :03/01/09 01:01 ID:ve0CCzFG
大文字を使用すれば良かったのですね。 ありがとうございました。
>>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;
923 :
nobodyさん :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をどうやって取得しているんですか?
リファは無理っぽいです。
>>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__
925 :
923 :03/01/09 04:11 ID:???
>>924 なぞが解けました。
ありがとうございました。
>>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
とか言われますた。
ロックファイルがついていないスクリプトにロックファイルつけること できますか?教えてください。
ファイルをつけるなんて造作ないです。
930 :
初心者 :03/01/09 13:46 ID:???
教えてください。 cgiページの最上部にサイト共通のヘッダを表示したかったので <!--#include file="header.html"--> と記載しましたが、そのままコメント文として出力されました。 この場合はどんな方法を使用すればよいのでしょうか?
>930 Perlとは一切関係ないので該当スレへ行ってください。 SSIスレとかかな? Apacheの設定スレの方がいいかな? どのスレへ行けばいいかわからないからと言って、マルチポストはするんじゃないぞ。
>>930 open(IN, "<header.html");
my @header = <IN>;
close(IN);
<!--#include file="header.html"-->
の代りに
@header
とでもしておけYO
>>930 CGIでSSIは使えません。
同じことをするスクリプトを記述してください。(
>>932 みたいに)
>>933 漏れの自鯖ではCGI出力からでもSSI記述は使える。
レンタル鯖では見ないけどなー。
935 :
927 :03/01/09 15:10 ID:???
>>935 検索サイトで
「排他制御 Perl」
で検索汁。。
>>936 Perlで排他制御を行うにはシンボリックリンクをフラグとして使いましょう。
とかまじめに書いてるサイトもあるので要注意だな。
特にsymlink関数が要注意だとは思わんが マルチタスクでの排他処理は要注意。
>>939 良し悪しで言えば・・・悪し。
フォームでGET送信すれば自動的にエンコードしてくれるけど
直リンでの固有文字はその文字コードを使用していないと文字化けまくり。
しかも文字中に&や=などの区切り文字など混じった場合に対処出来なくなる罠。。
World Wideを意識しないでローカル派なのであればどうぞ。
>>939 もちろん必須です。理由はRFCで決まっているから。で良いと思われ。
特定のアルファベットと記号以外を全部%16進の形式にするだけなので割と簡単です。
formのinput要素とかはブラウザが変換する義務を負うので無視して良いです。
>>940 なぁ?
URLエンコードしてもそのエンコード前の文字コードに対応してなかったら結局化けると思うんだけれど。
あなた論理だと英語以外送っちゃいけないことに・・・。
SJIS -URLエンコード-> URLエンコードされたSJIS -URLデコード-> SJIS
掲示板とかで、記事を投稿されたときに、改行を多く入れられてしまった時のために、 「改行が2つ続いたら、それは改行1個に置き換える」をしたいんですが、 $value =~ s/\r\n\r\n|\r\r|\n\n/\n/g; これじゃダメっぽいです。なぜでしょうか。
>>944 $value =~ s/\n{2}/\n/g;
>>944 改行とおぼしきものを一旦違うものに置き換えてからってどうかしらん?
$value ~= s/\r\n|\r|\n/<br>/g;
$value ~= s/(<br>)+/$1/g;
とか。
他の凡例は
>>946
947 :
946 :03/01/09 18:01 ID:???
>>944 $value =~ tr/\n//s;
950 :
948 :03/01/09 18:29 ID:???
これだと複数の改行がすべて1つだけになるから、ちょっと質問の内容と違うか。
>>945 のほうがいい感じ。
s/\r//g; s/\n\n+/\n/g;
$valueのなかで$wordがあるかどうかを調べることが出来ますか?
1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
954 :
952 :03/01/09 19:13 ID:???
>>953 すいません。
ちょっと時間が無いので出直してきます。
>>952 正規表現で探せるよ
$value =~ m/$word/;
GIFファイルを アニメーションGIFか普通のGIFか判別する方法ないでしょうか?
>>956 0x21F9
が複数入っとったら・・・っつぅのはどないやろ?
配列@hogeの中に mona と言う言葉がいくつ入ってるか調べるためには どのようにすればいいんでしょうか?
>>961 $i = grep /mona/,@hoge; #$i = 個数
$i = grep {$_ eq "mona"},@hoge;
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; } } } } } } } } } } −−−−−ここまで−−−−−
>>964 for($i = 0;$i < 10000000000;$i++)
printf("%010d",$i);
967 :
964 :03/01/10 00:04 ID:???
ふぉ〜!すばらしいです。
>>965 さんありがとう御座います。(感謝!)
>>961 >>962 は、「monaを含む要素」の数
>>963 は、「monaそのものである要素」の数
この場合質問が複数の解釈を許すからこういうことが起こる。
質問をする方にも、質問をするスキルが求められていると言うことだな。
969 :
nobodyさん :03/01/10 02:37 ID:bsKAU3F+
perlスクリプト内で自分自身のファイルのディレクトリパスを知る にはどうしたらいいのですか? `pwd`で得ようとしましたが、そのスクリプトを起動したパスになってしまいます。 どうかお願いします。
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";
973 :
nobodyさん :03/01/10 08:41 ID:0QU3xkA6
フォームのパラメータ取得処理についてなんですけど、 今は普通に手書きの if($ENV{ 'REQUEST_METHOD' } eq "POST"){ read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); }else{ $QUERY_DATA = $ENV{'QUERY_STRING'}; } 省略、 をやっています。初めて覚えた時このやり方だったんで。 CGI.pmといのを使うやり方もあるみたいなんですが どっちでやった方がいいとかあるんでしょうか。 こっちの方が効率がいいとか、バグが無くなるとか。
>>971 プロトタイプを(**)にする。
そうすると裸のワードを受け付けるようになる。
…なんだけど、movf bittimc, w;としたときに
たとえばbittimcというサブルーチンが事前に宣言されていたり、
予約語だったりするとうまくいかないので注意してね。
他は、使用するシンボルを全て
use constant symbol => 'symbol';
として定数としておくという手もあるかな。
976 :
913 :03/01/10 16:49 ID:???
>>976 #▼グローバル変数は頭を大文字にして区別
my $value;
my $name;
my @query;
my $query;
our %Form;
our $Write;
うそつき・・・。
>>977 #▼JAVASCRIPT(クッキー読み出し・書き込み用)
そんなもん使わずとも$ENV{"HTTP_COOKIE"}に入ってるよ。
デコードはQUERY_STRINGのときとほぼ同じ。
>>974 直書き:関数呼び出しのオーバーヘッドとか汎用性を考慮しなくて良い分早いであろう。
CGI.pm:少なくともバグの発生を他人のせいにできる。
掲示板を作ったのですが、ログファイル(sjis保存)を読み込むとき、 "ス"など2バイト目が\x5c(\記号)の文字だとエスケープされてしまい、 結果的に文字化けしてしまいます。 文字コードはそのままsjisを使う前提で、何か良い対処方法はありませんでしょうか。
>>980 読み込むだけならエスケープはされないはず。
どういう処理をしてるのか、もうちょっと具体的に。
982 :
nobodyさん :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は神だった。。。
984 :
980 :03/01/10 22:12 ID:???
>>981 すみません、勘違いだったようです。。
どうもお手数おかけしました。
そろそろ次スレですか・・・
985 :
976 :03/01/10 22:37 ID:???
レスを下さったお三方、ありがとうございます。 今度は少し時間をかけて直してきたいと思います。 ご指摘、ありがとうございました。
986 :
Perl 3日目房 :03/01/11 03:14 ID:7w0GJrTJ
とほほのWWW入門にPerl入門しますた。 が、mkdir(filename, mode) でデレクトリを作成できると書いてあるんですが ファイルの作成については何も書いて無いのです。 試しに toucth(filename, mode)と書いてみましたがエラー。 で、結局新規にファイルを生成するにはどう書けば良いんですか?
ファイルが存在しない場合は新しく作成されます。
989 :
nobody :03/01/11 08:27 ID:WMCRUM05
質問です。 大量の数値を1つのファイルから読み込み、3〜4カ所の関数で使用する場合、 &work($a,$b,$c) のようにメイン関数からいちいち引数を渡してやるのと $main::a などと大域変数にしてしまうのとはどちらが良いのでしょうか? なお、読み込んだデータのほとんどは1つの関数でしか使用されません。
991 :
nobodyさん :03/01/11 11:31 ID:hHeUjYJr
アホ質問です。 例えば $"/dir1/dir2/dir3/file" てあるときに"file"を取り除いて"/dir1/dir2/dir3"を得るには どうしたら出来ますか? ちなみにこの時点で"file"は何かは分かっていません。
992 :
nobodyさん :03/01/11 11:38 ID:bB6C4Xxs
m!(.*)/[^/]*!; print $1;
993 :
nobodyさん :03/01/11 13:24 ID:1b8L5mKx
【perl】 ランダムから求められる数値が片寄ってるような気がしてなりません。 ランダムを取得する時、必ず直前に以下のような記述を置いているのですが、 正確な意味も分かりません。 (昔、どこかで見たのを写したのだと思います) srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`); 質問1 上記はどんな初期値(?)を作成してるのでしょうか? 質問2 とても効率が良く、数値が片寄る事を感じさせない記述を教えて下さい。 皆様はランダム前にどんな記述をおくのでしょうか? イロイロ教えて下さい。 また頭が弱いため、見ても理解出来ないと思うので、どのように求めているのかも簡潔に教えてくれると嬉しいです。
994 :
991 :03/01/11 13:29 ID:hHeUjYJr
>>992 ありがとうございます。これでできました。
できましたらこれの解説をお願いできませんでしょうか?
どなたでも結構ですので、よろしくお願いします。
995 :
nobodyさん :03/01/11 13:34 ID:YuKx7bV3
>>993 らくだ本に書いてあるやつですね。
よくわからんけど、本には
「常に変化しているオペレーティングシステムの状態情報の出力を圧縮してチェックサムをとるというのが、よく行われる。
例えば次のようにする」
と書いてあります。
>>993 真の乱数が存在しない罠。
loto6とかの抽選数字を使うとか(w
>993 何万の例をとって、どれくらいの率で乱数が偏ってるの? 体感でってのはなしな。 「毎月1日は雨が降りやすい」とかそういう気分の問題であることが多いから。 なお、試す時は必ずローカルで。
で、次スレゎ?
get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。