1 :
nobodyさん :
03/05/16 11:18 ID:zDRBc/j4
_n ( l _、_ \ \ ( <_,` ) ヽ___ ̄ ̄ ) おちゅかれ。7GET / /
ここは一応WebProg板な訳だけれど、 そういう限定は一切無し? それともperlというと暗にcgiのことで、 web用に使う人しかおらん、という前提だろうか。
>>9 は?
どっから引っ張ってきた話?
普通にperlです。
ということは、やはりcgiを主眼に置いてるのかな。 cgi書いたことねえ。
tu-ka,「CGIに依存しないPerlの話題一般」ってスレが
>>1 にあったじゃないか。
見落としていた>11こと俺萎え。
んー、cgi以外のスレはどこ? と聞いてる訳ではなくて。 ム板の方では、cgiはWebProgに逝け、と誘導されてる訳で、 その割に、こっちの方では特にcgi向けのスレであることを謳ってない。 というか、むしろperl全般に見えるしcgiに特化した話を排斥する 傾向さえ見られる。 スレのスタンスがよくわかんない、という話。
>14
基本的にはCGIでのPerl話題。
WebProg板だからな。
CGIに特化した話を排斥しているように見えるのは、その話題がほぼ必ず
「コーディングの話題じゃない」からだ。
つまり、「CGIとしてPerlを使う時のコーディングの話題」のスレってことだ。
確かにスレタイや
>>1 を見ただけではわかりにくいかもな。
新参者ばっかだな。 ム板のPerlスレは、いつもるびきちやらにwebprog行けって 言われて、前の(前の)スレは、あいつに荒らされでぽしゃった。 だから、CGIじゃないPerlの話題もこっちが主流だった。 こっちじゃ、CGIのスレがあるから、Perl初心者コーナーは、 CGI以外のPerlについて話す場所にしようとみんなでしてた。 前の前のスレの>>1を見れば分かる。 でも、るびきちの荒らしがなくなったので、まあ、CGIでも CGI以外でもPerlのコーディングに関するものなら、いいんじゃ ないか。高度なのは、ム板、比較的簡単なのは、こっちで どうかな。
17 :
nobodyさん :03/05/16 17:40 ID:Jkp+t2ia
%mode2name = ( 'sql_arrange' => "顧客絞込み条件の入力", 'select' => "該当顧客の閲覧", 'writemail' => "メールの記入" ); foreach $value (keys %mode2name){ $HtmlTmp .= qq|$mode2name → |; } print $HtmlTmp; とやると、 「該当顧客の閲覧 → メールの記入 → 顧客絞込み条件の入力 → 」 と表示されます。 これを、%mode2name = で設定した順番、つまり、 「顧客絞込み条件の入力 → 該当顧客の閲覧 → メールの記入」 と表示させるには、 foreachの部分はどう書けばいいのでしょうか?
>>17 ハッシュは代入された順番を保持できないよ。(どういう順番で記録されるかは不定)
順番を保持させたいならリストを使うべし。
>>17 foreach $value ('sql_arrange','select','writemail'){
$HtmlTmp .= qq|$mode2name{$value} → |;
}
>>17 ハッシュに入っているキーの量が少ない(メールフォーム程度)なら、
キーに01,02等の通し番号を(キーの頭に)付けておいて、
foreach $key (sort keys %hash)
する手がある。表示もcgiでやるならsprintfして出力するだけだから簡単。
場当たり的なのが欠点。
perl cookbookにはTie::IxHashモジュールを使えとある。
こっちの方がたぶん正道のような気もするが、使ったことないので要調査ということで。
21 :
17 :03/05/16 19:01 ID:???
>>19 頭いい!?と思ったが、
ちょっとそれは気持ち悪い。。。
>>20 とりあえず、
>キーに01,02等の通し番号を(キーの頭に)付けておいて
でやってみます
%mode2name = ( 'sql_arrange' => ["01","顧客絞込み条件の入力"], 'select' => ["02","該当顧客の閲覧"], 'writemail' => ["03","メールの記入"] ); で、1項目目でソートしたキーを入れるに入れて foreach ( @hoge ) { $ref = $mode2name{$_}; $.... .= "$ref->[1]"; } 見たいな感じでいけないかな。実際に動かしてないからちびっと不安
入れるに入れて→配列に入れて
24 :
nobodyさん :03/05/17 00:51 ID:VynWxd2G
複数のファイルのデータをソートするにはどうすれば? データの構成は一緒なんですが。 @date = @date[sort {$tmp1[$b] <=> $tmp1[$a] || $tmp2[$b] <=> $tmp2[$a] || $tmp3[$b] <=> $tmp3[$a] || $tmp4[$b] <=> $tmp4[$a]} 0 .. $#tmp1]; @date2 = @date2[sort {$tmp1[$b] <=> $tmp1[$a] || $tmp2[$b] <=> $tmp2[$a] || $tmp3[$b] <=> $tmp3[$a] || $tmp4[$b] <=> $tmp4[$a]} 0 .. $#tmp1]; これでは別々になってしまうし・・・
>>24 両方のファイルを結合してソートすればいいんじゃないの?
26 :
nobodyさん :03/05/17 07:15 ID:wMi5ghdi
perlって ほにゃらら if ほげほげ ってかきかたはできるみたいですが、 これにelseの意味も加えた1行の書き方ってないですか?
優れたソース見て勉強したいんですが、 初心者が見て勉強になるソースってどれでしょうか?
29 :
nobodyさん :03/05/17 08:08 ID:+QQFZ4NN
30 :
nobodyさん :03/05/17 10:38 ID:0rspM7nm
31 :
nobodyさん :03/05/17 10:55 ID:bv1ocBAi
2つのファイルを比較して違う行を出したいんだけど、 こんなののほかに何かいいのありますかね。 open(FILE1, "test1.txt") or die "$!\n"; @file1 = <FILE1>; close FILE1; open(FILE2, "test2.txt") or die "$!\n"; while(<FILE2>) { print $_ unless grep($_, @file1); } close FILE2; よろしうお願い島。
ファイルを一つだけ開く、というのが気持ち悪い 開くなら開く。読み込むなら読み込む。
open(DIFF, "diff test1.txt test2.txt|")
>>33 つうことは、(1)開くなら開く:
open(FILE1, "test1.txt") or die "$!\n";
@file1 = <FILE1>;
close FILE1;
open(FILE2, "test2.txt") or die "$!\n";
@file2 = <FILE2>;
close FILE2;
for(@file1) {
print $_ unless grep($_, @file2);
}
とか、(2)読み込むなら読み込む:
open(FILE1, "test1.txt") or die "$!\n";
open(FILE2, "test2.txt") or die "$!\n";
while(<FILE1>) {
$this = $_;
while(<FILE2>) {
print unless $_ eq $this;
}
}
close FILE1, FILE2;
とか?(2)は、ちょっとばかばかしいしぃ。
>>34 ありがとん。でもdiffは、使わないでってことで。
>>32 ,35
grep(/^$_$/, ..)にしなきゃだめですた。
すみません。クソみたいな質問します。 自分でもクソ質問って分かってるけど、なぜか思うように動かないのです。 $pattern[0] = "あああ.30"; ($test_1, $test_2) = split("\.", $pattern[0]); print "$test_1\n"; なぜか代入されない。不思議。
>>38 ($test_1, $test_2) = split("\.", $pattern[0]);
↓
($test_1, $test_2) = split (/\./, $pattern[0]);
不思議。
40 :
38 :03/05/17 16:14 ID:???
それだと、、って。 そういうもんだろ。 不思議。
42 :
38 :03/05/17 16:21 ID:???
@age = split("\," , $data{'age'}); ($decode_name, $decode_value) = split("=",$decode_pair); 上の二つは正常に作動してるから、 ($test_1, $test_2) = split("\.", $pattern[0]); これも正常に作動すると思ったんだけど…。 しなっかったのよ。 不思議。
split って /re/ じゃなくても動くよな。
省略記述で / / を省ける時や、別の文字を書ける時があったような気がする。 条件は忘れた。
代入演算子について質問です。 ||=や<<=などの代入演算子について知りたいのでつが、"代入演算子"でぐぐっても=や.=、+=くらいの一般的(といっていいのか疑問でつが)な代入演算子を解説しているサイトしかヒットしません。 代入演算子について詳しく解説してあるサイトをご存知な方はURLを貼り付けてください。 おながいしまつ。
>>42 区切りに使う文字によって "" ’’ // に違いが出るの
//が無難かもね
>>46 難しく考えなくていいんでないの?
$a ||= &b;
は
$a = $a || $b;
ってだけでしょ。
仮に、$a=0,$b=1 だったら、
右辺の結果、真になるので、$a=1となるだけ。
$a ||= &b; ↓ $a ||= $b;
51 :
38 :03/05/17 16:56 ID:???
なるほど。 perlは妙な落とし穴が多いですね…。 実はperl独特の落とし穴(?)に何回もはまってます。 ありがとうございました。
52 :
46 :03/05/17 17:43 ID:???
ありがとうございますた。 助かりますた。
>>42 splitの1つ目の引数に渡せるものは、「正規表現」か「文字列」。
文字列が渡されれば、それを正規表現と解釈する。だから、これらはすべて同じ動作。
split /\./
split m/\./
split qr/\./
split "\\."
split '\\.'
split qq/\\./
split q/\\./
>>53 文字列時は \\. になるのは盲点だなー。
勉強になたよ。
55 :
38 :03/05/17 18:06 ID:???
なぜ\\になるのかが…分からん。 q[\\.]って超不思議なんだけど。 ですが、俺に中では「気にしない」と言う方向で落ちつきました。 ありがとです。
データのエンコードですが。。。 よく引数でtext=%82%A0%82%A2%82%A4%82%A6%82%A8っていう%に続く2桁の16進数でデータが渡りますよね。 デコードするには $value =~ s/ %( [a-fA-F0-9][a-fA-F0-9] ) / pack ( "C" , hex ($1) ) / eg ; ですよね。 あえて日本語を%に続く2桁の16進数にエンコードするにはどうするにはどうすればいいのですか? データを送って自動でエンコードされたのを取り出すのはなしってことでお願いします。
>>56 $encode = join('',map{ s/(\W)/'%' . unpack('H2', $1)/eg; } split(//,$data));
コレでどうやろ?
PHPにはurlencode urldecodeっていう関数あるから Perlでそれを作ってもいいかもね あいうえお %82%A0%82%A2%82%A4%82%A6%82%A8 あいうえお --- $a = 'あいうえお'; print("$a\n"); $a = urlencode($a); print("$a\n"); $a = urldecode($a); print("$a\n"); sub urlencode{ my $str = $_[0]; $str =~ s/([^\.\*\-_a-zA-Z0-9 ])/sprintf("%%%02lX",unpack("C",$1))/eg; $str =~ tr/ /+/; return $str; } sub urldecode{ my $str = $_[0]; $str =~ tr/+/ /; $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; return $str; }
59 :
56 :03/05/17 19:38 ID:???
>>57 さん。
ダメです。
”あいうえお”が”1111111111”になってしまいます。
>>58 さん。
これでうまくいきました。
ありがとうございました。
前スレで、perlで描画しようとしたら、1001に達していて、 書き込めませんでした。皆さん、以下のスクリプト実行してみて。 @perl=qw(PERL Perl perl PERL Perl perl); for(0 .. $#perl) { @tmp=@perl; print join('、', splice(@tmp, $_)), "\n"; } @mansei=split(//, 'perl'); for(1 .. $#mansei) { @tmp=@mansei; print splice(@tmp, $_), "\n"; } for($i=$#mansei; $i>0; $i--) { @tmp=@mansei; print splice(@tmp, $i), "\n"; } for ($i=$#perl; $i>=0; $i--) { @tmp=@perl; print join('、', reverse(splice(@tmp, $i))), "\n"; } もっとうまく書けるかな?
あれは、書いてるうちに埋まってしまう、というのが 面白かったのに。
正直、スマンカッタ!! \\ 正直、スマンカッタ!! // + + \\ 正直、スマンカッタ!!/+ . ___ . ___ . ___ + /. ――┤ /. ――┤ . /. ――┤+ ./(. = ,= | ./(. = ,= | ./(. = ,= | + . |||\┏┓∩|||\ ┏┓∩|||\┏┓/ + (( (つ ノ (つ 丿 (つ つ )) ヽ ( ノ ( ヽ ノ ) ) ) (_)し し(_) (__)__)
@t=@p=qw(PERL Perl perl PERL Perl perl); sub p{print join(', ',@_),"\n"} p(shift@t,@t)while@t; print substr($p[-1], -abs),"\n"for 3,2,1,2,3; p(@t=(@t,$t))while$t=pop@p;
64 :
nobodyさん :03/05/17 22:04 ID:0j4/huIM
「_」以外に、エンコードされない文字列というものはありますか? 漠然とした質問ですみません。
65 :
58 :03/05/17 22:07 ID:???
>>64 .*-_a-zA-Z0-9
以外はエンコードされる
67 :
nobodyさん :03/05/17 22:17 ID:ma11SCqX
68 :
nobodyさん :03/05/17 22:37 ID:UhIqbGm5
6桁ぐらいのユニークな番号を作成する方法ってありますか?
>>68 これじゃあ?
print sprintf("%06d\n", rand(999999));
ユニークである保証が無い
>68 $ユニークな番号 = int(rand(900000))+100000;
72 :
71 :03/05/17 22:46 ID:???
68 == 70 と仮定してみる ナニをもってユニークとするのか聞きたいところだ
超笑ったんですけど。よかった。
74 :
nobodyさん :03/05/17 23:04 ID:0j4/huIM
>>65 ああ、すみません、_も入ってましたね。
しかし、
.*-
は
%2e%2a%2d
とエンコードされますよね?
76 :
bloom :03/05/17 23:08 ID:w1ZjXwV8
68 != 70 なんだけどね そら、発生は一回じゃなくて、最高999999回発生させるんでしょ。 そのそれぞれが、過去に発生させた数字と重複していないことが 保証されている生成方法 って、全検するしかない気もするな
>>77 完全にユニークは無理
かなりの確率でユニークであると仮定するぐらいがいいとこ
ハッシュ使ってkeysがundefならば重複してないわけだが?
$num++
tu-ka,何の目的で使うかによってやり方も変わりそうなもんだが。
82 :
nobodyさん :03/05/18 00:06 ID:aBq13e5f
質問。 まず、環境はウィンドウズ98です。 ファイルの読み書き追記モード(open(OUT, "+<file.txt");)で, 読み込みと書き込みを同時に行おうと思ってますが、 truncateが使用不可能なため、 seek(OUT,0,0); truncate(OUT,0); print OUT $a; の手法が使えません。 truncateの変わりになる方法を教えてください。 かなり調べたんですが、わかりませんでした。
書き込みモードで開く。
84 :
nobodyさん :03/05/18 00:10 ID:aBq13e5f
> 読み込みと書き込みを同時に行おうと 思ってます。 終点のtell(OUT)以下を削除する方法です。
ヒマなんで作ってみた @seed = (0 .. 99); my %seed; sub init{#初期化 for(0 .. $#seed){ $seed{$_} = $_; } } sub select{#取り出し my $num = $seed{int(rand(scalar(keys(%seed))))}; delete $seed{$num}; return($num); } &init; $uniq_num = &select; #コレを繰り返しとな・・・
86 :
85 :03/05/18 00:12 ID:???
>>85 訂正
my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $seed[$_];
}
}
gensym
>>82 >seek(OUT,0,0);
これじゃ追記じゃなく上書きじゃないか
>>88 読み込んだ内容を編集して上書きしたいと思ってます。
>>82 open(OUT, "+>>file.txt");
>>90 >>91 色々助言いただいてありがとうございます。
いじくってみます。
>>92 っていうか、Win98で鯖を立てることが間違っているのでは
質問させてもらいます。 自作関数で、引数が不正の場合に、 Perlの文法チェックでエラーを出力させたいのですが、 方法がわかりません・・・ どうすれば文法チェック時に引数のチェックができ、エラーを出せますか?
>>77 @dat0 = @dat1 = ();
foreach(0 .. 999999){ $dat0[$_] = $_; }
foreach(0 .. 999999){ $dat1[$_] = splice(@dat0,rand($#dat0),1); }
ではだめ?
>>94 ほっといてもSyntaxErrorになるだろ
不正かどうかのエラー処理はプログラマの責任でやるもの
98 :
85 :03/05/18 01:05 ID:???
ハッシュだと駄目だな・・・ @seed = (0 .. 10); sub select{#取り出し my $key = int(rand(scalar(@seed))); my $num = $seed[$key]; splice(@seed,$key,1); return($num); } $data = &select;
>>95 なぜ、そんな巨大な配列を作るんだ?
コストがかかってしかたないと思うが・・・
普通にfor文でぶん回せば良いと思うのだが・・・
100げと
101 :
nobodyさん :03/05/18 01:43 ID:wPiZL/S/
srand(); my @salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" ); my $salt = $salts[int(rand(64))] . $salts[int(rand(64))]; $crypt = crypt($str, $salt); こういうルーチンだと、暗号化文字列内に「_」は絶対含まれ ないですよね?
103 :
nobodyさん :03/05/18 01:55 ID:Qi8mxUK4
1kbのファイル10個を1つずつopenしてprintしてcloseするのと、 10kbのファイルをopenしてprintしてcloseするのは どっちが処理に時間がかかるのでしょうか?
だんぜん前者
>>102 どんなルーチンかは関係なくcryptの戻り値に「_」が含まれることはない
そもそも、そのルーチンってsaltをランダムにしてるだけじゃないの
106 :
83 :03/05/18 05:27 ID:???
>>84 改めて開くんだよ。それくらい理解しろよ。
>>105 ボケボケでした。ご指摘有難うございます。
貴重なご返答有難うございました。
109 :
nobodyさん :03/05/18 07:34 ID:K+Hh/k3W
ム板から追い出されてしまいました・・。 すみません、質問です。 csvファイルの一番上から順に1レコード読み込んで、$idと$keycodeが等しければ それぞれ変数に代入する、という検索の部分なのですが、$idが奇数、又は偶数だ と(csvファイルのレコード数が奇数か偶数かによる)検索失敗しまいます。 尚、$data = <IN>;の部分は、手元の本だと$data = $_;になっています。これだと 全く代入されません。 csvファイルに問題は無いと思います。お願いします。 $match = 0; open IN,"log.csv"; while((<IN>)and($match == 0)){ $data = <IN>; chop $data; ($keycode) = split(/\,/,$data); if($keycode == $id){ ($keycode,$flg,$mailadd,$name,$title,$comment) = split(/\,/,$data); $match = 1; } } close IN;
尼寺へ行け
っていうか、while(<IN>) の中でなんでまた<IN>を読んでるの?
>>109 これでどうだ? $id($keycode)は1バイトであるという前提。
ちなみに見つからない場合は$keycodeが未定義になる。
undef $keycode;
open(IN, "log.csv") or die;
while (<IN>) { chomp; /^$id/ and last }
($keycode, $flg, $mailadd, $name, $title, $comment) = split /,/ if $_;
close(IN);
>>113 whileのなかでchompする意味なし
文字列を暗号化してファイルに記録したいんだけど、 どんな方法がありますか?
暗号になってればいいだけならmd5とか
>>109 俺も本のタイトルが知りたい。どんな糞かと。
CGIの本はいっぱい出てるからね
121 :
113 :03/05/18 15:56 ID:???
>>114 その通りなんだが、splitを無理矢理1行で書きたかったんでああなった。
実行効率を考えたら、ループの外でやったほうがいいね。
添削サンクス
文字列の中から特定の文字がいくつあるか判定したいのですが、 $count += ($com =~s/test//g); このような方法しか思いつきません。 もっとスマートなやり方を教えて頂けないでしょうか?
>>122 それ以上スマートな方法があるのかと。
と言うか、君の言うスマートってどんな意味?
>>122 1文字だけのカウントなら tr/文字/文字/ というのがあるけど、
文字列だとそれが一番シンプルにできるんじゃない?
125 :
nobodyさん :03/05/18 18:07 ID:rnV9NZSQ
perlの正規表現についてくわしく説明されているサイトってありませんか?
127 :
nobodyさん :03/05/18 18:21 ID:OtatQ8zk
>>125 当然Google等で調べたんでしょう。
その結果どのページを見ても理解できなかった、と。
諦めなさい。君には無理だ。
>>123-124 置き換えを使わずにできるかと思ってました。
$count += ($com =~/test/g); とか・・・
レスして下さってありがとうございます。
@lines[0..1000] = `"/usr/local/bin/wget" -q -O - $URL` or die; こんな事してるんですがどうやら$URLが長いと途中でちょん切れるようです。 "11223344556677889900" → "11223344556677889" 解決できますか?
>>130 できるよ
$count++ while $com =~/test/g;
133 :
109 :03/05/18 22:15 ID:???
レスありがとうございます。 >111 $data = <IN>; の部分のことでしょうか? 本では$data = $_;となっていますが、これだと全く代入されません。 自分で書き直しました。 マッチしてるかどうか調べる処理の前に余計に読み込んでいるから 交互に検索失敗・成功してしまうのでしょうか? >113 ありがとうございます。試してみます。 尚、$keycode、$IDともに2桁以上の場合があります。
思った事。
>>1-10 のところに、かなり良いサイト書いてある事に今さら気付いた。
十分立派なリンク集。
でも質問するやつは絶対に見ないから大して役に立たないリンク集
I will use Google before asking dumb questions.
137 :
131 :03/05/18 23:08 ID:???
@lines[0..1000] = `/usr/local/bin/wget -q -O - $URL` or die; の間違いでした、すみません。 $URLの文字数が59ぐらいまでは大丈夫なんですが、68になるとダメです。
138 :
134 :03/05/18 23:11 ID:???
>>135 日本語サイトを順番に見ていってるけど、グット!
大変有益な情報が書いてある。読んでて面白かった。
(知ってるサイトが多かったけど)
139 :
nobodyさん :03/05/19 01:05 ID:UimoOLmz
open(FILE, "+< $logfile"); @data = <FILE>; unshift(@data,"$year年$mon月$day日(@youbi[$wdy]),$hour時$min分$sec秒\n","$referer\n","$host\n","$ENV{'REMOTE_ADDR'}\n","$ENV{'HTTP_USER_AGENT'}\n\n"); flock(FILE,2); seek(FILE,0,0); print(FILE "@data\n"); flock(FILE,8); close(FILE); こういうアクセスログをつかってるんですけど、 datファイルは最初の行以外に半角スペースができるのですが、なぜでしょう?
140 :
動画直リン :03/05/19 01:08 ID:IEVyzYan
>>139 print(FILE "@data\n");
>>139 >print(FILE "@data\n");
""の中でリストを展開すると、リストの各要素が" "(半角スペース)で区切られて
出力されるから。
print(FILE, @data); のようにすれば大丈夫なはず。
143 :
_ :03/05/19 01:12 ID:???
144 :
nobodyさん :03/05/19 01:13 ID:UimoOLmz
145 :
142 :03/05/19 01:13 ID:???
間違えた。FILE の直後の , は不要だった。スマソ
146 :
nobodyさん :03/05/19 01:14 ID:UimoOLmz
147 :
nobodyさん :03/05/19 10:32 ID:/e0GDQuH
#------------------------------------------------------------ &HtmlError($errormessage); #$errormessage自体はEUC sub HtmlError($HtmlErrormessage){ my $HtmlErrormessage = $_[0]; &jcode::convert(*HtmlErrormessage, "sjis"); print $HtmlErrormessage; exit; } #------------------------------------------------------------ が、なぜかEUCでブラウザに出力されてしまいます。 ずーっと見て悩んでたのですが、わかりません。 どこがいけないのでしょうか? なお、下記はちゃんとSJISで出力されます。(あたりまえですが) まさか、関数に文字を引き渡すことと、文字コードって関係あるんでしょうか? (だとしても、ちゃんとprintする直前にsjisに変換してるし・・・) &jcode::convert(*errormessage, "sjis"); print $errormessage;
>>147 >&jcode::convert(*HtmlErrormessage, "sjis");
レキシカル変数では型グロブは使えない
&jcode::convert(\$HtmlErrormessage, "sjis");
149 :
147 :03/05/19 11:08 ID:???
>>148 あいや、まったく未知でした。ありがとうございます。
>>149 つか、なんでjcodeを古いやり方で使ってる奴ばっかなの?
しかもなんか中途半端に::で区切ってるし。
( ´・∀・`)へー
>>150 配布されてるCGIがそう書いてるのを真似してるのかもね。
で、ライブラリの書式が変わったのは理解できても、型グロブのほうは理解できないので
そのまんま。とりあえず動くからいいや、みたいな。
>>150 ( ・∀・)つへぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜
154 :
147 :03/05/19 12:26 ID:???
if (条件式) に使う条件式で、 同じ条件式を何回もいろんなところで使っているのですが、 こういう条件式自体を変数みたいに?1箇所にまとめることって可能なのでしょうか?
どうしたらいいか聞けよ。 $hoge = "doredore"; if (&matomere) {print "Ok!\n";} sub matomere { return '$hoge =~ /ahodoredorebaka/' }
これだけヒント与えたのに自分で解決できないのか。ほれ。 $hoge = "doredore"; if (&matomere) {print "Ok!\n";} sub matomere {if ($hoge =~ /ahodoredorebaka/) {return 1;} else {return 0; }} #if ($hoge =~ /ahodoredorebaka/) {print "OK!\n";}
#mailaddr.pm $mailaddr=~s/(.+)</$1/;
うまく行かない場合はうまく行かないと言え。 $mailaddr=~s/.+<(.+?>/$1/;
($address) = $str =~ /<(.+)>/; なるべくロングに取得
>>132 そのような方法があるとは思いつきませんでした・・・
ありがとうございます!
>>157 の方法だと、
our $hoge = "doredore";
if (eval matomere()) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
(気持ち悪い)
>>158 は冗長。
sub matomere {$hoge =~ /ahodoredorebaka/}
これでいい。
でも、こういう関数は一部でしか使わないだろうから、ローカル関数化する。
local *matomare = sub { $hoge =~ /ahodoredorebaka/ }
こうしましょう。
おっと。セミコロンが必要。 local *matomare = sub { $hoge =~ /ahodoredorebaka/ };
同じ条件式っていうことはその結果は決まってるはずだな。 多分、、質問はそういう意味ではなくて、、むむむ、クロージャーか。 my $expr = sub { my $hoge = shift; return $hoge =~ /hogehoge/; } print 'TRUE' if $expr->('hogehogehoge'); こうしたいのか?
167 :
159 :03/05/19 15:37 ID:???
>>160 ありがとうございます。でも機能しません。("<"が一つ取れるだけ)
>>161 ありがとうございます。でもシンタックスエラーです。
>>162 ありがとうございます。動きました。
>>75 超遅レスで申し訳ないが。。
その文字がエンコードされて送信されてくるかどうかは
実はクライアント(ブラウザ)に依存する罠・・・
昔携帯向けのサイトを作ったときハマッタ。
i-modeではエンコードされないのにJ-skyではエンコードされて来て
気が付くのに2晩かかったよ。
全てのクエリーストリングをデコードくぐらせるのが吉。。。
169 :
131 :03/05/19 16:36 ID:???
170 :
Perl/CGI :03/05/19 18:04 ID:Ob4BWAW/
CGIで、ファイルに書き込みしたいのに、どうしてもこのopen行が原因でエラーになります。 本とかで調べてもあってるはずなのになんでおかしいのでしょうか。 open(INIFILE,"+<$fileini"); close(INIFILE); ローカルでこの行が入ってるファイルをテストしてみたら、 Unterminated <> operator というエラーがでてとまってしまうんです。 この行を含まなかったらぜんぜん問題なしなんですけど、この行で全部とまってしまってるんです。 このエラーはいったいどう対処したらいいのか、そしてどう改善すればいいのか教えていただけないでしょうか?
>>169 おまえな、それが一体どこがPerlの質問なんだよ。
いい加減気付けよ。
>>170 それはファイルを読み書き両方ができるようにオープンしているようだが、
ファイルハンドルから察するに読み込むだけでいいんではないか?
なら、
open ( IN, $file );
open ( IN, "<$file" );
のどちらかで済む話じゃないか?
まあ、フリーのスクリプトか自作かは知らんが、前後の状況がわからんからこれ以上はいえないが。
173 :
131 :03/05/19 20:24 ID:???
>172 INFILEじゃなくてINIFILEだから書き換えたりもするんじゃない?
質問させていただきます。 $IPAD = $ENV{'REMOTE_ADDR'} などとして得たアドレスを2進数に変換したいのです、ご指導お願いします。 例えばアクセスした人のアドレスが 202.213.37.74だった場合、 11001010110101010010010101001010 という風に変換させたいのですが、perlでスッキリかくには どのようにすればいいのでしょうか? お手すきな方、宜しくご指導お願いします。
>>176 $num="202";
$bits = unpack "B8", chr($num); # $bits=11001010
>>176 $bits = join('', map { unpack('B*', chr) } split(/\./, $IPAD) );
180 :
176 :03/05/19 22:53 ID:???
>>177-179 ご指導ありがとうございます。
>>178 のページを参考に自分でやって成功したのですが、
>>179 さんの方がスッキリしてるので、こちらを使わせていただきます。
助かりました、ありがとうございます。
現在perlでRPG作ってます。CGIで相手端末は携帯です。 データは全てサーバーに保存させています。 で、ちょっと効率の良い処理が思いつかないので質問に来ました。 まず、 ●武器などのデータはテキストでデータ保存した方が良いでしょうか? ●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか? また、武器によって攻撃力が変わるわけですが、 ●起動ごとに攻撃力を算出させた方が良いでしょうか? ●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか? 俺としては前者のほうが、バグが出にくく、管理もしやすいのですが負荷が多くかかりそうな気がします。 俺は、プログラム経験が浅いのでこの辺の判断がつきません。汗 経験の長い皆様にアドバイスを頂きたくてやってきました。 よろしくお願いします。
う〜ん、やっぱこんな一部的なコト書いても誰も答えられないよね。汗 自分で思考錯誤して頑張ります。
>>181-182 つーか、思いっきりスレ違い。
ここはPerlスレだ。CGIの質問は他でやれ。
use strict; 使うと変数の局所化が出来るようなのでつが 局所化するとパフォ-マンス的にはどうなんでそ? あと、一般的に配付されてるスクリプトで use strict; 使ってる物を見た事が無いのですが普通は使わない物なんでつか?
>>183 このスレでいいだろ?アルゴリズムの問題なんだから。
CGIだからどーだって事にはならない。GUIだろうとほとんど同じ。
>>184 取り敢えず、厳格な書きかたが出来る。
局所化は、strictとは直接関係ない。
myだと、呼び出されるまで展開されないから軽い。
myはどのパッケージの名前空間にも属さない。
>>181 処理の規模にもよるが、データはテキストのほうが望ましい。
装備している武器などはそのまま保存すると共に、
攻撃力などは武器が変更された時にいっしょに変えてしまえば?
少々めんどうか?この方法は。
まぁ、どんな処理なのか分からんからなんとも言えん。
>>184 > 使うと変数の局所化が出来るようなのでつが
できません。
> 使ってる物を見た事が無いのですが
strictモジュールはコードの検査を行うものなので、リリース時にはコメントアウトするか消す人が多いだろうね。
無 駄 だ か ら
>>183 個人が持つ物じゃなくて全体に存在してるアイテムって言うのか、そうゆうのは記述内で定義するのが正解だよ。
もし、一つ一つ個性のある、複雑な効果のあるアイテムとかなら絶対に記述内で定義する必要がある。
たんに「値段」と「攻撃力」みたいな感じのデータのみだったら、テキストでデータを書き出しても良いかもしれない。
>181 ネトゲ板のCGIブラウザゲースレの奴か? >●武器などのデータはテキストでデータ保存した方が良いでしょうか? >●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか? 数による。 10や20なら中に記述した方がいいだろうが、1000や2000ならテキストデータにした方がいい。 数が多い場合は、テキストを分割する事で検索速度を速めよう。 例えば武器なら、1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、 と検索させる方が鯖に優しいのはわかるな? >●起動ごとに攻撃力を算出させた方が良いでしょうか? >●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか? 計算の度合いによる。 足し算の1回2回なら計算させた方がいい。 逆に剰余算や平方根を多用するようなら、保存させた方がいいかもしれない。 これらも計算の頻度やその処理の重さによる。 攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。 バグが出た時に、データを一時DLしてから再計算してULし直せるように。 そうすればメンテ性も上がる。 つたないながらもCGIゲー経験者として。
189 :
181 :03/05/20 09:52 ID:???
思ったよりたくさん返事が…。ありがとうございます。
>>188 さん
>ネトゲ板のCGIブラウザゲースレの奴か?
違うと思います。俺はム板とこの板にしか出現しません。
>1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
>と検索させる方が鯖に優しいのはわかるな?
槍なら槍、剣なら剣と、種類ごとにデータを分けてしまえと言う事ですね?
>足し算の1回2回なら計算させた方がいい。
はい、単純な足し算です。
ですから。起動ごとに計算させる事にします。
そのほうがバグや計算ミスもなく簡単に管理出来そうです。
>攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
>バグが出た時に、データを一時DLしてから再計算してULし直せるように。
ちょっと意味が分からなかったのですがこれは公開後、利用者のデータにバグが出た場合、
こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
もう一つ質問なのですが、
>>187 さんが細かいデータをテキストで保存するのはキツイとご指摘下さいました。
確かに「アイテム」や「魔法」などは一つ一つ違った働きをして、仕様出来る場所も違います。
武器や防具の場合はけっこう単純なのですが…。
>>188 さんなら、これらをどこで定義しますでしょうか?
やはりテキストに書きますか?
ちなみに、終わった話(処理)ですがモンスターデータは全てテキストに書き出しました。
一行一モンスターの形式で書いたのですが、一行の文字数が300文字以上になって超見にくくなってしまいました。
>189
>違うと思います。俺はム板とこの板にしか出現しません。
違うのか、スマン。
ttp://game3.2ch.net/test/read.cgi/netgame/1031450575/115- ちょうどここで似たような話題があったので勘違いした。
気を悪くしたなら許してくれ。
>こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
大まかに言えばその通りだな。
ただ、本当に手動で100人以上のデータを修正していたら日が暮れるだろ?
それを自動でやってくれるスクリプトをローカル用に組んでおくと後で楽だよと。
>
>>188 さんなら、これらをどこで定義しますでしょうか?
>やはりテキストに書きますか?
繰り返しになるが、数による。
1000や2000のデータを内部で定義するとメモリを無駄に消費するからな。
俺ならアイテムや魔法のデータをテキストから読み出して、キャラデータと一緒に保存する。
アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
そうすれば普段は50しか読み出しを行なわずに済む。
1000のアイテムを検索するのは、アイテム購入とか、新規でアイテム入手する時だけになるわけだ。
敵からアイテムを拾う場合は、敵データにアイテムデータも一緒に入れる。
あんたのやり方の場合はそれは向かないかもしれないけどね。
結局、システムごとにやり方なんか違うものだと思うぞ。
毎回必ず1000のアイテムを読み込む必要のあるシステムなら、それこそ内部に記述した方がいい。
191 :
181 :03/05/20 10:40 ID:???
>>190 なるほど!
大変参考になりました。
>アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
まさにその通りです。
そこで思いついたのですがアイテムや魔法のIDや名前などの簡単に部分はテキストで保存し、
効果は以下のように定義しようと思いました。
#アイテム使用時のルーチン
sub item_001{
my ($item) = q['アイテム使用処理'];
eval "$item";
}
非常に大雑把な感じですが、処理はこんなイメージで進めていこうと思います。
大変参考になる話をありがとうございました。
ロックの問題があるから、どうにもテキストファイルを使うのは躊躇してしまう。 データベースの方が鯖に優しくはないが安全だよなあ。
楽したいだけだろ
194 :
181 :03/05/20 10:51 ID:???
全体のデータ(モンスター集)などは、書きかえられる事がないので安全です。 個人のデータは個人で使っているので、他者と書き込みがかぶる事はありません。 それと、処理全体には一応実行ロックをかけ、 さらに同一人物は5秒以内の連打アクセスが出来ないようほどこしてあります。 (テスト中はジャマなので解除してますけど)
ネットゲームの意味が全くねーな。
フォームからIDを入れさせて、 入力したIDがあらかじめ用意されたIDと一致してるかどうかで 表示する画面を分岐させたいのですが 現状は、 IDをテキストファイルに 10000 10001 10002 ・ ・ という形で入れておいて ループでIDファイルの一行と入力したIDが一致するか否かで 処理しています 処理が遅いので別の手段をとりたいのですが、 何かいい方法はありませんでしょうか? IDは8桁のランダムな数字列で、 テストはID5000件と10000件でやりました
>>196 ID"だけ"で良いのならば。
ID名でファイルを作成し、ファイルが存在するか否かで処理。
何万件も処理するならDBを利用すべきでしょう。
198 :
181 :03/05/20 14:27 ID:???
8桁でしたら、8個のファイルに分けてしまったらどうでしょう?
名前消すの忘れてた。 >>しかも197さんのが効率良いし。
200 :
nobodyさん :03/05/20 14:32 ID:wO+tQvft
すみません、初心者の質問答えてやってください。 Perlによる普通の掲示板でログの先頭行のタイトルだけを 取るにはどういう構文にすればいいんでしょうか?
>>200 マルチは許せんな。初心者だとしてもだ。
>>201 向こうが板違いだと気づいたんでこちらに書き込んだんです。
向こうには謝っておきました。
マルチになってすみません;
この板のどっかのスレでも見たような気がしかも数回・・・。 まぁいいや。 HTMLの話です。それ。がんばってHTMLしてください。 ※これ以上質問を繰り返さない事。板違いです。
なるほど、ファイルで処理するというのは思いつきませんでした でも5000とかファイルが生成されるのは 何かひっかかるものが… ちょっとテストしてみてDB使うかどうか考えます 8個ファイル作るというのもシンプルでいいかもしれないですね これもやってみますです 早いレスどうもです
あ、間違えたごめん。HTMLの話じゃなかったね。 先頭行だけ取る時は <ファイルハンドル> って感じで取得すると一行だけ取れるよ。
207 :
198 :03/05/20 14:50 ID:???
またやらかした。汗 ファイル8個って意味分からん数字だった。汗 今日は大ボケ連続です。ここら辺でボケてるの全部俺です。 10個にしよう。10個。 一番左の桁が[0-9]で10個。 桁数とファイル数はいっしょにしたらダメだこりゃ。ごめんなさい。
208 :
bloom :03/05/20 15:08 ID:vZIU7+LM
後述の関数で、どうも、Toにはメールが送られてるのですが、Ccにはメールが送られないもので、 困ってます。でも、なんもこの関数自体には、問題ない・・・ですよね? 3時間いろいろやってもわからなかったもので・・・。 (もちろん、$MyCcや$MyBccへと変数は引き渡してますつもりなんですが・・・) sub send_email{ my ($MyPathSendmail,$MyFrom,$MyTo,$MyCc, $MyBcc, $MyError, $MySubject,$MyMailbody) = @_; #件名を、JIS&MIME-Base64化 &jcode::convert(\$MySubject,'jis'); $Subject = &mimeencode($MySubject); #メール本文を7bitJISに変換する &jcode::convert(\$MyMailbody,'jis'); open(MAIL,"| $MyPathSendmail -t"); print MAIL "From: $MyFrom\n"; print MAIL "To: $MyTo\n"; print MAIL "Cc: $MyCc\n" if ($MyCc); print MAIL "Bcc: $MyBcc\n" if ($MyBcc); print MAIL "Errors-To: $MyError\n" if ($MyError); print MAIL "Return-Path: $MyError\n" if ($MyError); print MAIL "Sender: $MyError\n" if ($MyError); print MAIL "Subject: $MySubject\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n"; print MAIL $MyMailbody; close MAIL; }
$tmpid = $id[$i]; $in{'mailbody'} =~ s/<id>/$tmpid/ig; だとちゃんと置換されるのに、、 $in{'mailbody'} =~ s/<id>/$id[$i]/ig; だと、 $id[0]の値に置換されてしまいます。 これは、どのように改善すればいいのでしょうか? まだまだ、変数に対する理解が不十分なのでその辺だとは思うのですが、 調べてもわかりませんでした。
>>210 よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
(適当な発言です)
ええと、質問にまいりました。
検索しても出てこなかったのですが、指定したサブルーチンが存在するかどうか確かめる方法はありますか?
存在しないルーチンに飛ぶとエラーになってしまうので、存在するかどうか確かめてから飛びたいのです。
(こちらが指定したサブルーチン名は変数のため、目視では解決できません)
flock関数を使うと、変数$!に "Bad file descriptor" がセットされて しまいます。処理的には問題なくできてるんですが、気になります。 flockの直後にこのメッセージがセットされているようです。 以下に環境とコードを書いておきます。 OS: FreeBSD 4.6-2 Perl: version 5.005_03 built for i386-freebsd open(LOCK, $file) or &error("open error $file", 1); flock(LOCK, 5) or &error("flock failed", 1); $! and print "$!\n"; seek(LOCK, 0, 0); while (<LOCK>){ print $_; } close(LOCK);
213 :
bloom :03/05/20 19:08 ID:vZIU7+LM
>>211 シンボルテーブルを見るか eval でトラップ
215 :
Perl/CGI :03/05/20 20:05 ID:nlGr4tqO
>>170 です
フォームで入力したデータをそのままCGIで読めるようにファイルに書き込もうと思ってるんです。
これがそのサブルーチン全部です。
sub formset {
# フォームデータ取得
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
} else {
$query="$ENV{'QUERY_STRING'};
}
# フォームデータ復元
foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%[0-9a-fA-F][0-9a-fA-F]/chr(hex($1))/eg;
$foem{$key} = $value;
}
# ファイル出力
open(INIFILE,"+<$fileini");
#flock(INIFILE, 2);
seek(INIFILE,0,0);
foreach $key (sort keys %form) {
print INIFILE "\$$key=\"$form{$key}\"\;\n";
}
# ファイルを閉じてロックを解除する
close(INIFILE);
#flock(INIFILE, 8);
}
216 :
Perl/CGI :03/05/20 20:06 ID:nlGr4tqO
問題の部分は # ファイル出力 open(INIFILE,"+<$fileini"); # ファイルをロックする #flock(INIFILE, 2); seek(INIFILE,0,0); foreach $key (sort keys %form) { print INIFILE "\$$key=\"$form{$key}\"\;\n"; } # ファイルを閉じてロックを解除する close(INIFILE); #flock(INIFILE, 8); 何ですけど、ご存知のようにopen行で Unterminated <> operator エラーがでてとまります。 ご指導、指摘お願いします。 解決策も教えてください。
$fileiniの中身は?
218 :
210 :03/05/20 20:11 ID:???
>>211 >よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
結果は同じでした(泣)
219 :
Perl/CGI :03/05/20 20:17 ID:nlGr4tqO
>219 httpでファイル指定はできません。
221 :
Perl/CGI :03/05/20 20:32 ID:nlGr4tqO
>220 いや、これはリンクです。 リンク先のアドレスです。
>221 じゃあ、 print $fileini; としたら何が表示されるんだよ。
223 :
Perl/CGI :03/05/20 20:57 ID:nlGr4tqO
>222
CGIで読み出してそのまま使えるようにしてあるので
$access="
http://www. ……";
というふうにしてます。
>223
つまりお前さんは
open(INIFILE,"+<$access="
http://www. ……"; ");
こうなる事を期待してるのか?
俺が聞いてるのは、「$fileiniで指定された先のファイルの中身」ではなくて、
「$fileiniの中身」なんだが日本語わかる?
225 :
動画直リン :03/05/20 21:08 ID:vZIU7+LM
226 :
nobodyさん :03/05/20 21:15 ID:ITOFryED
ちょいと質問なんだが、 今、アクセス解析つかっているんですが、 ログファイルには 日時<>リファ<>ホスト<>IP<>エージェント 日時<>リファ<>ホスト<>IP<>エージェント 日時<>リファ<>ホスト<>IP<>エージェント ・ ・ ・ ・ ってなってるんですが、こういう風に複数行ある場合は、読み出して一覧を出力したいんですが・・ 具体的に ------------------------------←水平線 アクセス時 : 日時 リファラー : リファ ホスト名 : ホスト IPアドレス : IP ユーザーエージェント : エージェント ------------------------------ アクセス時 : 日時 リファラー : リファ ホスト名 : ホスト IPアドレス : IP ユーザーエージェント : エージェント ------------------------------ みたいにしたいんですが・・・・ 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。 何かいい方法ないでしょうか?
>>226 > 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
> 何かいい方法ないでしょうか?
一行ずつ処理すればよいのではないかい?
真相は分からんが。
228 :
nobodyさん :03/05/20 21:21 ID:ITOFryED
>>227 一行ずつ処理ですか・・・
えと、読み込んでforeachにまわすとか?ですか?
すんません、リファレンス1冊買って勉強します。。
ネットでは情報が少ないですよね
>>211 無名のサブルーチンを作って、undefかどうかってのは駄目なんだろうな・・・
230 :
nobodyさん :03/05/20 21:54 ID:OOsiMZA+
$idnum = substr($REMOTE_ADDR, 8); $idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8); って2ch互換ID? とテストしてみる
IDって統一性はないし、いらないなと思いました。
>>226 複数行って意味が分からないが、普通に
my $format = <<'EOM';
------------------------------
アクセス時 : %s
リファラー : %s
ホスト名 : %s
IPアドレス : %s
ユーザーエージェント : %s
EOM
while (<LOG>) {
print sprintf($format, split /<>/);
}
とかじゃ駄目なの?
233 :
210 :03/05/20 22:47 ID:???
>>210 手元の本みたら、
変数はスカラ変数と配列変数しか使えませんとかいてありますた。
ということは、一番スマートなやりかたは、
>>210 とするしかないのでしょうか?
234 :
139 :03/05/20 23:14 ID:iNE6jQJj
open(FILE, $name); @data = <FILE>; で、ファイル読み込む(txtやcgiソース) そして、編集できるように、 テキストエリアに出力 print "<textarea>@data</textarea>\n"; ↑けっこう略 すると、@dataが""で囲まれている?ので、2行目以降の先頭に空白ができます。 この場合はどうすればいいですか?
文字列を暗号化しようと思って、いろいろ探してたら、VisualBasicで 1バイトを20ヘキサ引いて、複合化時は20ヘキサ足すってのが あったのだけど、これをPerlで出来ますか? VBは、こうなってた For i = 1 To Len(strBase) If LenByte(Mid$(strBase, i, 1)) = 1 Then ''1バイト Put #iFNo, N, Asc(Mid$(strBase, i, 1)) - &H20 Else ''2バイト Put #iFNo, N, &HFF N = N + 1 strTemp = Hex$(Asc(Mid$(strBase, i, 1))) Put #iFNo, N, CByte("&H" & left$(strTemp, 2)) - &H20 N = N + 1 Put #iFNo, N, CByte("&H" & right$(strTemp, 2)) - &H20 End If N = N + 1 Next
>>234 open(FILE, $name);
print "<textarea>";
while ( <FILE> ) {
print;
}
print "</textarea>";
237 :
139 :03/05/21 00:00 ID:DxtaiKT1
>>236 おぉ。。できました。ありがとうございます
初々しくて良い
>>234 普通に
print "<textarea>", @data, "</textarea>\n";
または
$" = '';
print "<textarea>@data</textarea>\n";
特殊変数 $" の値を変更することで、ダブルクォート文字列内で
配列を展開するときのセパレーター(要素間に挟み込まれる文字
デフォルトは半角スペース)を好きな文字に変更できる。
覚えておいて損はないよ。
240 :
_ :03/05/21 00:05 ID:???
>>209 レスがないってことは、この関数の部分はとくに問題ないってことなんでしょうか?
242 :
139 :03/05/21 01:10 ID:DxtaiKT1
>>239 それためになります。
ありがとうございます
欲しい情報を見つけることが出来なかったので、
ご存じの方がいましたら教えていただきたいのですが。
perlスクリプト中のperl呼び出し時に起動オプション[-w]を付けて書いています。
そうしても処理結果自体は欲しい結果が得られるのですが、
警告文として、以下のものが出力されます。
警告文
Use of uninitialized value in string eq at test.cgi line 10.
Use of uninitialized value in string eq at test.cgi line 52.
該当スクリプト記述
10 : if ($ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($form{'key'} eq '')
http://www.att.or.jp/perl/man/perldiag.1.html ここの情報で未定義値を初期化しないで使用しているという
原因までは解ったのですが、if文のeqに対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。
この問題の解決方法をどなかたご教授下さい。
>>243 10 : if ($::ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($::form{'key'} eq '')
こうしてみたらどうよ?
245 :
243 :03/05/21 01:16 ID:???
追記 警告文には他にも以下のものがありました。 Use of uninitialized value in split at ./test.cgi line 15. Use of uninitialized value in join or string at ./test.cgi line 103. split とか join と関数が指摘されているようですが、 これらの関数を使用する前に初期化が必要なんでしょうか?
>>245 面倒くさい。
できるだけまとめて、ソース晒す事できないのか?
>>241 > open(MAIL,"| $MyPathSendmail -t");
を、
open(MAIL,">&STDOUT");
にしてひとまず標準出力に吐き出して確認してみたら?
あと「sendmail -t」を調べてみる。
248 :
243 :03/05/21 01:20 ID:???
>>244 ご指摘の通りに変更してみましたが、結果変わらずでした。
警告文のあるeqではなく、そこで扱っている変数に問題があるんでしょうか?
249 :
243 :03/05/21 01:21 ID:???
>>246 すみません。部分抜き出して、試せるソースを用意してみます。
>>248 ちなみに、-w付けなかったら動くのか?
251 :
243 :03/05/21 01:33 ID:???
部分抜きだしで、こんな感じです。
この状態だけでも警告文は同じく出ました。
よろしくお願いします。
>>250 -wを付けても結果は同くじ得られるのですが、
警告文が出ている以上、何かしらスクリプトの
書き方が間違っているものだと思いまして、
その原因を突き止めておきたいのです。
#!/usr/bin/perl -w
(%form) = &get_form('sjis');
if ($::form{'key'} eq '') { print 'A key is not found.'; }
sub get_form {
local($charset) = @_;
if ($charset eq '') { $charset = 'euc'; }
if ($::ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'});
} else {
$form_data = $ENV{'QUERY_STRING'};
}
続く
252 :
243 :03/05/21 01:34 ID:???
改行数で怒られたので分割ですみません。 続き (@key_value) = split(/\&/, $form_data); foreach (@key_value) { ($key, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode::convert(\$value, $charset); $FORM{$key} = $value; } return (%FORM); }
>>251-252 気にたった点。
>(%form) = &get_form('sjis');
(%form)の()を外した方がよさそう。
>local($charset) = @_;
特別な意味がない限りmyを使う事を推奨されてたと思う。
myの方が早いし。
>return (%FORM);
これも()を外した方がよさそう。
・・・力になれなかったかも・・・
スマソ
あ、ちなみに、上記ソースで俺の環境(Win2k、Perl5.8)では、文法エラーも何も出なかった。
>>243 結論から言えば、何も問題ない。
-w を付けて尚かつ一切の警告を受けたくないということなら
疲れるだけだから止めた方がいいよ。
ちなみに -w をつけると
・一度しか使われない識別子
・値をセットせずに参照されるスカラー変数
・サブルーチンの再定義
・未定義のファイルハンドルの参照
・読み出し専用でオープンしたファイルハンドルへの書き込み
・数値以外を数値として扱った場合
・配列をスカラーとして扱った場合
・深さが100以上のサブルーチンの再帰呼び出し
・その他いろいろ
に該当する時、警告されます。
変数を初期化なしで使うなんてperlでは当たり前のことでも
イチャモンつけて欲しいなら別だけど、普通はデバッグ時に
意図しないで上記のことをしていないか診断したいときにだけ使います。
256 :
243 :03/05/21 01:55 ID:???
>>253 ご指摘ありがとうございます。
なるほど、これから気を付けて行きたいと思います。
こちらの環境はRedhat8.0/Perl5.8なのですが、
perlのバージョンは同じようですし。うむぅ。
実行出来ない訳ではないので、黙殺しても良い部分だとは思うのですが。
どうもありがとうございました。
>>251-252 その警告の行以外に原因があるようだな
$charsetにlocalをつけておきながら$form_dataや@key_valueを
そのまま使っているし、全体を見ないとなんとも言えないな
258 :
243 :03/05/21 02:05 ID:???
>>255 な、なるほど(汗
perlを始めたばかりで、初めのうちから正しい書き方を
身につけようとか思っていたのですが、どうやらそれが
良いことばかりでは無いようですね。
素直に黙殺します。
これからは-wはデバッグ時のみ実行する事にします。
ご指摘いただきました方々、色々とありがとうございました。
>>257 おっしゃる通りです。
警告文が該当している箇所を急いで抜き出したものでしたので。
変数とかの扱いをちゃんと書いて、最終的にもう一度確認して行きたいと思います。
$charset自体は指定してるの?
260 :
243 :03/05/21 02:24 ID:???
>>259 抜き出したスクリプトでも(勿論、元スクリプトでも)
&get_form('sjis');
とサブルーチンに値を渡しているので、平気だと思います。
実際に元の方の出力はsjisになってましたし。
261 :
209 :03/05/21 02:28 ID:???
>>209 にレスがないってことは、関数自体は問題ないってこと?
>>261 しつこい!
ダミーで出力して自分で見れ!
>>258 use warnings (-w)は別にいつも付けてる必要はないけど、
use strictでコードする癖をつけないと後で泣くよ。
コードするってなんだよ。
動詞の原型に「する」を付けて日本語化するのは ポピュラーな方法だぞ? コーディングする、の方が言葉として変。
コードって名詞なんですけど。 灰皿する。 机する。 本する。 ま、どーでもいいけど。
267 :
264 :03/05/21 09:43 ID:???
>>265 この場合はおかしいと思わないか?
>>266 一応英語では動詞でもある。でも日本語の中で使う場合は名詞だよなぁ。
269 :
210 :03/05/21 10:16 ID:???
んなことどうでもいいし。 perlスレはもうやめたのか。
英語の知識に欠ける人間が他人に無知を押し付けるスレはここですか?
非常識な人間が非常識なことを(ry
>>269 >$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>だと、
>$id[0]の値に置換されてしまいます。
正規表現では[ ]は意味を持ってしまうのでエスケープしないと
$in{'mailbody'} =~ s/<id>/$id\[$i\]/ig;
なるほど!と思ったら違うのか…
277 :
Perl/CGI :03/05/21 17:01 ID:XtYsWXu+
>>224 すいません、そういうことでしたか。
$fileiniが指定してるのは
初期設定ファイルのことで、admin.iniの形式にしてます。
んでそのファイルの中身は以前書いたものになってます。
レス遅くなってすいません。
278 :
動画直リン :03/05/21 17:08 ID:JZ9K0e/X
みなさんどのようにしてPerlを覚えましたか? 私は すぐわかるPerl => 初めてのPerl以降詰まってます。
>>279 名前は忘れたけど、地球儀みたいな絵が書いてあるPerl/CGI入門書から入った。
すげー分かりやすく、それだけで、簡単な掲示板が作れるようになった。
↓
「CGIのための 実践入門Perl」
黄色い鍵の絵が書いてある本。
これも、かなり分かりやすい本だった。
俺のバイブル。
↓
「新Perlの国へようこそ」
サルが温泉つかってる絵がかかれてる。
上の2冊読んでたら、理解できるはず。
書いてる事は、ちょっと難しいが、リファレンスやらオブジェクトやら勉強できる。
↓
「ラクダ本」
全部なんて読んでない(w
この関数の詳しい動きが知りたい!
そんな時に開く本として置いてある。
最強の本だけど、いきなりすべてを知ろうとして読むと、
挫折するっぽい。
と、現在中級者のちょっと上レベルの俺が言いたい事は、
「Perlで作るCGI入門 基礎編」 この本は、読みにくく俺にとっては無駄遣いしたとしか思えない
・・・と。
>>280 了解です!ラクダは辞書的な読み方をすればいいんですね!
進めて頂いた入門的な本も探してみます。
あらっしたぁ!
>>274 >>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>>だと、
>>$id[0]の値に置換されてしまいます。
>正規表現では[ ]は意味を持ってしまうのでエスケープしないと
やっても、結果同じなんですけど・・・・
283 :
nobodyさん :03/05/21 17:59 ID:zxc8lPDx
CGI&perlポケットリファレンス 地味でへたれっぽいけどすごくちゃんとした内容。 ラクダよりも、ちょっとしたリファレンスとしては便利。
>>283 あらっしたぁ!
買います。
あらっした。
え〜っと「あらっした=有難う御座いました」です・・・
オイラもCGI書くためにPerlを習いだしたけど、
>>283 のはすごく良い。
頭で覚えるより
>>283 のを一冊脇に置いて、
実際に簡単なスクリプト書いてみるのが一番覚えやすい。
こうしたいけどどうしたら良いんだろう?とか
「疑問→解決」が一番吸収しやすいしね。
初心者向けじゃないけど 「Effective Perl」 いい本だ
>>286-
>>288 ありがとう御座います。凄く参考になりました。
これをきっかけにパールマスター(パールをマスターした人)を目指してみます。
有難う御座いました。
私は、とほほのPerl入門のリファレンスと ひたすら既存のスクリプト改造で育ったかな。 本はポケットPerlリファレンス買った。
ポケットPerlリファレンス=
>>283 と同じの
適当に題名書いちゃった…(*´ー’
>>290 ページごとに完結してるから見やすいのがいいやね。
まさにリファレンス。
Perlでcgi組んでてオブジェクト指向してもないのに、 画面遷移図をUMLのステートチャート図で書いてるのって変ですかね?
>290 俺はとほほさんとこのをプリントアウトして使ってる。 ちょっと調べたい時とかは、らくだ本みたいに大きくもないし便利。
>>98 Unrecognized character \x81 at unique.cgi.
ってでるんですが・・・
296 :
295 :03/05/21 21:56 ID:???
解決しますた・・・
全角空白が混じってたと思うのだが、解決したならその方法も書いてくれるとありがたい(w
>>297 寝ぼけてました・・・後でx81か!って気づきました。
その通りです。先頭に全角スペースがあっただけでした。
暗号化で、1バイトずつ(2バイト文字も上位下位バイトに分ける)を 20ヘキサ引いて、複合化時は20ヘキサ足すってのを作ったんだけど 完全にデコードされないんです。最後の方が化けたり・・・どこが変か教えてくださいです。 CGIっぽいけど許してね #!/usr/local/bin/perl use CGI; $q = new CGI; print $q->header('text/html; charset=euc-jp'); if( $q->param ){ $n = $q->param('name'); print "en=",&encode($n); print "<BR>"; print "de=",&decode($n); } print $q->start_form, $q->textfield(-name=>'name'), $q->submit, $q->end_form; sub endecode{ my($name)=shift; my($diff)=shift; my(@w)=(); my(@w2)=(); @w = split(//,$name); for(@w){ push(@w2,sprintf( "%c",ord($_)+$diff)); } join("",@w2); }
上の続き sub encode { my($name)=shift; &endecode($name,hex(0x20)); } sub decode { my($name)=shift; &endecode($name,-hex(0x20)); }
質問。Locationを使って別のページに飛ばしたいんだが、 飛ぶときと飛ばないときがある。なんで?そんなことってあるの? 調べたところ一部のサーバーではLocation禁止というところも あるみたいだが、うちは飛ぶ。 でも飛ばないときもある…
>301 PerlというよりCGIの質問だな。 ブラウザごとに飛ぶ飛ばないを調査して、どういう条件で飛ばなくなるかを 自分なりに調査した方がいいと思うぞ。 あとは出力されているヘッダがどうなってるかを調べてみるとか。 どちらにせよスレ違いだから、調査の上で適切なスレへ行きな。
>>302 調査はした。で、同じ条件・同じ方法で飛ばしてみようとしても 飛ぶときと飛ばないときがある…ますますわからない。 ありがとん。
305 :
山崎渉 :03/05/22 01:55 ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
>>270 それでOKていうのは、
$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;
でOKってことですか?
というか、それしか、やりようがないということなのでしょうか?
なんかキモイスクリプトだなーと思ったもので。
まだやってたのか… 人に聞くより自分でアレコレ試した方が早いことも多いよ? 270じゃないが、 $in{'mailbody'} =~ s/<id>/$id[$i]/ig; で、文法的にも何も問題ない。 置換前に print "\$i=$i \$id[\$i]=$id[$i]\n"; と一行書いて、変数に何が入ってるか確認。
なにこれ。 新種の山崎登場? とりあえずage
309 :
210 :03/05/22 10:43 ID:???
>>307 それやってみたら、ちゃんと出力されてるんですよね・・・
なのに、変換すると、以下の文章(メールですが)で、$id[0]、$name[0]、$email[$i]
が出力されてます。
おっしゃるとおり、もっと自分でアレコレ試してみたいんですが、
しかし、これ以上どこを試せばいいのか・・・?
なんか手がかりというかポインタでいいので、教えていただけませんか?
for ($i=0; $i<=$#email; $i++) {
#TODO:ここ動かないのでペンド中
#本文への差込
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
$in{'mailbody'} =~ s/<name>/$name[$i]/ig;
$in{'mailbody'} =~ s/<email>/$email[$i]/ig;
$in{'mailbody'} .= "\$i=$i \$id[\$i]=$id[$i]\n";
}
>>309 $i以外を使ってみろ!といってみるテスト。
for (0 .. $#email) { # など・・・
それでもだめならPerlのバージョンさらし+環境さらし。
311 :
310 :03/05/22 11:40 ID:???
あ、もしかしたら\n含んだ文字列か?>$in{'mailbody'} そりなら/igs;
312 :
307 :03/05/22 12:40 ID:???
>309 ひとつの $in{'mailbody'} に対して、@mail 要素数だけ置換繰り返すの? 置換した結果を置換して、それをまた置換した結果を置換…以下ループ(´Д`;) まず間違いなくその辺に問題があるんじゃない? >311 行頭や行末を使ったマッチングじゃないので /s は関係ないぽい。
>>299 CGI部分は端折って試したけど、普通に動作したよ。Shift_JISでだけど。
ちょっと見た感じ、print のとこで encodeにもdecodeにも同じ $n 渡してるけど、
decodeには encodeした文字を渡さないと意味ないんじゃない?
ただ両方表示してるだけというなら片方は化けて当然だよね。
それと、普通そういうのはCGIでテストしないで、まずコンソールでテストするよ。
たとえ最終的にCGIにしても。。問題が切り分けられないからね。
Perl4の鯖にmy使ったらエラーでまつか?
>>314 試せよ。
俺はモジュール使いたいんで、
Perl4しかインストールしてない鯖なんか使う気にならんが。
>314 出た
perl4の人は、なんでバージョンアップしないの?? あとちょっとで6になりそうなのに・・・
>317 プロバが放置してるんだもんよ。
>>317 >>318 を補足するならば、
・鯖管理者に技術がない
・鯖管理者に暇がない
・バージョンアップして、今動いているものに不具合が出ることを警戒している
などの理由によって放置されている。
やめてよー。せっかく5に慣れたのに。
スクリプト内でperlのバージョンを取得して 結果と一緒に出力させたいんですが、 %ENVにも含まれてないそうで取得の仕方に困っています。 知ってる人がいたら教えて下さい。
$]
>>322 出力出来ました。
こんな簡単な質問に答えてくれてありがとうございます。
324 :
nobodyさん :03/05/23 14:42 ID:82gPpiu/
>324 LWPで検索。
ソッケトとか、プロトコルとか、そーゆー言葉知ってますか? 知らなかったら検索してください。
327 :
nobodyさん :03/05/23 14:57 ID:82gPpiu/
328 :
北村貴母緒 :03/05/23 15:16 ID:7vDvDVhJ
お金が欲しい方は相談を受け付けます!
見てください。何でも書いてね!
【2003年 クーポン屋】努力しない人は0円になります。
努力した人は年商3574万円!貴方は参加しますか?
私なら、参加します。
http://www.c-gmf.com/index1.htm 「クーポン屋」「アクセスが1日2000人ほどある人なら、1ヶ月274万円ほど
稼げるビジネスであります。」1日110円で宣伝できるサイトであります。
契約者は年間広告費:40,000円を当社に振込んでいただければ、OKであり
ます。そこで、紹介者として,貴方様専用のCGIフォームを用意しますので、
料金回収無し、ノルマ無し、HPにバナーを貼ればOKであります。パートナー
様の目標は1ヶ月300件ほど契約を成立していただければ,貴方様の口座に
274万円を振込しますので、頑張って営業をしてください。どんな人でも稼げ
ますので、1度でも良いので見てくださいね。
http://www.c-gmf.com/index1.htm
>>324 ソケットとか知らなくても似たようなことは出来ちゃうもんなあ
楽してやがるぜ
@ArrayCity の要素の中に、$cityが含まれているかどうかを 調べる以下のコードって、もっとスマートにかけませんか? (あるいはそういう関数ってないでしょうか?) $city = "tokyo"; foreach $value (@ArrayCity){ if ($value eq $value){ $Flag = 1; last; } }
$city = "tokyo"; if(grep(/$city/,@ArrayCity)){ $Flag = 1; }
ソートについて質問があります。 (わかりやすいようにチャンネルとテレビ局名を例にしてます) @channel = (6,1,8,4,10) @tvname = ('tbs','nhk','cx','ntv','asahi'); っていう配列があって、 これを、 @channelの要素の小さい順に、@tvnameの要素をソートすることって どうすればできるのでしょう? 要は、 @new_tvname = ('nhk','ntv','tbs','cx','asahi'); を取得したいのですが。
334 :
nobodyさん :03/05/23 17:32 ID:XGb65p6n
なんで連想配列つかわないの? キーをソートしたらいいのに・・・
335 :
333 :03/05/23 18:14 ID:???
336 :
333 :03/05/23 19:55 ID:???
すいません、やはり、使わないでできる方法ないですか・・・? スパゲッティ状態で、連想配列に変換しようとしても、うまくいかず。。。
337 :
333 :03/05/23 19:55 ID:???
>>336 訂正です
使わないでできる方法→連想配列を使わないでできる方法
正直できるか分からないが my @no = sort {$channel[$a] <=> $channel[$b]} 0 .. $#channel; my @new_tvname = @tvname[@no];
>>338 333じゃないけど、それできたよ、すごい。
@tvname[@no] こういうのはじめてみた。勉強になった。
一応ハッシュに変換する方法も書いておくと、これまた強烈なんだけど、 @tv_table{@channel} = @tvname; @new_tvname = map $tv_table{$_}, sort {$a <=> $b} keys %tv_table;
use strictを使用した上での参照渡しの方法についてお聞きします。 やりたい事は、メインのスクリプトからパッケージのサブルーチンへ2つの配列を参照渡しさせたいのです テスト用に以下のスクリプトで試してみましたが、エラーとなってしまいます。 #test.cgi #!/usr/bin/perl use strict; use vars qw(@test1 @test2 @output); require 'test.pl'; @test1 = ('abc', 'def'); @test2 = ('ghi', 'jkl'); @output = &testlib::convert(*test1, *test2); print "@output\n";
344 :
343 :03/05/23 23:02 ID:???
>>343 続き
#test.pl
package testlib;
use strict;
#use vars qw(@sub_test1 @sub_test2);
sub convert {
local (*sub_test1, *sub_test2) = @_;
my @line;
foreach (@sub_test1) {
$_ =~ s/abc/def/i;
push (@line, $_);
}
foreach (@sub_test2) {
$_ =~ s/ghi/jkl/i;
push (@line, $_);
}
return @line;
}
1;
これでstrictをコメントアウトすると問題ありませんでした。
また、strict有効状態で、パッケージ内の#use varsを有効にすると上手く行きましたが、
基本的にパッケージの方でもvarsで宣言しておかないとダメなのでしょうか?
346 :
345 :03/05/24 00:02 ID:???
ああぁ。。俺は
>>338 じゃないっす。一応言っとかないと。
配列スライスは例えば($second, $third) = @array[2,3]; とかできるっす。
347 :
345 :03/05/24 00:07 ID:???
($second, $third) = @array[1,2]; だ・・・鬱氏
348 :
nobodyさん :03/05/24 00:10 ID:f0Btk8DH
「orgid(シリアル番号),planid(外部キー),countryid(外部キー),orgname」 っていう列を格納しているCSVファイル(DBではないのです(泣))があるのですが、 それに対して、 「select * from orgmaster where flagplan=1 ordeby planid countryid」 した結果をはき出したいと思ってますが、とんとわかりません。 どのようにすればいいのでしょうか? なお、DBD::CSV は使えない環境です・・・
>>343 # test.cgi
#!/usr/bin/perl
use strict;
use TestLib;
my @test1 = ('abc','def');
my @test2 = ('ghi','jkl');
TestLib::convert(\@test1, \@test2);
print @test1, @test2;
__END__
# TestLib.pm
package TestLib;
use strict;
sub convert {
s/abc/def/i for @{$_[0]};
s/ghi/jkl/i for @{$_[1]};
return '昆布。';
}
1;
__END__
>>345 捕捉thx
>>343-344 Perl4?
Perl5ならリファレンスでいけると思うけど。
後、use varsは使わない方がいいと思う
被った__| ̄|○
なんで?
353 :
343 :03/05/24 08:00 ID:???
>>349 御指南ありがとうございます。
せっかくいただいたのですが、今は試せる時間が無いので今日の夜にでも自分トコで使ってみます。
外部にサブルーチン持たせる時はそういう使い方でしたか…
あの長ったらしい分がここまで短くなるとは、奥が深いです。
>>350 失礼しました。
環境はPerl5.008です。リファレンスというキーワードで勉強してみようと思います。
use varsは色んなperlの解説サイトで、strict宣言するときに…
みたいな事がかかれていたのですが、使わない方向で頑張ってみます。
354 :
nobodyさん :03/05/24 17:48 ID:CEfAWsDp
#!/usr/bin/perl $file = "count.dat"; open(FILE, "+<$file"); flock(FILE,2); $count = <FILE>; chomp $count; $count++; seek(FILE,0,0); print FILE "$count\n"; flock(FILE,8); close(FILE); print "location:../ip/ip.zip\n\n"; こうすると、このcgiが呼び出された回数は記録できるんですが、私はダウンロードされた数が知りたいんです。 どうすればいいですか?ダウンロードが完了したらカウントアップってのをしたいんですが・・・
質問です。
例:
$value1 = '
http://www.yahoo.co.jp ';
$value2 = 'Copyright (C) 2003 Yahoo Japan Corporation. All Rights Reserved. ';
この場合、$value1 と $value2 には大文字小文字の違いはありますが、yahooの文字列が両方ともに存在します。
このように、$value1 と $value2 を比較して、なかに同じ文字列が存在する場合に真とすることって可能なのでしょうか?
例ではyahooが同じ文字列ですが、実際は何が同じ文字列になるのかわからないこととします。
>>354 Location:
で飛ばさない方法というのは如何でしょうか?
>>355 可能です。
と、答えると逆ギレされるのだろうか?
この世の中ってば、ほんと怖いです。
ま、「1文字一致」っていうのもあるから許されますよね?ね?ね?
357 :
nobodyさん :03/05/24 18:18 ID:LfXTm2oZ
358 :
354 :03/05/24 18:20 ID:CEfAWsDp
>>356 ロケーションで飛ばさない、、といいますと??
ほかに方法がありますか?あればぜひご教授ください。
>>358 :../ip/ip.zipの内容をCGIで吐けってことだろ。
最後まで吐ききればダウンロード完了っつーことで。
360 :
354 :03/05/24 18:32 ID:CEfAWsDp
>>359 ファイルの中身をcgiに記述する、、、ということでしょうか?
ぜんぜんわかりません、ごめんなさい。
もう少しわかりやすくお願いできますか?
>354 どちらにせよ、「DLを試みた回数」はわかっても、「DLを完了した回数」はわからないよ? 途中で回線切断されたら終わりだし。
362 :
354 :03/05/24 18:41 ID:CEfAWsDp
>>361 そうですか。。。
途中で切断でもいいので、「保存」を押して転送が開始された時点でのカウントでもいいのですが・・・
>>360 ダウンロードカウンタでも落としてきて参考にしなよ
364 :
354 :03/05/24 18:44 ID:CEfAWsDp
365 :
354 :03/05/24 18:56 ID:vyZFmtfU
うーん、5.6個みてまわったんですけど、cgiのクリックされた時点でカウントするタイプみたいですね。 、、これであきらめます。
>362 CGI使わずに、鯖のアクセスログとか見た方が鯖に優しいぞ。
367 :
nobodyさん :03/05/24 19:16 ID:4X2MnE2O
>>362 formを使って、ソレをカウントしてそれからロケーションに飛ばせばいいんじゃないの?
369 :
355 :03/05/24 20:11 ID:???
>>356 > 可能です。
そうですか。。。
漏れにはその方法がわからないけど、こんな風なのはどうか評価してください。
連続する5文字が両方にあったら真とするということに勝手にします。
で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
次に2文字目から6文字目までの5文字を配列に入れる。
以下繰り返し。
最後に@value1、@value2の比較。
駄目でしょうか?
2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
>>360 ちょっと俺が間違ってた。
CGIで吐くんじゃなくて別のポートを見張るサーバを別に立てて、そこへ向けてLocationで飛ばす。
で、送出できたバイト数を数えればダウンロードできたかどうか分かる。
簡易HTTPサーバ作るってこと。
372 :
356 :03/05/24 22:27 ID:???
>>369 > で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
あのぉ、、、(汗)
> 駄目でしょうか?
さすがに「しゃーねーなぁ、、、それでいこか。」とは口が裂けても云えませんm(_ _)m
> 2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
さんざん既出だとは思うが、文字コードを云々・・・
「検索アルゴリズム」
いっぺんこれでググってみると新しい道が見つかるかもよ。道は険しいけれども。
(「木」「ハフマン」「辞書」とか出てくるかもしれんが@「圧縮」も似たようなもん)
>>355 if ($value1.$value2 =~ m/(.+).*\1/i) {
my $word = $1;
if ($value1 =~ /$word/i && $value2 =~ /$word/i) {
print $word,"\n";
}
}
こういうのはいかが?
藻前、自分ができないからって、逃げるなよ。
>>373 のままでは色々問題あるのでその辺は適当に処理してくれ
>>355 あなたが、何を文字列として定義するか(重要)で
難しさは極端に変わりますが、簡単な \w+ を例に
するとこんな感じでしょうか。
my $value1 = '
http://www.yahoo.co.jp ';
my $value2 = 'Copyright (C) 2003 Yahoo Japan Corporation. All Rights Reserved. ';
if ( reword($value1, $value2) ) {
print '重複した単語がある';
} else {
print '重複した単語はない';
}
sub reword {
my $str = shift;
my $substr = shift;
my (%word); # 単語用ハッシュ
$word{"\L$1"}++ while $str =~ /(\w+)/g; # 単語をキーに登録
$word{"\L$1"} && return 1 while $substr =~ /(\w+)/g; # 登録済みなら真を返す
return 0; # 無かった
}
377 :
343 :03/05/25 00:49 ID:???
>>349 お礼が遅くなり、申し訳ございません。
無事にサンプルスクリプトを動かす事が出来、それを踏まえて自分のスクリプトでやりたい事が実現できました。ありがとうございます。
しかし、上記のサンプルコードでプラス変数を追加し、文字列変換の def 部分をその変数で置き換えた場合にエラーが出てしまいました。
変数を表す場合は、@{$_[3]}ではダメだとまでは判別できるのですが、実際の表記の仕方が見当もつかない状況です(連想配列の場合もそうなんですが)
そこで、答えそのものではなくても、strict使うのであればここを読め、の様なサイトはないでしょうか?
>>4 のサイトを全て回りましたが、普通に*で渡すようにとの解説ばかりでした。
378 :
349 :03/05/25 01:32 ID:???
>>377 use strict 以前の話なのですよ。343さんがハマってる部分は。
むしろ use strict は全然関係無し。
まず * が何を表していて、何故 \ が出てきたか、@{ } は何を
しているのか、どうしてこのコードで引数に渡した配列そのもの
の値を置換する事ができるのか。そういう点を全部読み解き、
理解しましたか?
あと、エラーが出た場合はどんなエラーが出たのか言って
くれないと、何が悪いのかサッパリ見当付かないですよ。
380 :
343 :03/05/25 02:15 ID:???
381 :
nobodyさん :03/05/25 13:54 ID:sMN/Ic1b
日記のスクリプトを組みたいと思っています。 そこで長い間つかえるように日記のログを年、月と階層的にディレクトリを 作り、ユニークなログを実現したいです。 そこで、 opendir(LOG,"./Log") || die mkdir("./Log", 0755); opendir(YEAR,"./Log/$year") || die mkdir("./Log/$year/",0755); opendir(MONTH,"./Log/$year/$month") || die mkdir("./Log/$year/$month",0755); のようなスクリプトを実行してみました。 ./Log/$year/で$monthディレクトリ1つが無い時は正常に動作しましたが、 ディレクトリを2つ以上作成したい時でも1つしか作る事ができませんでした。 これを解決するための原因をご存知の方がいらっしゃいましたらよろしくお願いします。 環境:OS Win2000 Perl 5.6.1
>>381 困ったことに同一環境で正常に動作しました。
テスト方法は、上記のスクリプトの先頭に、
print "Content-type: text/html\n\n";
$year = "2003"; $month="5"; print "$year $month\n";
を追加して、$monthを変更しつつ数回実行。
383 :
381 :03/05/25 15:37 ID:sMN/Ic1b
>>382 試していただき、ありがとうございます。
上記の時間はlocaltime()で取得したものです。
書き方がとても下手ですみません。
例えば、今年の2003年1月のログが/Log/2003/1に格納されていた場合、
年が明け、来年の2004年1月になった時/Log/2004/1とLogディレクトリ下に2004ディレクトリ、
そのまた下(Logから見て2階層下)に1ディレクトリを作りたいです。
しかし、上記のスクリプトでLog以下のディレクトリを作成せずに実行すると、一回目は「Logディレクトリ」、
二回目は「5ディレクトリ」と、一回の実行で一つのディレクトリしか作れません。
>>382 さんのコードですと、同階層のディレクトリを複数個作っているんですよね。
もしまだお付き合い頂けるのでしたらまた宜しくお願いします。
#現在はとりあえず200Xディレクトリと1〜12ディレクトリを予め複数個用意して他の部分を作っています。
コンソールからmkdir /Log/$year/$month で$yearと$monthのディレクトリが作成できるのに
なぜスクリプトからだとできないのだろう・・・
>>383 die使わなければいいだけでしょ。
エラー処理じゃなく分岐したいだけでしょ?
ファイルテスト演算子の-eでディレクトリがあるかどうか判別したら?
質問です。
以下のURLにある、商品名とメールアドレスを入力してボタンを押すと、検索結果を入力した
メアド宛てに送信するというシステムがあるのですが。
該当ページURL
ttp://www.hakuraiya.way.cc/quote.html (海外の薬を個人輸入代行する業者のページです)
で、ソースを見ると
http://www.hakuraiya.way.cc/cgi-local/order/quotemail.cgi こういうCGIに入力データが送られ、検索処理後にメール送信しているようなのですが、これは
どういう風に動いているんでしょう?
入力されたデータを処理し、予め用意した商品リストと照合・検索して、結果をメール送信する
わけなので、最低でも処理用CGIスクリプトと商品データファイルが必要なところまでは理解
出来るのですが、仕組みがイマイチわかりません。
スクリプト名等で検索しましたが全くHITしないし、こういうシステムは商用&有償なのは想像が
つきます。私自身はこれで商売をしようという気持ちはなく、自分のCGIの勉強の教材にしたいと
考えているので、以上のシステムに心当たりがある方、または「こういう風にスクリプトを組んで
いるんじゃないか?」という風に教えてくださる方、どうかご助力ください。
よろしくお願いします。
>>387 アルゴリズムに関する質問はスレ違いじゃないみたいよ。
最終的にはコーディングを目標にしてるみたいだからいいじゃん。
>>385 リンク元は見てないけど、結果を表示しつつsendmailでメールを送ればよろしい。
難しいことじゃないよ。
389 :
nobodyさん :03/05/25 17:30 ID:LMu0ezCc
if($_ =~ /filename\=.+?\.(.+)?\n/i || $_ =~ /name\=.+?\.(.+)?\n/i){ } こういうif文を書くと、1番目と2番目の(.+)はそれぞれ$1、$2と なるのでしょうか。 それとも両方とも$1となるのでしょうか。 すみませんが教えていただければ幸いです。
>389 なぜ試さない?
391 :
389 :03/05/25 17:53 ID:???
>>390 あぁ?知らねぇよ。お前アタシが敬語使ってんだから敬語使えよ。
バカじゃねぇの?つかお前書き込むなよ。キモい。
>>383 >>384 の言うとおり、dieを使うとその時点でスクリプトが終っちゃう。
手元のリファレンスによると、孫ディレクトリは子ディレクトリが無いと作れないみたい。
どうしてもやりたい場合は、File::Pathモジュール使うとよい、とあった。
>>390 そこに試す環境がなかったので、質問させていただきました。
友達に聞かれて答えられなかったので。
会社にに戻って試してみましたので、すみませんでした。
おっしゃるとおりです。
ちなみに。
>>391 は偽者ですので。
この書き込みも、会社から書き込めないことから、友達の家
より代理書き込みしてもらってるので、IDでわかるかと思います。
394 :
385 :03/05/25 18:48 ID:???
>>386 &
>>388 レスどうもありがとうございます。
>>386 >検索スクリプトの結果をブラウザに返す替りにメール本文にする
ああ、なるほど!そうすればいいのか。仰るとおり、難しく考えすぎていました。
>>388 こちらも、ヒントありがとうございます。上に書いたとおり、難しく考えすぎていたので
胸のつかえが取れたような気分です。助かりました。
お二方のレスを参考に、検索+sendmailのスクリプトを探して、組み込み改造など
頑張ってみたいと思います。本当に、どうもありがとうございましたm(_ _)m
395 :
381 :03/05/25 22:28 ID:???
K0NTタンのCGIはグローバル変数を使いまくって そして使わなくなったものを undef していないから メモリを大量に使ってしまうのですか?
>>396 変数のスコープを抜けたら、OSにメモリを返すとでも言いたいのか?
398 :
nobodyさん :03/05/26 00:24 ID:6A9UvBAu
<FORM ENCTYPE=multipart/form-data> <INPUT TYPE=FILE NAME=file> のファイル本体部分を取り出すのに $buf =~ /(\r\n)$1(.+)\1-{10,}/; $date = $2; と書いてバッチシいくでしょうか? $buf =~ /Content-.+(\r\n)$1(.+)\1-{10,}/; 上はどうでしょう? ご意見おながいします。
399 :
398 :03/05/26 00:27 ID:???
間違えました 誤 \1 正 $1 です。
>>398 CGIモジュール使えよ。
CGI_Liteでもいいけどさ。
そんなくだらないことで悩まなくてすむようになるんだから。
401 :
398 :03/05/26 00:39 ID:???
知りませんですた。 ググってきます。
402 :
398 :03/05/26 01:20 ID:???
>>400 CGI.pm がこんなに素敵なヤツだったなんて
正直、感動しますた。
ありがd
403 :
398 :03/05/26 01:27 ID:???
404 :
398 :03/05/26 01:43 ID:???
もっと質問でつ。 use CGI; $query = new CGI; と書いたときモジュールが使えなかったらエラーになりますか? それとも if($query){} と、できますか? どうなんでしょう?
>>404 自分の環境で実際に動かしてみればわかるだろ
use CGI;
の時点でエラーが出る。
今時CGI.pmが入ってないなんてことは無いか 俺も相当アフォだな、、、逝ってこよう。
>>403 evalを使うのにそういう書き方自体が無駄
408 :
380 :03/05/26 04:00 ID:tTZ2AIlQ
linuxサーバ上でSJISファイルを読み取って chompを実行させても\r\nを改行と見なしてくれないのですが、 読み取られファイルをEUCにするのとchompの代わりに↓ $data =~ s/\r\n//g; $data =~ s/\r//g; $data =~ s/\n//g; を使う。という方法以外で一般的な方法というのは無いのでしょうか?
あらっ? 名前入力してしまいましたが380は間違えです。
410 :
_ :03/05/26 04:16 ID:???
>>408 改行コードと文字コードは別物だぞ。
文字コードは、SJIS。 改行コードは、LFにすれば問題解決。
>>408 $dataつーのが、最後に改行が有るものと仮定するとして・・・
$data =~ tr/\x0d\x0a//d;
が高速。
413 :
nobodyさん :03/05/26 06:37 ID:qholo4T7
ユーザごとにリストボックスの項目数を変えるよな ことを考えてるのですがこれって実現可能ですか。 リストで表示させる項目を一つの変数の中にまとめて "a","b","c"と書いても実行するとリストは"a","b","c"と 繋がって表示されてしまい1項目しかでなかったものでして。 ある人は10個項目でててある人は5項目でてるような ことがしたいのです。
>>413 言ってる意味がよーわからんので推測でだが、出来る。
ユーザごとに指定した数を指定しておいて、配列をその数だけ
回すなりなんなりでいいんじゃん?
>>114 添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが
>>119 $?
レス番号激しく間違えた…スマソ
>>414 添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが
>>419 $?
>406 未だにPerl4の鯖だってあるんだよ。
420 :
nobodyさん :03/05/26 11:01 ID:X5HT6fof
@orgmaster= ("orgid","countryid","orgname"); $orgid = $line{'orgid'}; $countryid = $line{'orgname_ja'}; $orgname = $line{'orgname'}; っていうのを、後ろの3行をベタにこういう風↑に書かないで、 foreach $value (@orgmaster) { ★ここが不明★ = $line{$value}; } というようにまわしたいのですが、 ★ここが不明★の部分がわかりません。どうすればいいのでしょうか?
421 :
bloom :03/05/26 11:08 ID:gUjk1KcM
423 :
420 :03/05/26 11:42 ID:???
>>422 がってんわかりました。ありがとうございます。
$ORG{'person'}[1]、$ORG{'adana'}[1]、$ORG{'adanaid'}[1] $ORG{'person'}[2]、$ORG{'adana'}[2]、$ORG{'adanaid'}[2] $ORG{'person'}[3]、$ORG{'adana'}[3]、$ORG{'adanaid'}[3] $ORG{'person'}[4]、$ORG{'adana'}[4]、$ORG{'adanaid'}[4] $ORG{'person'}[5]、$ORG{'adana'}[5]、$ORG{'adanaid'}[5] という変数があるのですが、これを、 $ORG{'adanaid'}[n]の値でソートして、例えば、 $ORG{'person'}[2]、$ORG{'adana'}[2]、$ORG{'adanaid'}[2] $ORG{'person'}[5]、$ORG{'adana'}[5]、$ORG{'adanaid'}[5] $ORG{'person'}[4]、$ORG{'adana'}[4]、$ORG{'adanaid'}[4] $ORG{'person'}[3]、$ORG{'adana'}[3]、$ORG{'adanaid'}[3] $ORG{'person'}[1]、$ORG{'adana'}[1]、$ORG{'adanaid'}[1] みたいに表示さすにはどうすればいいのでしょうか?
425 :
408 :03/05/26 13:58 ID:???
>>411 そーだったんですか・・・知らなかった(-_-;)
>>412 それ使わせてもらいます。
どうもありがとうございました。
Perlのgrepって、小文字大文字の区別をなくすオプションってないんでしょうか?
427 :
426 :03/05/26 14:23 ID:???
すいません、ありましたね。iオプションで。 手元のリファレンスには何にもかいてなかったもんで
428 :
nobodyさん :03/05/26 15:09 ID:ave5j164
>>428 どちらでも好みの方を。
速度が速い方が良いなら、100回くらいループさせてベンチ取ればいい。
431 :
424 :03/05/26 17:42 ID:???
>>430 たぶん、おっしゃってるのは、そのページの一番最後の
sub reverse { $b cmp $a; }
@harry = ('dog','cat','x','Cain','Abel');
@george = ('gone','chased','yz','Punished','Axed');
print sort @harry;
# 出力は AbelCaincatdogx
print sort reverse @harry;
# 出力は xdogcatCainAbel
print sort @george, 'to', @harry;
# 出力は AbelAxedCainPunishedcatchaseddoggonetoxyz
を参考にできるということなのだと思うのですが、
print sort @george, 'to', @harry; の意味がわかりません。
sort LIST, 'to', LISTなんて書式の意味も、書いてないし。。。
この書式で探したのですが、わかりませんでした。。。
どういうことなのでしょうか?
432 :
356 :03/05/26 20:54 ID:???
>>431 > print sort @george, 'to', @harry; の意味がわかりません。
結果からして、
print sort((@george,'to',@harry));
なんぢゃないかなと逝ってみる震度6弱。
433 :
nobodyさん :03/05/26 21:08 ID:haPyfOxB
&ReadParse(*in); $n_pass = "$in{'password'}"; # パスワード $pass = '0123'; if($pass eq $n_pass) こうするとできるのに、 # パスワード $pass = '0123'; if($pass eq $in{'password'}") こうすると、すべてパスワードが違うとでます。フォームから渡せてないんでしょうか?
434 :
nobodyさん :03/05/26 21:09 ID:haPyfOxB
if($pass eq $in{'password'}") ↓ if($pass eq $in{'password'}) です。
435 :
動画直リン :03/05/26 21:10 ID:gUjk1KcM
436 :
431 :03/05/26 21:21 ID:XWjbOab7
>>433 後者でもちゃんと &ReadParse; やってる?
438 :
nobodyさん :03/05/26 22:32 ID:haPyfOxB
>>437 え?&ReadParseって、cgi-libのライブラリのでしょ?
$in{'password'}
こうやったらライブラリいらないんじゃないんですか?
どっちにしてもライブラリはいるんですか?
>>438 なんかねぼけたこと言ってる奴だな……
PerlはCGI専門言語じゃない。
ブラウザのフォームから送られたデータを取得するには、
それ相応のステップをふまなければならない。
なにもしなければ、%inは空のままだ。
当たり前だ。何もしなかったんだから。
顔洗って出直してきなさい。
440 :
nobodyさん :03/05/26 22:48 ID:haPyfOxB
>>439 そんな・・・
方法を教えてください。お願いします
441 :
440 :03/05/26 22:51 ID:haPyfOxB
あまったれてすいません。検索すればいくらでもでてきますね。 要はPOSTの場合 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); で読み取って、splitできりきざんでやればいいんですね。
つうか、&ReadParse使えば?
443 :
440 :03/05/26 23:02 ID:haPyfOxB
>>442 それでもいいんですけど、あんまりライブラリを使うのが好きじゃないんですよ・・・
全部で10行くらいだから中にいれてもいいかな〜って・・
444 :
440 :03/05/26 23:04 ID:haPyfOxB
何回も書き込みすいません。 cgiを使う側の場合、 ・cgiソースは簡潔がいいからライブラリ使う。 ・ソースが多少多くてもいいからライブラリはできるだけさける。 どっちがいいんですかね?
445 :
_ :03/05/26 23:09 ID:???
446 :
bloom :03/05/26 23:10 ID:gUjk1KcM
やっぱり何か寝ぼけてるなぁ・・・
>>444 人によって違うんじゃないかな。何を求めるのかによって。
ここで判断をあおぐようなことじゃないと思う。
449 :
440 :03/05/26 23:33 ID:haPyfOxB
>>448 そうですね。レスサンクス。
realParseだけなんで中に書きます
450 :
nobodyさん :03/05/26 23:36 ID:x8s60k6p
目的によってシステムを構築しなさい その際、じっくりと頭の中でシステムを描きなさい そうすればおのずと答えは出てきます
>>444 マジレスするなら……
俺は開発速度を優先するべき状況にいるので、
ライブラリはとことん利用する立場だ。
Perlの場合はモジュールが便利だ。CPANを見るべし。
ライブラリを使えば、ソース自体を短くすることができ、
短いソースは同時にバグの入る確率が少なくなることを意味する。
副次的にバグの絶対数を下げる効果も期待できる。
(ライブラリにバグが入ってたらどうしようもないが、
自分よりも能力のある人間(作者)を信じて突き進むのみだ)
ま、好きにしろい。
452 :
nobodyさん :03/05/27 00:18 ID:LZ3W66wZ
>>438 いると思う。
自分でフォームデコード書くならいらないけど。
453 :
452 :03/05/27 00:22 ID:LCoN4Nuw
しくった。 漏れは勉強がてら、 ライブラリに頼らず自分でコード書く。
454 :
424 :03/05/27 00:56 ID:tldcRAHy
SORT のマニュアルを読んでやってみたのですが、どうもうまくいきません。 $ORG{'person'}[1]="tanaka"; $ORG{'adana'}[1]="tanachan"; $ORG{'adanaid'}[1]=5; $ORG{'person'}[2]="takada"; $ORG{'adana'}[2]="takachan"; $ORG{'adanaid'}[2]=2; $ORG{'person'}[3]="imai"; $ORG{'adana'}[3]="imachan"; $ORG{'adanaid'}[3]=3; $ORG{'person'}[4]="takenaka"; $ORG{'adana'}[4]="takechan"; $ORG{'adanaid'}[4]=1; $ORG{'person'}[5]="hirano"; $ORG{'adana'}[5]="hirachan"; $ORG{'adanaid'}[5]=4; で、 foreach ($key {sort { $ORG{'adanaid'}[$a] <=> $ORG{'adanaid'}[$b] } @ORG{'adanaid'}){ print qq|\$ORG{'person'} = $ORG{'person'} , \$ORG{'adana'} = $ORG{'adana'}, \$ORG{'adanaid'} = $ORG{'adanaid'}<br>|; } としたら、 compilation errors.になってしまいます。 思うに、@ORG{'adanaid'}があやしいのかとも思うのですが、 ただしい記法はどうすればいいのでしょうか? ($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5]) という意味の配列を表したつもりなのですが・・・
455 :
動画直リン :03/05/27 01:10 ID:77ADrmTJ
457 :
454 :03/05/27 01:28 ID:tldcRAHy
>>456 あー、それですねー。実は前に読んでちんぷんかんぷんで、
そのままにしてました。。。
しかし、今読んでもちんぷんかんぷん。。。
(わからない用語ばかりで、用語を調べるとよけいにわからなくなる(泣))
もしよかったら、恐縮がですが、
($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5])
を配列として表す方法を教えていただけませんjか?
そしたら、演繹的に勉強していきますので・・・。
>>454 データ形式を見直したほうがいいのでは……
それと、$ORG{}[0]の要素が未定義じゃマズいでしょ。それもソートの対象になるんだから。
459 :
454 :03/05/27 01:59 ID:tldcRAHy
>>458 あ、ほんとですね。。。ありがとうございます。
>>457 こういうのは実際に最小限のコードをどんどん書いて実際に
走らせながら理解していくのが一番早いし身につくんだが…。
@list = ('a', 'b', 'c');
$list = \@list; # \ で配列 @list のリファレンスを得る
print $list; # "ARRAY(0xbb1350)" ← $list の中身は配列のリファレンス
print @{$list}; # "abc" ← @{} で配列としてデリファレンス
print @$list; # {} を省略した書き方
# [] で無名配列のリファレンスを作成
# @list のように変数名が無いから「無名」
$list = [ 'd', 'e', 'f' ];
print $list; # "ARRAY(0xbb135c)"
print @{$list}; # "def"
%hash = (a => 1, b => 2, c => 3);
print "$_:$hash{$_}/" foreach sort keys %hash;
# "a:1/b:2/c:3/"
%hash = (a => [0..3], b => [4..7], c => [8..11]);
print "$_:$hash{$_}/" foreach sort keys %hash;
# "a:ARRAY(0xbb1350)/b:ARRAY(0xbb1374)/c:ARRAY(0xbb1398)/"
# $hash{'a'} の中身は配列のリファレンス
print @{$hash{'a'}}; # "0123" ← @{} で配列としてデリファレンス
これでもう分かるよな?
461 :
457 :03/05/27 11:13 ID:OknXPD/2
>>460 リファレンスについて、随分わかってきました。
print @{$ORG{'adanaid'}};
で、配列要素一覧が取り出せることもできました。
ただ・・・もう少しおつきあいねがえませんでしょうか?(非常に恐縮です)
同じりくつで、
foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) {
print qq|\$ORG{'person'} = $ORG{'person'} , \$ORG{'adana'} = $ORG{'adana'}, \$ORG{'adanaid'} = $ORG{'adanaid'}<br>|;
}
とやったのですが、コンパイルエラーになってしまいます。
print @{$ORG{'adanaid'}}[1]は動くから、そのまま1を$aと$bに変えればいいかと思ったのですが・・・
462 :
_ :03/05/27 11:24 ID:???
>>461 次はsortの動きについて勉強しようね。
誰か、心優しい人はどぞ。↓
>>461 まず「コンパイルエラー」みたいな曖昧なエラー名はやめよう。
必ず表示されたエラーメッセージを正確に書くこと。
そのソース、実行してみたけど syntax error at hoge.pl line 7, near "})" とか、
あまりに初歩的なミスをやってる。foreach の使い方もヘン。
データの管理法も、あまりソートとかに向いてない形式だから変えたほうがいいと
個人的には思う。
漏れも試行錯誤してみたが、データを一度結合してからソートして、ループ内で
また分割するという非効率な方法しか思いつかなかった。
465 :
461 :03/05/27 13:03 ID:???
>>464 KCatch.pmを使っていたのですが、
コンパイルエラーとしかいってくれなかったので、そういうもんだと思ってました。。。
すみません。
別のものに変えてみようかしら
>>465 kcatchってそういうもんなの?
CGI::Carpを使ってみては。(使い方はぐぐってね)
もっとも、コマンドラインで実行させるのが一番手っ取り早いんだけど。
「ぐぐって」とは?
469 :
465 :03/05/27 13:20 ID:???
>>466 use CGI::Carp qw(fatalsToBrowser);
したら、
「Software error:
Execution of test.cgi aborted due to compilation errors.
For help, please send mail(以下略)」と・・・
なんでだろう
ソース晒せ
471 :
465 :03/05/27 13:51 ID:???
>>470 foreachの部分をコメントアウトすると、正常です。
入れると、「コンパイルエラー」だそうです。
------------------------------------------------------------
$ORG{'person'}[1]="tanaka";$ORG{'adana'}[1]="tanachan";$ORG{'adanaid'}[1]=5;
$ORG{'person'}[2]="takada";$ORG{'adana'}[2]="takachan";$ORG{'adanaid'}[2]=2;
$ORG{'person'}[3]="imai"; $ORG{'adana'}[3]="imachan";$ORG{'adanaid'}[3]=3;
$ORG{'person'}[4]="takenaka"; $ORG{'adana'}[4]="takechan";$ORG{'adanaid'}[4]=1;
$ORG{'person'}[5]="hirano";$ORG{'adana'}[5]="hirachan";$ORG{'adanaid'}[5]=4;
#print @{$ORG{'adanaid'}}[1];
print @{$ORG{'adanaid'}};
foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) {
print qq|\$ORG{'person'}[\$key] = $ORG{'person'}[$key] , \$ORG{'adana'}[\$key] = $ORG{'adana'}[$key], \$ORG{'adanaid'}[\$key] = $ORG{'adanaid'}[$key]<br>|;
}
Software error:
syntax error at test.pl line 11, near "}) "
syntax error at test.pl line 13, near "}"
Missing right curly or square bracket at test.pl line 13, at end of line
Execution of test.pl aborted due to compilation errors.
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
うちでやったらこう出たが……(Win2000+ActivePerl5.6.1)
本当に
>>469 しか出なかったの?
っていうか、あなたの実行環境ってどんなん?
473 :
463 :03/05/27 14:22 ID:???
>>471 ・・・汚ねぇソース・・・
$ORG[0] = {
"person" => "tanaka",
"adana" => "tanachan",
"adanaid" => 5,
};
$ORG[1] = {
"person" => "takada",
"adana" => "takachan",
"adanaid" => 2,
};
$ORG[2] = {
"person" => "imai",
"adana" => "imachan",
"adanaid" => 3,
};
$ORG[3] = {
"person" => "takenaka",
"adana" => "takechan",
"adanaid" => 1,
};
つづく
474 :
463 :03/05/27 14:22 ID:???
$ORG[4] = { "person" => "hirano", "adana" => "hirachan", "adanaid" => 4, }; @tmp = sort { (${ORG[$a]->{adanaid}} <=> ${ORG[$b]->{adanaid}}) } 0 .. $#ORG; foreach (@tmp) { print 'person='. $ORG[$_]->{person}. "\n"; print 'adana='. $ORG[$_]->{adana}. "\n"; print 'adanaid='. $ORG[$_]->{adanaid}. "\n"; } exit(0); こんな実行結果がお望みですか。 タブは見やすいように全角スペース
475 :
nobodyさん :03/05/27 14:22 ID:Z3njAYJb
>foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) { @{$ORG{'adanaid'}) いっこ括弧閉じが足り無くない?
477 :
_ :03/05/27 14:33 ID:???
478 :
nobodyさん :03/05/27 17:02 ID:Ahi5sL61
スミマセン、質問です Jcodeモジュールの使えないサーバーで Unicode(UTF-8) -> Shift JISの変換を行いたいのですが どうすればよいでしょうか?
>>478 実はPerl5.8の鯖で、Encodeモジュールが入ってるとか。
481 :
478 :03/05/27 18:36 ID:???
>>479 ,480
レスありがとうございます!
CJKVConv.pl ググってみます。
ちなみに、Perlのバージョンは5.00503です
482 :
名前はまだ無い :03/05/27 19:39 ID:0dveLtbZ
初歩的な質問で恐縮なのですが、PERLのCGIで空ファイルを作るときは open(a,">b"); close(a); なんかで出来ましたよね。 空フォルダを作りたい場合はどのようにすれば良いのでしょうか? 上の">b"を">c/b"などにしても作ることが出来ませんでした。 どなたかお答えを願います。
mkdir
ありがとうございます
485 :
469 :03/05/27 20:33 ID:CEAVaVCK
>>472 2つのサーバで試したんですけど、syntax error at とかいってくれないですねー。
両方ともFreeBSDなんですけど、関係ないですよねー・・・
486 :
471 :03/05/27 20:35 ID:???
>>473-474 さんありがとうございます。
なるほどーーーです。
変数の一元目にソートするものを持ってくるわけですね。
アルゴリズム考えるのに、foreachのところばかりにとらわれてました。
もっと全体的視点からアルゴリズムを考えないとだめですね。
ありがとうございます。コード参考にさせていただきます。
487 :
動画直リン :03/05/27 21:10 ID:77ADrmTJ
>>485 ちょっと呆れた。
鯖で実験すんなよ。
他人の物で無限ループとかのひどいバグがあるかも知れないプログラムを走らせようとするな。
そういうのは、ローカルでしっかりチェックしてから鯖にあげるもんだ。
まずローカルにPerlをインストールすること。(WinならActivePerl)
スクリプトのバグがあるかどうかのチェックは、
1.MS-DOSプロンプトを開き、
2.スクリプトのあるディレクトリまで移動し、
3."perl スクリプト名"と入力する。
CGIを実行しようとすると、うまく行けばHTMLが吐き出されるはずだし、
バグがあればエラーメッセージが出て止まる。
自分の尻拭いは自分でできるようになろう。
16777215(\xFFFFFF)以上の文字を $num = sprintf("%X", 116777215); のようにして16進数に直そうとすると、全て\xFFFFFFになってしまいます。 どうしたらいいでしょうか?
490 :
nobodyさん :03/05/28 00:45 ID:d/eWTjVe
@array = qw( apple orange banana angle tv home ・・・・・・・ ); のようになっている配列に対して、anにマッチする要素の インデックス番号(上の例なら 1, 2, 3 ・・・)を得たいのですが ループを回さずに綺麗にできる方法はないでしょうか?
>>490 my $count;
my %temp = map { $_, $count ++ } @array;
@result = @temp{grep { /an/ } @array};
こんな感じかなー。インクリメントのあたりが怪しいけど。
>>491 難しく考え過ぎ。
@array = qw( apple orange banana angle tv home );
@result = grep $array[$_] =~ /an/, 0..$#array;
>>489 $number = 16777215(\xFFFFFF)以上の文字;
$num = sprintf(qq{%04X%04X},int($number/0x10000),$number%0x10000);
みたいな。
494 :
490 :03/05/28 01:43 ID:???
>>490-491 ひたすらgrepかmapを眺めていて、どちらかでできそうだと
思っていたのですが、全く思いつきませんでした。
まだまだ修行不足でした。ありがとうございました。
他のサーバーにあるファイルをhttpで読み込みたいんですけど、 それを解説してるページってあります? ぐぐっても見つかんなかった。
フォームから受け取った値から、下記の記号を取り除こうとすると、 if($name eq "ほげ"){ if($value =~ tr/;<>*|`/&$!#{}:;'"$//){ $error[n] = "エラーだぴょん"; $errorh = "1"; } } カタカナなんかもエラーの対象になってしまうのであります。 なんでなの?
日本語も混じってるテキストファイル(EUC-JP)からハッシュ値 だけ抜き出したいんですけどうまく抜き出せません。他にもゴミ がついてきます。 #!/usr/bin/perl while(<STDIN>){ if(/\b[a-z|0-9]{32}\b/){ print; } } どうしたらいいですか?
>>496 あまりに問題外すぎます・・・。
もう少し勉強した方が・・・。
>>499 どんなファイルフォーマット?
フォーマットめちゃくちゃでも抜き出せるように したいんですけど無理ですかね。。?もちろん、 空白か行頭、行末にはさまれてはいます。
>>501 たとえば、こんな状態で・・・って数行晒してくれない?
ハッシュ値って、どんな値なのかさっぱり。
>>502 そうですよね。すみません
おらおらおらおら無駄無駄無駄無駄 by じょうたろう
vizelj f6c08af464e2db2d05988c121db29156
こんな感じです。ハッシュ値ってのは最後の英数字の
羅列です。アルファベットの小文字または数字で構成
されていて長さは32文字固定です。
>>493 目から鱗が落ちました。ありがとうございました。
パターンマッチした部分だけが必要なら $& とか $1 とか使う。 if(/\b([0-9a-z]{32})\b/){ print $1; }
oepn(FA,">file"); close(FA); のように、新規ファイルを作成すると パーミッションが 0644 になってしまうので chmod(0777,"file"); のように0777に変えてやってるんですが、うまくいきません。(パーミッション変更出来ない) サーバによっては上手く行くので、原因はサーバ側の設定でしょうか? もしそうであれば管理者に相談しようと思うのですが、 それ以外で解決策ありますでしょうか? やりたい事としては ・新規ファイル、ディレクトリを作成→パーミッションを777にしたい です。
>>506 ファイルは忘れた(なんかあったと思う)
ディレクトリなら、
mkdir "dirname",777;
とかでいけたはず。
画像のアップローダーを作っててサイズ制限の機能をつけてるんですが、 現状標準入力から受け取って、ファイルとテキストを切り分けて、ファイルのサイズを取得して サイズが大きいと蹴ってるのですが、 これだとサーバーに送信された後の処理なので、送信される前になんらか手を打てないしょうか?
ファイルを777にする必要ってないだろう。 鯖によっては777を禁止してるとこもあるかもしれないな。 755にも変更できないのか?
>>508 うろ覚えで悪いが、送信時にいけなかったっけか?
<input type=hidden name=MAX_FILE_SIZE value="500000">
たしかこんな感じで。
valueに最大ファイルサイズを入れればいいと思う。
ただ、うろ覚えなので確認は自分で。
511 :
508 :03/05/28 14:02 ID:???
>>510 なるほど、フォームでやれるわけですね、
ちょっと調べてみますサンクスコ
>506 umaskとか。
>>511 調べるとPHPだとそのタグでいけるようですが、
Perlでは見当たりませんでした
試してみてもやっぱりダメでした
ぬぬ
>>513 そうか、PHPだけか…すまんかった。
じゃあちょっと手抜きだが、これでは駄目?
if($ENV{CONTENT_LENGTH} < $max_filesize) {
ファイルがでかかった時の処理
exit;
}
これだとpostされたデータ全体になるので、厳密な画像サイズだけでは無いけど
まあ、大体で制限できるかと。
515 :
514 :03/05/28 15:09 ID:???
悪い、逆だった。 ×if($ENV{CONTENT_LENGTH} < $max_filesize) { ○if($ENV{CONTENT_LENGTH} > $max_filesize) {
516 :
513 :03/05/28 15:22 ID:???
>>514-515 その処理にしようかとも迷ったんですが
同じcgiで画像の添付数やテキストの入力量にかなりバラつきがあるので
やめました
もうちっと試行錯誤してみます。
$text = qr/abc/; print $text; ってすると qr の仕様らしくて、$text の中に特殊な意味を持つ文字列が入るんですが、 これを取り除く、または取り除いたデータを参照できる方法はないですか? 二重 foreach の中で正規表現は効率悪い、というのをラクダ本で見たので やってみたのですが、$text そのものを表示して使いたいため これがネックで困ってます…。 ラクダ本、何か宇宙語のようで読むのが大変ですw
518 :
山崎渉 :03/05/28 17:03 ID:???
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
↑アク禁にしてくれ。困る。
522 :
nobodyさん :03/05/28 19:24 ID:uwixhF+z
文章の1行目から3行目までを指定して 改行を取り除きたいのですが、 どのようにすればいいのでしょうか? 改行を取り除くのは $body =~ s/\n//g; これでできるのですが、 $bodyの中の1行目から3行目までだけの 改行を取り除きたいと思っています。
>>522 @bodys = split (/\n/, $body);
chomp ($body[0], $body[1], $body[2]);
いくら初心者のためのスレだと言っても、
最低基礎くらい覚えてこい!
524 :
523 :03/05/28 19:51 ID:???
@bodys = split (/\n/, $body); @head = splice (@bodys, 0, 3); $body = join ("\n", @bodys); スマン、俺も、ちゃんと勉強しておく。。。
525 :
nobodyさん :03/05/28 20:15 ID:+jnsOx/q
>>523 はぁ?じゃマジ初心者はどこいったらいいのよ?
お前スレタイ読んで出直してこいや(w
526 :
525 :03/05/28 20:16 ID:???
すまねぇ・・・ちゃんと過去ログ読むわ・・・
527 :
nobodyさん :03/05/28 20:29 ID:uwixhF+z
>>523 ありがとう。
でも配列使えないんですよ。
ポインタみたいな物使ってるので。
$body_item->{'body'}
これの中身の最初の\nから3つ目の\nまで消したいんです。
528 :
nobodyさん :03/05/28 20:31 ID:uwixhF+z
あとstrict使っているのでグローバル変数は使えないんです。
529 :
_ :03/05/28 20:32 ID:???
ヨクワカランケド for($i=0; $i<3; $i++){ $body_item->{'body'}[$i] =~ s/\n//g; }
532 :
nobodyさん :03/05/28 20:44 ID:uwixhF+z
>>530 >531
ありがとう
use vars
for($i=0; $i<3; $i++){
$body_item->{'body'}[$i] =~ s/\n//g;
}
Unrecognized character \x81 at user_lib/xxxx/xxx.pm line 198.
というエラーが出ます。
しるかぼけ! 198行目がなんなのかもわからんのに
534 :
nobodyさん :03/05/28 20:49 ID:uwixhF+z
use vars @body_item->{'body'} = split (/\n/, $body_item->{'body'}); @head = splice (@body_item->{'body'}, 0, 3); $body_item->{'body'} = join ("\n", @body_item->{'body'}); これだと Global symbol "@body_item" requires explicit package name at user_lub/xxx/xxx.pm line 196 このようなエラーが出ます。
\x81 。。。。
536 :
nobodyさん :03/05/28 20:54 ID:uwixhF+z
ただ先頭から3つの\nを取り除くだけも結構大変ですね。
>>534 馬鹿なのか回答者をおちょくっているのか・・・
538 :
nobodyさん :03/05/28 20:58 ID:C2cSB0SK
539 :
nobodyさん :03/05/28 20:58 ID:uwixhF+z
>>537 全然おちょくってないです。
本当に困ってるんですよ。
540 :
nobodyさん :03/05/28 21:00 ID:uwixhF+z
何か他に案はないでしょうか?
541 :
nobodyさん :03/05/28 21:01 ID:uwixhF+z
substr使っても駄目だったし本当にどうすればいいんだろう・・・
>>539 use vars ここにグローバル変数にしたい変数を羅列;
use vars qw($a @b %c);という感じで。
543 :
動画直リン :03/05/28 21:10 ID:52+C0e9R
544 :
nobodyさん :03/05/28 21:12 ID:uwixhF+z
>>542 ありがとう
use vars qw(@body_item->{'body'},@head);
@body_item->{'body'} = split (/\n/, $body_item->{'body'});
@head = splice (@body_item->{'body'}, 0, 3);
$body_item->{'body'} = join ("\n", @body_item->{'body'});
これだと
@body_item->{'body'},@head' is not a valid variable name under strict vars at user_lub/xxxx/xxx.pm line 196
こういうエラーが出ます。
545 :
523 :03/05/28 21:15 ID:???
うわー。名前消し忘れてるし〜。
>use vars qw(@body_item->{'body'},@head); カンマ区切りじゃなくて、半角スペース区切りだろ
>>544 @head = splice (@{$body_item->{'body'}}, 0, 3);
549 :
nobodyさん :03/05/28 21:18 ID:uwixhF+z
>>547 半角スペースでも試しましたが駄目でした。
use vars qw(@body_item @head); @{$body_item->{'body'}} = split (/\n/, @{$body_item->{'body'}}); @head = splice (@{$body_item->{'body'}}, 0, 3); $body_item->{'body'} = join ("\n", @{$body_item->{'body'}}); いっぱい間違ってないかい?
use vars qw(@body_item @head);だと思うんだが。
552 :
550 :03/05/28 21:22 ID:???
あ、最後の行 $body_item->{'body'} = join ("\n", @{$body_item->{'body'}}); ↓ @{$body_item->{'body'} = join ("\n", @{$body_item->{'body}}); 変更。
553 :
nobodyさん :03/05/28 21:22 ID:uwixhF+z
>>548 ありがとう
これだと
use vars qw(@body_item->{'body'} @head);
@body_item->{'body'} = split (/\n/, $body_item->{'body'});
@head = splice (@{$body_item->{'body'}}, 0, 3);
$body_item->{'body'} = join ("\n", @body_item->{'body'});
こういうエラーが出ます。
Type of arg 1 to splice must be array (not hash element) at user_lub/xxxx/xxx.pm line 199, near "3)"
554 :
550 :03/05/28 21:23 ID:???
>>522 1行目から3行目までを取り込み、全ての改行コードを削除してから残りの行を付け加えるのでは駄目なのか?
556 :
550 :03/05/28 21:24 ID:???
>>555 俺も最初に思ったが、どしてもスカラー変数から改行を取り除きたいらしい。
>>556 そうか(^_^;)
で、配列も使いたくないらしいから、split+joinもだめなのね。
558 :
nobodyさん :03/05/28 21:26 ID:uwixhF+z
>>551 それだと
Bad name after body' at user_lub/xxxx/xxx.pm line 209.
というエラーが出ます。
559 :
550 :03/05/28 21:27 ID:???
>>557 いや、厳密には配列に入ってるんだよ。
それが、リファレンスで入ってるんで、ちょっと扱いがわかってないっぽい。
要領は同じなんだけどね〜・・・
って、雑談ぽくなってきたので、これにて。
560 :
550 :03/05/28 21:28 ID:???
>>558 もういい・・・。
すべてのソースを晒せ。
561 :
nobodyさん :03/05/28 21:28 ID:uwixhF+z
>>552 こうすると
'@body_item->{'body'}' is not a valid variable name under strict vars at user_lub/xxxx/xxx.pm line 196
このようなエラーが出ます。
>>561 それ、ちゃんと変更できてない。
ソース晒せって。全部。
圧縮して、アプローダ。
563 :
nobodyさん :03/05/28 21:30 ID:uwixhF+z
>>555 それは出来ないんですよ。ソースが膨大でDatabase使ってますから。
>>563 掲示板で教えるのは限界がある。
・・・とにかく、@body_item->{'body'}ってのを、@{$body_item->{'body'}} へ、ちゃんと変更する。
全部。
>>563 って言うか、そのエラー出てるモジュールだけを晒してくれれば早い。
566 :
nobodyさん :03/05/28 21:38 ID:uwixhF+z
>>565 pakage使ってますから横の繋がりもあるんですよ。
>>566 それでもいいから。
エラーは、そのモジュール局部的な物と見てる。
それとも、晒せないソースなのか?
今のペースだと、スレ1つ消化するくらい説明のやり取りが必要になるぞ。
at user_lub/xxxx/xxx.pm line 196 だったら、196行目だけ晒せばいいだろ!
>>563 に違和感を覚える。
ソースって読み込み元のことか?
570 :
nobodyさん :03/05/28 21:41 ID:uwixhF+z
>>567 分かりました。
もうちょっとやって駄目ならそこの部分のソースを2chアップローダに
上げます。
>>568 196行目のエラーが無くなったら、別の行でエラーが出る罠。
572 :
nobodyさん :03/05/28 21:43 ID:uwixhF+z
>>568 196行目は
my $body;
です。
>>572 (T-T)(T-T)(T-T)(T-T)(T-T)(T-T)
$str =~ s/^(.*?)\n(.*?)\n(.*?)\n/$1$2$3/;
>>517 $text = 'abc';
$regex = qr/$text/;
これでいいだろ?
んで、表示する時は$text使えばいいんじゃねーか。
Perl、何か宇宙語のようで読むのが大変ですw
578 :
nobodyさん :03/05/28 22:09 ID:uwixhF+z
>>574 完璧です。
それで完璧に出来ました。
ありがとうございます。
579 :
nobodyさん :03/05/28 22:16 ID:uwixhF+z
>>574 どこでそのような方法を勉強したのでしょうか?
perlのリファレンス見てもそのような表現方法は載ってなかったので
どうやって勉強したのか気になります。
>>579 処理のアルゴリズム。
勉強したけりゃ、人が書いたソース読め。
581 :
nobodyさん :03/05/28 22:23 ID:uwixhF+z
>>580 そうですか。
人のソースで勉強したのですか。
人の書いたソースでも、あの表現方法を理解するのは
私には難解です。
まだまだ勉強が足りないですね。
582 :
nobodyさん :03/05/28 22:27 ID:uwixhF+z
$str =~ s/^(.*?)\n(.*?)\n(.*?)\n/$1$2$3/; ちなみにこれについて教えていただきたいのですが、 $1$2$3というのは変数だと思いますが、strict内で変数宣言しなくても エラーが出ませんでした。どうしてなのでしょうか? 普通は my $1;などと変数宣言しないといけないはずですが。
てゆーか、正規表現知らずにPerlやってるのが信じられんのだが
「〜はずですが」←これが多いねぇ〜
586 :
nobodyさん :03/05/28 22:47 ID:uwixhF+z
>>583 特殊変数だったのですね。
$n
最後に一致した正規表現内の()グループに相当する部分文字列が設定されるのですね。
正規表現を勉強しないといけませんね。
587 :
nobodyさん :03/05/28 22:58 ID:uwixhF+z
何はともあれ、ありがとうございました。
教科書に載っている以上のことができないっつーのも、なんかアレだな。 これもゆとり教育の弊害か。
つーか正規表現載ってないperlのリファレンスってなんだ?
いきなりレスが増えたから荒されたのかと思ったよ。山崎 こんな香具師、いつもならスルーなのに今日はどうした?
$body =~ s/\n//; $body =~ s/\n//; $body =~ s/\n//; 完璧だ!
592 :
nobodyさん :03/05/29 00:08 ID:NXYitVzp
バカは放置しないと直らない 構うなよバカを
593 :
nobodyさん :03/05/29 00:23 ID:QV3HKWce
バカのお祭りみたい
>>574 >>578 くそぉぉ!!
祭りに乗り遅れた!!
面白そうな祭りしてたんだな・・・
しっかし・・・ひどいな(w
596 :
nobodyさん :03/05/29 10:45 ID:m7OaXWdv
だって初心者スレだもん
597 :
nobodyさん :03/05/29 10:56 ID:OM7vlSMS
1,UENO 2,SIBUYA 3,SHINJYUKU という3行のCSVファイル「house.csv」があって、 それをHTML::Templateモジュール の<TMPL_LOOP>を使って表示させたいのですが、 いかんせん、リファレンスのことが理解できず(通算15時間以上読んでいるのですが(泣))、 やり方がわかりません。どのようにすればいいのでしょうか? open(IN, "< house.csv"); while ($line = <IN>){ chomp $line; $values = split(/,/, $line); #不明箇所その1($values[0]、$values[1])をどうすりゃいいか } #-------------------------------------------------------------------- # HTMLテンプレートをオープン my $template = HTML::Template->new(filename => './tmpl/search_result.html'); # パラメータを埋める $template->param(SEARCH_RESULT => [ { id => '1', station => 'UENO' }, { id => '2', station => 'SIBUYA' }, { id => '3', station => 'SHINJYUKU' }, #不明箇所その2 #今は、ここを、直接idとstationを書いているが、これを、 #CSVファイルからもってきた値に変えたい ] ); あと、リファレンスについて、猿でもわかる解説ってないでしょうか・・・?
598 :
bloom :03/05/29 11:10 ID:AQrs4zcG
くだらないことで一日悩んでるくらいなら、らくだ本買いなよ。
>>599 なぜ、ラクダ本を薦めるのかがわからん。
たしかに最強の本だが、ラクダ本で理解するのは難しいだろ。
ある程度分かってからなら、さらに深く理解できると思うけど。
お勧めは、「新Perlの国へようこそ」
俺は、これでリファレンス&オブジェクトを勉強した。
601 :
nobodyさん :03/05/29 12:00 ID:e3PaTXyE
そこまで言い切ってしまうなら、本なんて買わずにそこら辺のサイトで 十分と思われ。 まあ漏れもラクダ本は好きじゃないけど、これくらい買う気にならないと どうせやっても頓挫するよ、くらいの目安にはなると思う。 ちなみに漏れは「初めてのPerl」みたいなタイトルの本買って勉強しますた。
602 :
_ :03/05/29 12:01 ID:???
より高度なスクリプトを書きたい、と思い立つまでは、 入門もリファレンスもネット上で足りるよな。 それでも理解不能な超初心者向けの本というと何だろう。 もはやPerl以前のところから説明してそうだけど。
604 :
597 :03/05/29 12:34 ID:???
>>600 おれが一番読んでいるのは、その「新Perlの国へようこそ」です・・・
やばいのかな、おれって
いや、リファレンス以外はらいたい、その本で理解できたつもりなんですけどね
ソ ー ス 嫁 。
良質なソースキボンヌ
607 :
nobodyさん :03/05/29 14:59 ID:hW1BfWjc
Content-Disposition: attachment; filename=name.xxx;\r\n を使ってダウンロードさせるプログラムがあって、 そいつをNetScape7でダウンロードさせると、ファイル名のケツに.cgiがつくんです。 対処方法はありますか?
608 :
nobodyさん :03/05/29 15:10 ID:f7DLEcKa
perlってペールって読むの? それともパール? どうなのYOー
>>608 pearlを最初使おうとしてたらしいからパールでいいんで無かろうか?
まぁ、俺は駱駝本は欲しいなと思ってはいるけど、
入門段階で本を買ったら覚えれるという発想も安直だと思うのだが如何だろう?
ペールです
ベッケンバウアーです
612 :
nobodyさん :03/05/29 15:51 ID:5xhJzi5f
Activeperlでsslのかかったサイトにアクセスしたいのですがどうすればよいでしょうか? いちおうNet::SSLeayというモジュールが必要ということで ppm install Nea::SSLeay としてやってみたもののうまくできません。 どうすればよいでしょうか? perl初心者ですが申し訳ありません。
perlは ぱるる。urlは うるるだ。
とにかく問題は、潜在的な理解能力には差があるということ。 らくだ本を読めば理解できる人が全てというわけでは無いんだから、少し配慮しよう。
潜在的ってか、やる気の問題だろ。 質問の内容がアホすぎる奴が多い。 いかにも「とりあえず聞いてます」みたいな奴。 ちったあ調べて来い! ってんだ。
>>603 Perl以前っていうか、
Perlの開発者の説明やPerlの元々の意味が載ってた本なら見た事ある
すぐわかるperlが200円で買える。。。でも送料、振込み金 考えるとあんま安くないな...。 あ、簡単なperlの本は読んだんですけど必要ないですかね? 掲示板とか作るところでつまずいたんで買おうと思ってるんですけど。
↑↑↑ あ、スレ違いでした。すいません。
619 :
nobodyさん :03/05/29 23:22 ID:RP1Tv8fK
Socketについて1から詳しく教えてる優良なサイトってありますか? よければ教えて下さい。検索に出なかったもので、、
621 :
sample :03/05/30 02:10 ID:nd3Sm/eF
>>597 my @list;
open(IN, "house.csv");
while (<IN>){
chomp;
my ($id, $station) = split /,/;
my %list;
$list{id} = $id;
$list{station} = $station;
push @list, $%list;
}
my $template = HTML::Template->new(filename => './tmpl/search_result.html');
$template->param(
LIST => \@list
);
search_result.htmlの該当部分例
<TABLE>
<TMPL_LOOP NAME="LIST">
<TR><TD><TMPL_VAR NAME="id"></TD><TD><TMPL_VAR NAME="station"></TD></TR>
</TMPL_LOOP>
</TABLE>
623 :
597 :03/05/30 02:28 ID:???
すいません、 なぜ、 14-16行目は $template->param( LIST => \@list ); 10行目は push @list, $%list;なのでしょうか? つまり、どうして、push @list, \%list でないのでしょうか?
624 :
597 :03/05/30 02:29 ID:???
625 :
_ :03/05/30 02:42 ID:???
626 :
621 :03/05/30 02:50 ID:???
>>623 単純な入力ミスだ、ぐらい判ってくれ。
push @list, \%list;
627 :
直リン :03/05/30 03:10 ID:KvuUHxNV
628 :
nobodyさん :03/05/30 03:11 ID:k5B8Isn5
CGI::Applicationでフォームのパラメータを受け取った時 (key=aaa&key=bbbのように) 同じキーの値が複数ある場合、何で分割されているのでしょうか? CGI.pmは同じキーの場合、配列にして戻ってくるらしいのですが、 見たところ配列でもないし、何で分けられているのかさっぱり分かりません・・。
629 :
623 :03/05/30 03:17 ID:???
630 :
nobodyさん :03/05/30 03:22 ID:/oIAPWL0
どこかのホームページでUDPもconnectできると書いてあるんですが、どうやるんでしょうか? 普通にconnect関数を使えばいいのでしょうか? 調べてみましたがどこにも書いてなかったのでお願いします。
631 :
nobodyさん :03/05/30 11:03 ID:MqvbgP4I
配列にアクセスする時は、 $hoge[0]じゃないといけないのに、@hoge[0]でもOKだったんですけどなぜですかね
632 :
直リン :03/05/30 11:10 ID:KvuUHxNV
633 :
nobodyさん :03/05/30 11:25 ID:wqqbPD7W
色々なスクリプトを参考にPerlを学び始めたのですが↓の意味がわかりません。 $salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); #aska.cgiのある一行です 関数的な意味ではなく文法的な意味が。&&や||がどの部分にかかっているかとかがいまいちわかりません。 分解したり()つけたりどなたか分かりやすく説明していただけないでしょうか。
>>633 $salt = (($logpw =~ /^\$1\$(.*)\$/) && $1) || substr($logpw, 0, 2);
パターンマッチが成功したら→ $salt = $1
失敗したら → $salt = substr($logpw, 0, 2)
違ってたらすまん
>>631 それはね〜。
スライスと言ってね〜
$はスカラー変数として評価されて、
@は配列として評価されるんだよ〜。
たとえばね〜。
配列の要素0と3と6をコピーしたいとするよね〜。
@hoge = ($hage[0], $hoge[3], $hoge[6]);
↑これだと、ちょっと面倒だよね〜。
@hoge = @hage[0, 3, 6];
↑これだと、すっきりして見えるよね。
スライスって便利だね〜。
マジ、本読もうね〜。
636 :
635 :03/05/30 11:45 ID:???
>@hoge = ($hage[0], $hoge[3], $hoge[6]); ここの所、ちょっと変数名間違っちゃったけど、 言いたいこと分かってくれるよね〜?
>>630 >どこかのホームページでUDPもconnectできると書いてあるんですが・・・
へー。どこかのホームページにそんな事書いてたのか〜。
>調べてみましたがどこにも書いてなかったのでお願いします。
へー。どこにも書いてなかったのか〜。
・・・( ´_ゝ`)ヘー
>>634 それで合ってるっぽ。
$salt = ($logpw =~ /^\$1\$(.*)\$/ ? $1 : substr($logpw, 0, 2) );
こう書いた方が、まだ分かりやすい・・・
640 :
630 :03/05/30 14:51 ID:qOosOO5S
>>637 失礼しました。
どこかのホームページではなく、とあるホームページです。
自分なりにconnect関数について調べたのですが、udpを使用しての使い方は載ってませんでしたので…。
>>640 いや、そういう意味じゃなく、
その「どこかのホームページ」に書いてたなら、
その「どこかのホームページ」内に、説明がなかったのかね?って意味。
ちょっと、ひねくった言い方してみた。
643 :
630 :03/05/30 15:11 ID:uU/3TkKV
>>642 まさにそこです。
udpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。
当方の見落としですかね?
644 :
630 :03/05/30 15:12 ID:qOosOO5S
>>641 >>642 >>642 のサイトです。
udpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。
当方の見落としですかね?
645 :
630 :03/05/30 15:13 ID:gys3ZHK8
二重カキコスマソ。
646 :
nobodyさん :03/05/30 15:58 ID:tzfB9BhB
申し訳ありませんが、教えてください。 日記CGIを借りてきて、自分で設定を様々に変更しました。 ローカルのテストで成功しましたので、Web上にアップしましたが、CGIにアクセスしようとしたところ、「500 Internal Server Error」と出てしまいました。 日記のフォルダ内は index.html バックナンバー用フォルダ cgi-binフォルダ┬●●.cgi ├データ保存用フォルダ └HTML生成用テンプレート となっており、それぞれのフォルダのパーミッションは777、●●.cgiのパーミッションは755に設定しました。 Perlのパスは、!/usr/local/bin/perl です。 あまりに初心者の質問で申し訳ありませんが、 1:500 Internal Server Errorとは、どういうエラーなのでしょうか。 2:こういう場合、どこを修正すれば良いのでしょうか。パーミッションが悪いのか、パスが悪いのか、それともアップロードの仕方が悪いのか、もっと他に原因があるのでしょうか。 よろしくお願いします。
648 :
nobodyさん :03/05/30 18:30 ID:axvQjxfE
文字列の行番号を調べる方法はないですか?
>>604 新Perlの国へようこそで十分リファレンスは理解できるぞ?
>>612 モノが足らない。他に3つぐらい必要
>>628 CGI::Applicationは内部でCGI.pmを使ってるから処理は同じ。
>>643 UDPでconnectってのは単に宛先を省略できるようになるだけ。
実際にコネクトしてるわけじゃない。
age
652 :
_ :03/05/30 19:41 ID:???
お聞きします。 連想配列Aと連想配列Bがある場合、AにBをコピーさせたいのですが、 コピーする際にキーの重複を避ける為にBのキーに固定文字を追加して 移動させるにはどのように書けば良いのか教えて下さい。 配列の場合にはそのままpushで簡単だったのですが…
>>653 「固定文字を追加」ってのがちょっと意味不明。解説キボンヌ
655 :
nobodyさん :03/05/30 22:04 ID:v3ScOAWp
%a = ( 1 => "a",2 => "b") を %b = (1_b => "a",2_b => "b") ってことじゃねーの?
The duct tape of the internetってなんすか?
657 :
653 :03/05/30 23:01 ID:???
>>654 すみません。
>>655 の解釈の通りです。
連想配列の解説を読みあさって、自分でも作ってみました。
while (($key, $value) = each(%B)) {
$A{"b_$key"} = $value;
}}
一応、期待通りに動いてはくれているのですが、
もう少しスッキリ書けないものかと思いまして。
これが最善の用法ですかね?
658 :
nobodyさん :03/05/30 23:11 ID:v3ScOAWp
659 :
658 :03/05/30 23:13 ID:v3ScOAWp
aaa.netってほんとにあるのかよ。・。・・ 適当ですのでお気にしないでください。
660 :
nobodyさん :03/05/30 23:38 ID:TYAZIili
>>657 それでできるなら、それでいいんじゃない?
俺なら・・・
while (($key, $value) = each(%B)) {
$key .= '_b';
$A{$key} = $value;
}
こうするけどね。
>>658 あのさ・・・
本当に教えてほしいなら、ちゃんと質問しようよ・・・
何を質問したいのか?って所から考えちゃったよ・・・
HTMLに埋め込んでるSSIで呼び出されたCGIファイルの実行結果と、
CGIファイル直接アクセスされた時の実行結果を変えたいって事でしょ?
SSIで呼び出す時は、GETで情報埋め込んでおいたらどう?
663 :
653 :03/05/31 01:29 ID:???
>>661 なるほど、そっちの方が後で読んだ時にわかりやすいですね。
ありがとうございます。
>>622 すごい。
そこまで端折れるものだったとは。
状況によって、
>>661 さんと
>>662 さんの構文を使い分けていきたいと思います。
ありがとうございました。
664 :
658 :03/05/31 01:30 ID:6mtQ8nNe
>>661 SSIでacslog.cgi?aaa
とかしても意味ないんじゃないですか?
?つけても、execで実行すると.cgiで実行した結果になるんですが・・・・
激しくスレ違い
>>664 ・・・ヘ?
GETで値送って、その値見て処理を変えるんだよ?
直接CGIにアクセスされても、GETで値送らない限り処理変えられると思うが・・・?
とりあえず、
>>665 の言う通りスレ違いだから、これ以上はCGI質問板へ。
667 :
Name_Not_Found :03/05/31 05:21 ID:yCzSry8L
Perl(サーバ)でのtimeの値が1増えるまでの時間(1sなはず)と JavascriptでのsetTimeoutやsetIntervalでの1000msの長さに 違いが出るということはあるのでしょうか? サーバはinfoseekで試したのですが1分30秒の間に 10カウント近くtimeの方が早く、時計を見ていた結果、 Javascriptのほうが正しいっぽいのです。 何か情報をお持ちの方、お答えをお願い致します。
どーやって計測したのか書けよ…。 違いが出たのなら、記述ミスを疑うべき。
>>667 それはPerlの問題ではない。
インターネット経由でCGIを実行するんだから、数秒のタイムラグはあって当然。
同じスクリプトをローカルで実行させてみ?
670 :
nobodyさん :03/05/31 09:54 ID:fOVZj1BA
置換演算子の勉強中なんですが、良くわかりません。 以下のスクリプトを作ってみました。 $_ = "abc"; $h{abc} = "ABC"; $h{$1} = "XYZ"; if (/(abc)/) { print $1,"\n"; # "abc" print $h{$1},"\n"; # "ABC" s /$1/$h{$1}/; print $_,"\n"; # "XYZ"? } 最後のプリントで"XYZ"が出力されてしまうところが理解できないのです。 置換文字列内のハッシュの添字は変数展開されないのでしょうか? どなたかご教示ください。
こうか? s/($1)/$h{$1}/;
672 :
直リン :03/05/31 11:10 ID:1EAhrEiJ
673 :
658 :03/05/31 12:00 ID:isLkXnpR
>>670 >>671 の補足。
s/PATTERN/REPLACEMENT/
PATTERN 中の $1 は直前まで持っていた値
REPLACEMENT 中の $1 は PATTERN 中で代入された値
s/$1/$h{$1}/ の PATTERN には () が無いので
REPLACEMENT で参照される $1 は既に undef
$h{$1} = "XYZ" の段階で $1 は undef
よって s/$1/$h{$1}/ は s/abc/XYZ/ と等価
正規表現てむづかしいよね。 いつか、ちゃんと勉強しなおそうとは思うけど。
676 :
670 :03/05/31 17:14 ID:fOVZj1BA
>>671 さん,
>>674 さん
良く分かりました。どうも有り難うございます。
ハッシュの添字は変数展開されないのかしら、と思ったのは、勉強中の
「初めてのPerl」という本に次の記述があったからです。
(以下引用)
@fred = ('hello','dolly');
$y = 2;
$x = "This is $fred[$y-1]'s place"; # "This is dolly's place"になる
インデックスの式はーあたかも文字列の外部に置かれているかのようにー
普通に評価されていることに注意しましょう。まず最初にインデックスの
式に対して変数展開が行なわれるわけではないのです。
(引用終り)
この部分、何を言っているのかさっぱり分からない(変数展開してると思う)
のですが、配列のインデクスに対して変数展開が行なわれないのなら、
ハッシュの添字に対しても同じことかな、と思ってしまったのです。
変数展開する/しないで頭の中ゴチャゴチャです。
>>676 ダブルクォートで囲んだら変数展開されるんだから、何も問題ないだろうに。
>>676 > インデックスの式に対して変数展開が行なわれるわけではない
"$y-1" を "2-1" という「文字列」に展開してしまうのではく、
「$y - 1」という式として扱う、つまりダブルクォート文字列外と
同じく添え字を表す式として使える、と言いたいんだろう。
もしインデックスの式に対してまで変数展開が行われるとしたら、
$x = "This is $fred[$y-1]'s place"; は
$x = qq/This is $fred["2-1"]'s place/; として扱われ、
文字列 "2-1" を数値として評価し、結果 $fred[2] を見る事に
なってしまう。
s/ではく/ではなく/
s/$1/$h{$1}/; ↑このスラッシュの前後で、 $1の中身が"abc"→undef となるのか。勉強になった。
Perlについて興味を持ち始めたんですが、 ボタンをクリックして処理を始めるというのがいまいちわかりません。 投稿 ボタンをクリックすると、 投稿処理が始まりますよね? どのようにしていその処理に移ればいいのでしょうか? 厨な質問でスマソ・・・
Perlと何の関係もない。
>>681 どうもCGIを作りたいみたいだから、先に
スレタイを読んで理解すること、HTMLを理解することを薦める。
HTMLを理解しないとどうせCGIからHTMLを吐けないからね。
<form action="hoge.cgi">
>>681 ×Perlについて興味を持ち始めたんですが、
○CGIについて興味を持ち始めたんですが、
×厨な質問でスマソ・・・
○スレ違いな質問でスマソ・・・
685 :
nobodyさん :03/05/31 21:20 ID:FYLpMA2J
>>681 スレ違いだけど教えてやる。
投稿をクリックするとform actionで指定されたcgiを呼び出す。
で、呼び出されたcgi側でフォームで指定されたメソッドにしたがって処理。
CGIスレがあるのにPerlスレでCGIの質問をするのはなぜ? このスレの方が大抵いつも上にあるから?
687 :
_ :03/05/31 21:30 ID:???
688 :
nobodyさん :03/05/31 21:39 ID:Ecff4K+l
Perl=CGIって考えの房が多いから。
初心者はperlとcgiの区別が付かないから
690 :
nobodyさん :03/05/31 22:00 ID:qGkh6pMi
691 :
nobodyさん :03/05/31 22:18 ID:ZijosZey
あのー xmailでメール送信する場合って、 open(MAIL, "| /usr/sbin/xmail/sendmail -t"); で送れるんですか?
画像ファイルのサイズを取得する方法を 詳しく説明してる様なサイトってないでせうか?
>>692 「ファイルテスト演算子」でぐぐりる。
my $filesize = -s $filename;
>>694 > my $filesize = -s $filename;
my $filesize = (-s $filename);
スマソ
696 :
693 :03/05/31 22:42 ID:???
サイズを得る演算子があったか。恥かいてしまったな。
697 :
nobodyさん :03/05/31 22:58 ID:m6zPJsPy
掲示板のスクロールバーの色を変えるにはどう書けばいいのですか?(´Д⊂ク
700 :
nobodyさん :03/05/31 23:15 ID:ZijosZey
>>700 お前は、人の迷惑を考えないガキと見た。
703 :
612 :03/05/31 23:31 ID:3Wm6q7+j
Activeperlでsslのかかったサイトにアクセスしたいのですがどうすればよいでしょうか? いちおうNet::SSLeayというモジュールが必要ということで ppm install Nea::SSLeay としてやってみたもののうまくできません。 どうすればよいでしょうか? perl初心者ですが申し訳ありません。 650さんにものが足りないといわれましたが、なにが足りないのでしょうか?
704 :
nobodyさん :03/05/31 23:33 ID:ZijosZey
>>699 のL5-6は勘違いだったスマソ。質問のソースを読めば分かるか。
>>700 何の板なのか、そしてここは何のスレかを腹筋しながら50回音読してください。
# 向こうで答えが出ているのにわざわざマルチするなんて最低だよq(^-^)
>>612 1 スタートメニューからperl package managerを起動する
2 search sslする
3 Crypt-SSLeayが見つからなければ
repoでリポジトリを確認し、repo 2とかやって切り替える。2に戻る。
4 install (3で見つけた番号)
だったと思う。俺はもう既にインストール済みだから手順を確認できない。
スレ違い・板違いのどこが悪いんですか。 初心者だから仕方ないでしょう。 誰でも最初は初心者に決まってるじゃないですか。 質問には全部答えてあげればいいじゃないですか。ガキじゃないんだから。 そしてスレの内容をめちゃくちゃにして誰もが不利益を被るようにすればいいじゃないですか。
初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。 初心者だから仕方ないでしょう。
710 :
nobodyさん :03/06/01 00:47 ID:DeFU3cB4
あの、 Win32モジュールってどこにあります? なかなか見つからないんですが・・・
>>707 1.本気で自分は絶対に間違ってなく、他の全てが間違っていると考えている。
->本物。なので処置なし。放置。
2.薄々自分のやったことに後ろめたさを感じているが、認めたくない。
->厨房。頭が冷えるまで放置。と言うか物の道理がわかるまでネットにつなげるな。
3.ネタ
->放置
おお、実態がどれであろうと放置以外に選択肢がない。
>>710 ウィンドウズにActivePerlを入れてるなら、
スタート->検索->ファイルやフォルダで検索を開き、Win32で検索。
……Perlとかんけーねえ!?
713 :
動画直リン :03/06/01 01:10 ID:FDrVWEME
714 :
nobodyさん :03/06/01 01:36 ID:DeFU3cB4
>>712 ごめん。はじめっからはいってるんだね。
すんませんでした。
715 :
707 :03/06/01 02:34 ID:???
本当にすみませんでした。 やっと目が覚めました。 初心者だからって、それに甘えてルールを破る事って いけないことですよね。。。 自分が甘ったれだって、気がつきました。 もう少し、勉強してきます。 ありがとうございました。
717 :
本当の本物707 :03/06/01 03:08 ID:5qKTyD6i
すみません。本当にすみません。
僕が、変な質問の仕方したばかりに、
偽者が現れて、荒れてきてます。。。
>>716 は、偽者です!
僕は、今ちゃんとまじめに勉強してます。
今後も、もしかしたら僕の偽者が現れるかもしれませんが、
どうか、放置してください。
本当の本当に、ご迷惑をおかけしました。。。。
IDも晒しておきます。
718 :
直リン :03/06/01 03:10 ID:FDrVWEME
>>707 は板違い・スレ違い野郎を皮肉ってるだけだ。
板違い/スレ違いを構ってやってそういう板/スレだと思われると困るC〜 んだから、板違い/スレ違いが来たら叩くだけだC〜 その結果スレが荒れたって困らないC〜 荒れて困るほど人が多い板じゃないC〜
>>721 荒れると、困るというか嫌だが、何か?
俺以外でも、そう思うヤツはいてると思うが、何か?
荒れて良いなんて思った事なんて、一度もない。
Perl使ってCGI組んでる俺は、PerlだろうがPHPだろうが、
WebProg板全体のレベルアップを願う一人だ。
今日の日記。 あまりに下らない流れを発見した。
何だかんだ言って、みんな人が良いんだから
725 :
670=676 :03/06/01 05:30 ID:6WOnkruh
>>678 さん
有り難うございます。
$y = 2;を、$x = "$y";で展開すると、$xは2(数値)ではなく、"2"(文字列)
になるということですね。
言われてみれば当り前のことですが、これがはっきり認識できていません
でした。
>>722 馬鹿に馬鹿といってその結果荒れるのはしょうがない。
スクリプト言語の功罪か。
ちょっと疑問に思った。 unlessやらuntil使わずに、ifとwhileに!を組み合わせて使う。 ナンデダロ(・∀・)
>>728 それの方が、見やすい、理解しやすい場合がある。
または、その人が、それの方が見やすい理解しやすいからかな?
pack,unpackを詳しく説明してるサイトを ご紹介してもらえませぬか?
732 :
nobodyさん :03/06/02 12:25 ID:s70dOIFM
以下のように2つのcsvがあり、 DBのように外部キーなどを使って管理しています。 (なお、telnet使えないため、DBD::CSVモジュールなどをいれられません) ------------------------------------------------------------ ●機関マスタorgmaster(orgmaster.csv) 各列は、 ・orgid(主キー) ・orgname(テキスト) ・countryid(外部キー) ●国マスタcountrymaster(countrymaster.csv) 各列は、 ・countryid(主キー) ・countryname(テキスト) ・seq(数値) ------------------------------------------------------------ で、単に、機関マスタを開いて、countryid別にソートして機関名を表示 (selet orgname from orgmaster order by countryid) というのなら、以下の手順でできるというのはわかるのですが・・・ (1)機関マスタを開く $ORG[$values[0] = { 'orgname' => $values[1], 'countryid' => $values[2], }; (2)ソートして表示 @tmp = sort { (${ORG[$a]->{countryid}} <=> ${ORG[$b]->{countryid}}) } 0 .. $#ORG; foreach (@tmp) { print 'orgname='. $ORG[$_]->{orgname}. " / "; print 'countryid='. $ORG[$_]->{countryid}. "<br>"; } (つづく・・・)
733 :
732 :03/06/02 12:25 ID:???
>>732 のつづき
ここで、質問です。上記のものを変更して、
★国名も表示させるには、どうすればいいのでしょうか?
(selet orgmaster.orgname, countrymaster.countryname
from orgmaster, countrymaster
order by countryid
where orgmaster.countryid = countrymaster.countryid)
★もし可能なら、ソート順をcountrymaster.seqにするにはどうすればいいのでしょうか?
(selet orgmaster.orgname, countrymaster.countryname
from orgmaster, countrymaster
order by countrymaster.seq
where orgmaster.countryid = countrymaster.countryid)
734 :
732 :03/06/02 12:28 ID:???
もし大変そうでしたら、手順だけでもかまわないので、 教えていただければ幸いです
>>732-734 わからん・・・
何を聞きたいのかが分からん・・・
手順だけを教えてくれって・・・
処理のアルゴリズムは、プログラマーが考える事であって・・・
処理方法は、何十種類も、何百種類もある。
ところで・・・お前は、ソートの動きを理解してない、いつぞやのヤツでは?
736 :
732 :03/06/02 12:43 ID:???
>>735 あー、そうなんですね・・・。言われてみれば確かに。
定石でもあればと思ったのですが・・・
>ソートの動きを理解してない、いつぞやのヤツでは?
どうなんでしょう。
ソートで質問したことはあるけど、最終的には理解したつもり。。。なんですが・・・
>>736 >>471 ←この辺のヤツじゃない?
とりあえず・・・
自分では、どんな処理してみたの。
それを、晒してみろ。
738 :
732 :03/06/02 14:00 ID:???
>>737 (
>>471 、自分でした)
正直、質問したときは、どっから手をつけていいか???な状態でしたが、
ついさっきひらめきまして、方法はこんなかんじです。
なんか、想像してたよりかずっと楽にできたので拍子抜けなんですが、
どうなんでしょう?まだ冗長な部分とかありますでしょか?
▼国マスタを開いて、下のように国ごとの名称と順番を取得しておく
$COUNTRY[$values[0]] = {
'countryname' => $values[1],
'seq' => $values[$2],
};
▼機関マスタの情報を$ORGに代入する際、以下のように、
「機関マスタ.countryid=国マスタ.countryid」となるような、
国マスタ.countrynameや国マスタ.seqを、ひっぱってくる。
(ここから後は、外部テーブルを意識する必要はなく、$ORGの処理に専念すればOK)
$ORG[$values[0] = {
'orgname' => $values[1],
'countryid' => $values[2],
'country_contryname' => $COUNTRY[$values[2]]->{contryname}, #国マスタ.contryname
'country_seq' => $COUNTRY[$values[2]]->{seq},#国マスタ.seq
};
▼$ORGをいじくる(ソート基準をcountry_seqにして、表示する対象をcountry_contrynameにする)
@tmp = sort { (${ORG[$a]->{country_seq}} <=> ${ORG[$b]->{country_seq}}) } 0 .. $#ORG;
foreach (@tmp) {
print 'orgname='. $ORG[$_]->{orgname}. " / ";
print 'country_contryname='. $ORG[$_]->{country_contryname}. "<br>";
}
>>738 いや・・・
それでできたなら、それでいいんじゃない?
一言言わせて貰えば・・・
なぜ、二つのリファレンスで管理してるのか・・・
一つで管理してれば、そんな処理せずソートできるのに。
・・・と、この辺は、そちらの都合でそうしてるんだろうし。
これ以上、何も言う事はないかな。
何作ってるか知らんが、適度にがんがれ。
740 :
名無しさん@お腹いっぱい。 :03/06/02 15:39 ID:vewE58z2
あるディレクトリのファイル数を調べる方法を教えてください。
741 :
nobodyさん :03/06/02 15:52 ID:NLUHomb+
>>740 グロブかディレクトリハンドルを使う。
この二つはファイル名とドットファイルの扱いが違う点に注意。
742 :
名無しさん@お腹いっぱい。 :03/06/02 16:19 ID:vewE58z2
ありがとー
743 :
名無しさん@お腹いっぱい。 :03/06/02 19:18 ID:vewE58z2
perlで空フォルダを作成する場合の方法をご存知の方居ませんか? 検索ではなかなか出てこなくて・・・
フォームから「<input type="file">」でアップロードしてもらったJPEGファイルの、 横幅や縦幅を取得するにはどうすればいいのでしょうか?
>>743 mkdirを使う。
ちなみに「フォルダ」じゃ見つかりにくいと思われ。「ディレクトリ」で探そう。
>>744 Perlと無関係。
746 :
744 :03/06/02 19:30 ID:???
747 :
名無しさん@お腹いっぱい。 :03/06/02 19:46 ID:vewE58z2
>>745 ありがとーう。
mkdir($Dir, 0777);としても755になっちまいましたが。
作ったディレクトリの中にファイルを作ったり出来たんで上手くいきました。
HTML::Template を使っています。 で、ページをSJISで吐き出していたのですが、 あるときから、ページの一部がEUCで吐き出されるようになってしまいました。 # HTMLテンプレートをオープン my $template = HTML::Template->new(filename => $PathTmplStart); # パラメータを埋める &jcode::convert(\$HtmlYou_are_here, "sjis"); $template->param( YOU_ARE_HERE => $HtmlYou_are_here, ); # テンプレートを出力 print $template->output; このコードで、「YOU_ARE_HERE」の部分はSJISで表示されますが、 それ以外の部分はEUCで表示されてしまいます。 テンプレファイル($PathTmplStartのファイル)はSJIS、スクリプトはEUCです。 どのタイミングからこうなってしまったかは不明ですが、 しかし、正常な表示のときと今とでは、上記コード部分はまったく変わっていません。 なお、同じcgiファイル中で、HTML::Templateを使っている全てのかしょで、 同様の現象が起きています。 いったい、どこを疑えばいいのでしょうか?
unmaskでは?
751 :
nobodyさん :03/06/02 21:09 ID:8SqwvWBe
>748 当たり前じゃね? outputの前にContent-Typeをsjisで吐き出さなきゃ駄目だろ
752 :
動画直リン :03/06/02 21:10 ID:mGHfwiJV
753 :
預言者 :03/06/02 21:33 ID:???
755 :
748 :03/06/02 22:27 ID:???
>>751 (どもです。)
いや、
print "Content-Type: text/html\n\n"; は、すでにこの時点で、
書いてます。(ずっと前の方で)
ただ、sjisとは書いていませんでしたが。
でも、ページ全体が化けるばけでなく、
ページの1部分(パラメータYOU_ARE_HERE 以外の部分)が化けるんですよね。
(で、IEでエンコードをEUCにすると、逆にパラメータYOU_ARE_HEREの部分だけが化ける)
だから、sjisと書いてないこととは別だとは思うのですが・・・
(ただ、今は、開発してた環境(ていうか会社)ではないので、試せてはいないのですが)
それに、今まではsjisと書いてなくても化けてなかったし・・・
perlで画像の縦,横の大きさを取り出すには?
>>756 >>757 を補足。
Image::Size モジュールとか、
GDモジュールとか、
Image::Magickモジュールとか、その辺をググれ。
上から順番に簡単。
>>748 念のためにコンテントヘッダーと、<meta>の両方を使って文字コードをsjisにしてみる。
それでもなおわからないのであれば、
1.エディタを疑う。(勝手にEUCにして保存してないか)
2.鯖の設定を疑う。
もう一度確認してみたまい。
7度探してって言うだろ?
760 :
nobodyさん :03/06/02 23:04 ID:9tPqBm3m
拾ってきたCGIファイルをワードパッドやメモ帳で開くと 日本語の部分が文字化けしてることがあるんですが どうやれば文字化けしないで済みますか? 編集したくてもできなくて困っています。
761 :
直リン :03/06/02 23:10 ID:mGHfwiJV
763 :
nobodyさん :03/06/02 23:21 ID:9tPqBm3m
>>262 そこからエディタをDLしたら文字化けが直りました。
ありがとうございました。
764 :
名無しさん@お腹いっぱい。 :03/06/03 01:02 ID:0MDIlf0d
現在infoseekを利用していて、 mkdirによって作成したディレクトリとそれ以下のファイルがFTPアップローダ側からの 削除が出来なくなってしまいました。 tripodで色々と試していたときにもディレクトリが削除できなくなってしまったことがあるのですが、 (FTP側から)何かPERLスクリプトに問題でもあるのでしょうか? 誰か情報お持ちの方教えてください。
765 :
動画直リン :03/06/03 01:10 ID:HzexL3AB
766 :
764 :03/06/03 01:20 ID:0MDIlf0d
申し訳ありません。自己解決してしまいました。 報告としてはmkdirのあとに更にchmodをすることで解決するようです。
768 :
nobodyさん :03/06/03 02:09 ID:6112bZio
769 :
748 :03/06/03 11:54 ID:???
1個のテンプレートファイルを開いて(ここで、すでにsjisになってることを確認) (ちなみに秀丸) 一応、もう1回、SJISで明示的に保存したら、うまくいきました。 と、同時に、別のかしょ(テンプレートファイルもまったく別<いじってない) が、このあと全てなおってました。。。 意味不明です。。。まぁ、なおったからいいんですが・・・
770 :
nobodyさん :03/06/03 12:09 ID:1E21CA31
>769=748 いやだからね CGIファイルがeucなら、 明示的に「Content-Type: text/html;charset=Shift_JIS\n\n」って書かないと、 sjisのテンプレをeucだとして読み込んで出力するんだから化けるの当たり前っしょ
771 :
nobodyさん :03/06/03 13:26 ID:8vlIkX7m
例えば'ef78a90134ef78a90134'という[0-9a-z]を使った文字列を、先頭から2文字づつを16進数としてアレイに格納するにはどう書けば良いでしょう? 文字数が偶数個であることは保証されています。 s/(..)/$1 /gで一旦変換後split, hexするのは思いつきましたが、もっとカコイイ書き方はありますか?
open と opendir について質問です。 MS-DOS や windows のファイル共有で使う UNC 名(?)を open や opendir で使うにはどの様な書式でファイル名を 渡せばいいのでしょうか? $name = '\\\\share_name\\dir\\'; opendir( DIR, $name ); とか、やっても駄目でした。
775 :
748 :03/06/03 14:46 ID:???
>>770 あー、そういうことなんですね。ありがとうございます。
配列を先頭からm個に切り詰める方法で何かいいのない? 無限ループ内でm個になるまでpopするくらしか思いつかない。。
779 :
776 :03/06/03 15:50 ID:???
うぉ、速レスが2つも。 ありがとうございます。 splice、すっかり忘れてた。恥かしい限りです。
780 :
771 :03/06/03 17:11 ID:???
なるほど、↓んな感じですね。'H'の意味を間違えてはまってました。 unpack('a2' x (length($str) / 2) , $str);
Undefined subroutine &jcode::f called at jcode.pl line 400. というエラーが出てしまいます。 もちろんjcodeはいじってませんし、なお、jcode.plは最新版です この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか? どこを直せばいいかまったくわからず・・・
>781 まず辞書をひく。
783 :
nobodyさん :03/06/03 20:34 ID:PcOC09to
質問です。 えとアクセスしたらIPとそのアクセスした日にち・時間をログに保存するスクリプト教えてください。 お願いします!!ちなみにこれは荒らし対策です
784 :
781 :03/06/03 20:37 ID:???
jcodeとは別の自作の方のscriptを、前のバージョンに戻ってそこから書き直したら、
エラーが出なくなりました。
>>782 いや、英語はわかるんですけどねー・・・
結局原因がわからなかったものの、解決してしまいました(なんか歯切れが悪いですが)
786 :
nobodyさん :03/06/03 20:53 ID:EuO1wjCe
よろしければお智恵を貸して下さい 行末に時間記述のあるテキスト xxx.txt を 時間順に修正、上書きすることってできるでしょうか? xxx.txt ------------------ .... 01-jan-2002 .... 02-jan-2001 .... 01-jan-2001 ------------------ ↓ ------------------ .... 01-jan-2001 .... 02-jan-2001 .... 01-jan-2002
787 :
nobodyさん :03/06/03 21:10 ID:9Ku6+BeZ
Undefined subroutine &jcode::f called at jcode.pl line 400. というエラーが出てしまいます。 もちろんjcodeはいじってませんし、なお、jcode.plは最新版です この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか? どこを直せばいいかまったくわからず・・・
>>784 おまえは本物のアレか?
「読んだけどよくわかりませんでした」
jcode内部にfなんてルーチンねえよボケって意味だろうが。
可能性としては、
1.おまえのjcodeの扱いが変。
マニュアル読みつつ、jcode呼び出してるところを全部チェックする。
2.jcodeのバグ。
製作者に報告。
ま、1を5000回くらいやってから2だと結論するようにな。
相手にしるなと
>>786 やり方次第で。
とりあえず思いついたのは、
1.一行取り出して、
2.末尾の時間をコピーし、
3.それをepoch秒に変換し、
4.この秒をキーにしてハッシュに行全体を代入する。
これをファイルが尽きるまで繰り返す。
5.ハッシュからキーを全て取り出し、
6.数値として扱ってソートする。
7.ソート後の順番で値を全部ファイルに出力すれば、完成。
実際のコーディングで難しいのは、3のあたりかもなー。
Dateなんたらモジュール使えば楽にできそうな気もする。
力技で20030603214900みたいな形式に変換しても用は足せるだろうが。
791 :
786 :03/06/03 22:38 ID:EuO1wjCe
>>790 レスありがとうございます。
う〜ん、なんか初心者の私には難しそうですね。
さくっとあきらめようかしら。
792 :
nobodyさん :03/06/03 22:44 ID:I9aep0OW
793 :
直リン :03/06/03 23:10 ID:HzexL3AB
2バイト文字か、そうでないかを判断する方法を教えてください
>794
文字コードで検索。
じゃなきゃ、
>>4 のサイトをまわってみ。
>>791 ソースを晒してみろ。
バグが出てる部分だけでもいいし、
全部を、どこかのアプローダーに上げてもいいし。
少し、見てやるから。
797 :
791 :03/06/03 23:23 ID:???
ごめん・・・誤爆ですた。
ドツボだ・・・ 誤爆2回ですた。
>>786 ちょっと書いてみた。年号・月名(文字変換)・日の順番に並べてからソート。
同じ日のデータが複数行があるとだめぽ。そのときは、改作しる。
%mon=qw(jan 01 feb 02 mar 03 apr 04 may 05 jun 06 jul 07 aug 08 sep 09 oct 10 nov 11 dez 12);
@mon=qw(jan feb mar apr mai jun jul aug sep oct nov dez);
while(<>){
chomp;
split;
($date=$_[$#_])=~s/(\d+\-)(\w+)(\-\d+)/$3$mon{$2}$1/;
$hash{$date} = $_;
}
foreach $key (sort {$a <=> $b;} keys %hash) {
print $hash{$key}, "\n";
}
大分類(数字二桁)>小分類(ハッシュで 種類,価格) とデータを管理していて、 大分類の数字(01など)がトリガーになって、対応する小分類の中身を全て表示する、という風にしたいのですが、どうもうまくいきません。 例えば $data{'01'} = { "エンピツ" => 100, "消しゴム" => 80 }; $data{'02'} = { "ネクタイ" => 1000, "ワイシャツ" => 1500 }; $data{'03'} = { "コート" => 10000, "マフラー" => 2500 }; while(($num,%temp) = each(%data)){ print "$num<BR>\n"; while(($name,$price) = each(%temp)){ print "$name $price<BR>\n"; } print ".......<BR>\n"; } としても
801 :
800 :03/06/04 02:44 ID:???
01 HASH(0xbc864) ... 02 HASH(0xcd5c4) ... 03 HASH(0xcd6cc) ... と、よくわからないものが返ってきてしまいます… %kind01 = ( "エンピツ" => 100, "消しゴム" => 80 ); としておいて $i = '01'; while(($name,$price) = each(%kind$i)){ print "$name $price<BR>\n"; } としてもエラーになってしまいます。 どのようにするのがベターなのでしょうか…
803 :
800 :03/06/04 03:50 ID:???
>>802 ありがとうございます。今モーレツに感動してます(;´Д⊂ヽ
ぐぐって一発目に出てきたページをみて組み直しました。
$data{'01'} = { "エンピツ" => 100, "消しゴム" => 80 };
$data{'02'} = { "ネクタイ" => 1000, "ワイシャツ" => 1500 };
$data{'03'} = { "コート" => 10000, "マフラー" => 2500 };
$hoge = '01';
$temp = \%data;
$x = $$temp{$hoge};
while(($i,$j) = each(%$x)){
print qq|種類"$i" 値段"$j"円<BR>\n|;
}
たったこれだけで出来るとは・・・すげー(;´Д⊂ヽ
804 :
800 :03/06/04 04:00 ID:???
まじですげー 考えたやつエライ(;´Д⊂ヽ 興奮が収まらない・・・
805 :
786 :03/06/04 10:33 ID:nmL3emss
>>790 >>799 レス、ありがとうございます。
やっぱり始めたばかりの私には
まだ荷が重いみたい(〃▽〃;)
勉強して出直してきまーす。
論理値 $flagに対して if ($flag) とやるみたいに、 論理値 $HOME[$myhomeid]->{flag} に対して、 if (!$HOME[$myhomeid]->{flag}) としたいのですが、 できない模様です。 どのように表現すればいいのでしょうか? if ($HOME[$myhomeid]->{flag} == TRUE) とするしかないですか?
>>805 せっかく作ってやったんだからやってみろよ。
>>799 の@mon=...の行は不要だった。消してね。
それとよく見たら、昇順ソートしたいのね。
それなら、{$a <=> $b;}ってとこ、{$b <=> $a;}にすればできるよ。
809 :
806 :03/06/04 11:01 ID:???
>>807 え、if (!$HOME[$myhomeid]->{flag})で問題ないはず、ってことですか?
おかしいなー。
>>806 >>807 $HOME[$myhomeid]->{flag} = "false"とかやってるに100真珠
>>810 ああ・・・なるほど。
それじゃ、俺も同じく・・・
文字列を評価して偽の判定を期待してるに3000カノッサとスパーひとしくん人形を20個。
812 :
直リン :03/06/04 11:10 ID:qArPuVJp
813 :
nobodyさん :03/06/04 13:06 ID:tEfKxFs6
win98で動くPerl用エディタの定番を教えてください。
815 :
_ :03/06/04 14:11 ID:???
>>816 gotoは用途によっては使ったほうが便利な場合もある
goto ( &sub); みたいに
>816 昔のN88BASIC(構造なんて考えずに何でもあり言語)のころからの諺。 スパゲティになるから。
>>816 GOTO文有害論は半世紀近い昔に結論されてる。man perlfuncのgotoのところ見るべし。
>>817 のは例外
820 :
nobodyさん :03/06/04 15:55 ID:QLc9Kvie
モジュールの中でCGIやCGI::Liteのようなものは $cgi->is__error and (独自の終了処理); とすることができるのですが、HTML::Templateのように 自動的にSTDERRに書き込んで終了してしまう物は どのように自分のスクリプト側でエラーを捕捉することが できるのでしょうか。 どうかよろしくお願い致します。
821 :
nobodyさん :03/06/04 16:37 ID:yPvJTG3F
822 :
nobodyさん :03/06/04 16:52 ID:gwvKQAZH
>>821 こんな便利なモジュールがあったとは知りませんでした。
本当にありがとうございました
824 :
動画直リン :03/06/04 17:10 ID:qArPuVJp
825 :
動画直リン :03/06/04 17:10 ID:qArPuVJp
826 :
_ :03/06/04 17:23 ID:???
827 :
816 :03/06/04 17:51 ID:???
そらそうだろう
ファイルの内容を、chom; split;して生成した配列のリファレンスを 1の方法で@fileに格納していくということを考えて書いてみたのですが、 正常な値が得られず、2の方法なら正常に得ることができました。 この2つは全く同じ動作と予想していたのですが、1と2では なにが違うのでしょうか? 1、 @file = map { [ split( /\t/, chomp ) ] } ( <FILE> ); 2、 while( <FILE> ) { chomp; my @array = split( /\t ); push( @file, \@array ); }
>>829 chompの動作を誤解してる。
chompは引数の末尾に改行があったらそれを削除するが、
同時に削除した改行文字の数を返り値として戻す。
その数字をsplitに渡してるだけなので、望んだような結果にはならないだろう。
831 :
829 :03/06/04 20:32 ID:???
御返信ありがとうございます。 きちんと理解しないまま今まで使用していました。 以下の様に変更したところ正常にどうさするようになりました。 @file = map { chomp; [ split( /\t/ ) ] } ( <FILE> );
832 :
室長 :03/06/04 22:12 ID:???
すみません。初めてのCGIで、IPアドレスを表示するスクリプトを作ってみたいと思ったのですが、どうにも上手く動きません 是非ヒントをいただければ幸いであります、、、、 ソース #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html>\n\n"; print "<head></head>\n"; print '<body bgcolor="black" text="white">'; print "<b>"; print "\n"; $host = &gethost; $trueip = &getip; print ="Remote Host = $host<br>\n" print "IP = $trueip <br>\n"; print "</b>"; print "</body>"; print "</html>"; exit;
833 :
室長 :03/06/04 22:15 ID:???
表示されるhtmlは真っ黒で、ソースは、<b>までで停止してます。。。 厨なのは分かってますが、どなたかぜひご教授ねがいますです。。。。。
>>832-833 あのさ・・・
<b>で停止するって事は、
それ以降で問題が起きてるって事でしょ?
&gethost か、&getip ってルーチンに問題があるんでしょ。
そこを晒しなよ。
それと、ヒアドキュメント使った方がいいぞ。
ご、ごめんなさい。やっぱり出直してきますです。。。。 お邪魔シマスタ、、、、
836 :
室長 :03/06/04 22:28 ID:???
本当にすみませんでした、、、
>>832 #!/usr/bin/perl
print "Content-type: text/plain\n\n";
print $ENV{'REMOTE_ADDR'};
838 :
834 :03/06/04 22:41 ID:???
>>835-836 おおぉ?
俺、そんな強い口調っぽい書き込みだった・・・?
俺が分かる範囲で付き合ってあげるから・・・・
逃げるこたぁないだろぉ〜
おいおい、別に逃げなくてもいいよ。
もしかして、ソースって
>>832 で全部だったりして……
まさかね。
>>838 つか、
>>837 が一撃で回答を出してるがな。
>>832 は、どっかのソースをパクってきたんじゃないのか?
んで、そのソースでsub getipとかが宣言されてたんだけど、
そこまではコピらなかったとか。
841 :
室長 :03/06/04 22:50 ID:???
本当に申し訳ないです。。。
なんか漏れみたいなザコキャラ相手に申し訳ないです。。。
すみませんが後学のために、一つだけ教えていただければ幸いであります。。。
>>837 さんのprint $ENV{'REMOTE_ADDR'}; という部分は何をしているのか教えていただけませんか?、、、
おいらの本の環境変数サンプルにもリモートホストの表示部分には
$host = $ENV{'REMOTE_HOST'};
と書いてあり、IPアドレスの部分は
$trueip = &getip;
と書いてありました。。。
やっぱり$ENVって重要だったのでしょうか、、、、
お手数おかけしますが、是非お願いいたします。。。
>>839 さん
全部です。。。。。
842 :
室長 :03/06/04 22:53 ID:???
>>840 さん
パクってきました。。。
見ると最後の方にIPアドレスの判断部分として、
sub getip {
if(〜〜〜
っていうのがあったです
必要だったんですか。。。。
厨房でほんと恥ずかしいです。。。ごめんなさいです。。。
843 :
834 :03/06/04 23:20 ID:???
>>840 たしかに。
でも、
>>832 のソースでのバグ取りの質問でしょ。
>>841-842 おっかしな事言うヤツだな・・・
環境変数って言葉を知ってて、なぜ%ENVを知らない・・・?
%ENVが環境変数その物なんだが・・・
とにかく、まったく分かってない状態だな。
変に触って、レンタルサーバとかに上げるなよ・・・。
迷惑になるから。
最低、簡単な掲示板くらい作れるようになれ。
話はそれから。
844 :
室長 :03/06/04 23:23 ID:???
>>843 そうだったですか。。。。
もっと勉強してから出直してきますです。
皆さん本当にありがとうございました。感謝です
お邪魔しましたです。。。
>>843 > 最低、簡単な掲示板くらい作れるようになれ。
> 話はそれから。
「初心者」って敷居高いのですねぇ、、、
while(($n,$v)=each(%ENV)) { print sprintf("%s = %s<br>\n",$n,v); } とかやると環境変数が何なのか掴みやすくなるかも
847 :
nobodyさん :03/06/04 23:55 ID:nAPG6l61
リファレンスについて学びはじめなのですが、 #!/usr/bin/perl require "jcode.pl"; print "Content-type: text/html\n\n"; $list{sta_kanji} = "春日部"; #駅名を漢字で。 push (@list, \%list); print $list[0]->{sta_kanji}; #スクリプトのコードがEUCなので、EUCで表示されます。 &jcode::convert(\$list[0]->{sta_kanji},'sjis'); #SJISに変換します print $list[0]->{sta_kanji}; #SJISで表示されます の最後の2行で、どうしてjcodeのときには「\」が必要で、 最後の行では\が不要なのでしょうか・・・? 要不要の違いはどこで判断するのでしょうか?
診断くん?
849 :
834 :03/06/05 00:00 ID:???
>>845 う〜ん?敷居高い?
俺が初めてPerlで作ったCGIって掲示板だったが・・・
本見ながら、必至で作った。
出来上がった掲示板は・・・
返信機能も、Cookieの機能も、改ページ機能も、
何の機能もない、ただ書き込んだ内容がズラズラ表示される掲示板だった・・・
掲示板と言うか、ゲストブックかな?
そこから、いろんな本買ったり、人のスクリプト読んだりで勉強したけど・・・
掲示板が基本だと思うけどね〜。俺は。
850 :
834 :03/06/05 00:05 ID:???
>>847 > $list{sta_kanji} = "春日部"; #駅名を漢字で
ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
\が必要な時と、必要じゃ無い時は・・・
出力してみろ。
print \$list[0]->{sta_kanji};
print $list[0]->{sta_kanji};
二つの違いを見てみれば分かる。
簡単な掲示板を作れってのはちょっと酷だろ。 まずは他人の掲示板の改造から入るのがいいんじゃないか? まぁ、大前提としてHTMLをわかってないといけないが。 あ、そうそう。 掲示板の改造とかなら改造スレで質問してね。
おれが初めてperlに触ったのは、minichatの改造だたーよ
cgiの基本は掲示板かもしれん
854 :
834 :03/06/05 00:25 ID:O0RMOoYP
print \$list[0]->{sta_kanji}; で、 SCALAR(0x80d55c8) と出ましたが、わかりません(泣) スカラー値ということでしょうが、 一体どこのスカラーを差しているのでしょうか?(変な日本語かな) あと、0x80d55c8っていうのは、なんなんでしょうか? ググろうかとも思いましたが、そもそもググる単語がわからず。。。
855 :
847 :03/06/05 00:29 ID:???
すいません、
>>854 において、名前欄を書き間違えました。ただしくは
>>847 でした。
あと、
>>850 さん
>> $list{sta_kanji} = "春日部"; #駅名を漢字で
>ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
いえ、間違いというか、その直後にpush (@list, \%list);してるので。
(@listと%listがややこしかったですね、すいません)
何でもそうだけど、目標があるのとそうでないのとでは、やっぱり意識が違う。
掲示板って、作ったあとそのまま使えるし、プログラム的にも簡単な部類だし
おそらく世の中にあるCGIでは最も数が多いだろうから、参考にするコードも多い。
Perlを覚える教材としては一番ふさわしいと思う。
そういう俺も、最初は掲示板の改造→自作→その他のCGI、という流れで覚えた。
>>854 それは変数の内容があるアドレス。そこにスカラー値が入ってる。
ぐぐるなら「デリファレンス」。
(本来はリファレンスなんだけど、それだと無関係なほうがいっぱい引っかかるんで)
>>847 sub sub1
{
my $a = shift;
$a = 2;
}
$a = 1;
sub1($a);
print "$a\n";
と
sub sub1
{
my $a = shift;
$$a = 2;
}
$a = 1;
sub1(\$a);
print "$a\n";
を比べて見やがれ。
858 :
834 :03/06/05 00:41 ID:???
>>851-853 そっか、みんな改造から入ったのか〜。
プログラム入門がPerlだった俺は、死ぬ思いだった・・・
ちなみに、CGIの基本は掲示板だと俺も思う。
Perl/CGIができるヤツに、掲示板作らせたら一発でレベルが分かる。
>>855 見落とししてた・・・。スマン
ちなみに、答えは
>>856 が答えてる通りで、
メモリ内の、スカラー値が格納されてる番地を表す。
Cのポインター相当。
俺はCGI以前からサーバプログラム作ってたからいかにサーバに負担かけないかという 習性が身についてたのね。minibbs見たときはぶっ飛んだよ。
>>849 同意
>>851 改造の方が難しくないか?(改造ってHTMLいじるとかそんなんじゃないよね?)
それに1から順を追って作った方が理解できると思う。
>860 改造ったって、BBSの入力項目一つ増やすだけだって立派な改造でしょ。 それなら簡単だし、変数とかにも触れて、案外入門としてはいいかもとか思ってる。 tu-ka,俺がそうだった。 1から順を追って作ろうとすると挫ける性格なんだよ。 大体、そういうやり方で覚えられる奴はこんなところで質問しない。
そういうやり方 = 1から順を追って作るやり方、ね。
>>861 >BBSの入力項目一つ増やすだけ
って言ってもCGIの入力・処理・出力を全てやらなきゃいけないから辛いと思うんだがなあ。
1から作る方だと、まず出力、次に入力したやつを出力、最後に入力した奴を処理して出力
と段階を追っていけるから理解が早いのではないかと。
改造の方だと一応改造に成功しても、結局中でどういう処理がされているかが分からないし。
俺はプログラマの講師をやっていた頃があって、その経験からこういう結論になってる。
CGIに関しては数回に渡って100人ぐらいに教えたけど、改造させるより1から作らせる方が飲み込み早かったよ。
まぁ個人差があるから全員がそうというわけではなかったから、このように意見が分かれるんだろうな。
>>861 俺は逆に、「人の作ったものの改造」が苦手だ。
(悪い例かもしれないけど)某K○NTのBBSスクリプトとか
拾ってきて、さていじろうと思っても、
どこがどこの処理をしてるのかサパーリわからん。
今にして思えば、変数のスコープがぐちゃぐちゃしてたから
わかりにくかったんだろうけどね。
掲示板で勉強していくなら、「この掲示板と同じものを自分で作ろう」
っていうのが一番いいと思うな。
改ページとか、どうやるんだろうって処理は既存のものを参考にして、
あとは自分の手で書いたほうが結局は理解が早い。
あと、モジュール使うと非常に勉強になるね。
使い方をマスターするために必要な知識がたくさんあるから
結果としてそういうものも身に付いていく。
cgilib.plとかCGI.pmとかだけは最初に使わない方がいいな。
基礎(%ENV,QUERY_STRING,PATH_INFO,type="file",etc.)を身に付けるためにも。
結局は外部モジュール使うようになる(し、そうすべきだ)けど、
この辺の遠回りは無駄にはならないと思うし。
>>865 は分かってるだろうけど一応。
BBSの入力項目を1つ増やすだけ、の話をするヤシは、 プログラマ板のデスマーチ大作フラッシュを見て泣いてくれ。 スレに関係ないのでsage
868 :
nobodyさん :03/06/05 02:57 ID:ECImrkCL
>>863 全く同感。
俺も最初は他人の物に手加える方が楽かと思ってたが、
あるキッカケで丸ごと自作のを書いたら、そっちの方が
楽だったし、何よりも頭に入った。
おかげで、他人のスクリプト見ても理解する能力も格段に進歩したし。
他人のもんいじるって言うのは、工数自体は少ないから
楽に感じるかもしれないけど、実はあまり足しにならないし、
いつまでたっても初心者になり続ける罠。
869 :
868 :03/06/05 03:00 ID:ECImrkCL
あ、というか、今はバイトでperlやってるけど、他人のものいじる 方が全然疲れるし難しいと思うよ。まーそりゃ予めいじられるのを 前提としたフラグとかある部分に関してはそんなことないけど。 それに単機能の掲示板作るのって全く難易度高くも何ともないと思うんだけど。 それすら酷って言う奴は… 初心者と認められるにはワンライナー限定っすか?
870 :
_ :03/06/05 03:03 ID:???
アセンブラをいぢってたこともあって、リファレンスやらポインタは難無く理解できた。 がしかし、クラスやらインスタンス、淫ヘリ箪笥・・・ちーっとも理解できていません(つД`) movem.l d0-d7/a0-a6,-(sp) の頃が懐かしい、、、
872 :
直リン :03/06/05 03:10 ID:C/yWLjzO
>>866 あぁ、わかります。
フォーム内容のデコードとか画像アップロードする際の
--------- ←こんなのの除去とか、
「プログラミング言語」とは直接関係の無いことかもしれないけど、
知ってると知ってないじゃ全然違うし知ってなきゃいけないことだし。
俺が初めて買った「Perl/CGI入門」系の本も、
ccgi-lib.plとjcode.plを使えと書いてあったけど、
アレを読んでも何が行われているのかは全くわからないな。
「動けばいい、内部構造など知らん」ってのは
プログラマの立場としてはあんまり良くない態度だわなぁ。
874 :
nobodyさん :03/06/05 07:30 ID:UTEewkkC
クライアントアプリをperlで作るにはどうすればいいのでしょうか? ベクターなどで探してもコマンドラインを使って操作するようなアプリしかなかったのですが、 誰でも操作できるようにコマンドラインを使わないで クライアントアプリを簡単に作る方法はないのでしょうか?
875 :
nobodyさん :03/06/05 07:52 ID:l4KCIFT8
じゃあコンソールで。
876 :
_ :03/06/05 09:06 ID:???
877 :
動画直リン :03/06/05 09:10 ID:C/yWLjzO
>>874 クライアントがPerlをインストールしている前提ならば、
Perl/Tkを使えば可能になる。
879 :
_ :03/06/05 12:06 ID:???
>>878 その点、MacOSXは有利だよね。
いまちょっといろいろと考えているんだけどね。
881 :
_ :03/06/05 14:10 ID:???
882 :
nobodyさん :03/06/05 15:51 ID:62PtIZ8T
ガイシュツかも知れないけど、cyrptの逆アセというか、 希望の暗号化文字を引っ張り出すような関数は 誰か作ってないのでしょうか?
>>882 そもそも非可逆なアルゴリズムなので、デコード的な処理は不可能。
884 :
nobodyさん :03/06/05 16:23 ID:uDBKSvvR
逆アセってなに?
逆アセンブルの略、、単に使ってみたかっただけでしょう。 そもそも、アルゴリズムは公開されてるんだし… そもそも、概出だし…
886 :
nobodyさん :03/06/05 19:03 ID:y1a1B1oZ
キャップにmonaとか出してる人いるでしょ、ソレやりたいの。
<form method="post" action="admin.cgi"> <input type="text" name="comment" size="30"> //←メッセージ(たんなる例です) <input type="submit" name="submit" value="送信する"> これで、admin.cgiにデータ送って、 readparseして、 そして、パスワード認証を済まして、実際にログファイルに記述、というCGIをつくりたいのですが、 html→データに書き込み。すると大丈夫なんですが html→パス認証→データに書き込み。だと ↑ここでフォームのデータが送られないんですが、どうすればいいでしょうか?
だからCGIの質問はCGIスレでしてくれってば。
え、CGIってphpとかrubyとか全部含めてだから、 perlのことはPerlスレじゃないの?
Perlじゃないんだよ。
>>1 にも書いてあるが、ここはPerlの「コーディング」のスレなんだよ。
そもそも>888はたまたまPerlを使ってるのかもしれないが、その質問自体は、
Perlに限られた話じゃないから、CGIスレ向けということ。
とりあえずソース晒せ。
でも既に
>>181 みたいなのにも答えてるわけだから、もはやコーディング専門というわけにも
いかんだろう。
アルゴリズムまで許容するとなれば、
>>888 のような質問もアリでは。
895 :
nobodyさん :03/06/05 19:44 ID:Dbz7wb1c
>>893 えぇと、ソースといわれると、300行以上ありまして、
ファイルの作成、編集などのツールです。(ログファイルにというのは、簡単なたとえのつもりです。
要するにフォームのデータをパスワード画面を通して(1回余分な部分を通過して)送るにはどうすれば?ということが聞きたかったんです。)
できあがってるんですが、それにパスワードをつけないと危ないので、つけようとおもっているんです。
とりあえず、新規作成の時のhtmlのソースと、
作成のときのcgiのところをさらしますね。
パスワードとかはまったく手をつけてないじょうたいです。
<html><head> <title>編集ツール</title></head> <body> <br> <font size="3" color="#97cdee" face="富士ポップ">ファイルツール</font> <br><br><font size="2">ファイルを新規作成します。</font> <form method="post" action="admin.cgi"> <input type="hidden" name="s_mode" value="new"> <br><input type="hidden" name="s_type" value="file"> <table border="0"><tr><td> <font size=2>名前</font></td> <td><input type="text" name="name" rows="1" size="55"></td></tr> ///←ファイル名 <tr><td><font size="2">本文</font></td> <td><textarea name="body" rows="22" cols="58"></textarea></td></tr></table> ///←本文 <input type="submit" name="submit" value="送信する" style="30px"> <input type="reset" name="reset" value="リセット" style="30px"> </body> </html>
>>890 888を見ただけじゃ、readparseって文字見て
恐らくPerlかな、としか分からないだろ。
Rubyかもしれないじゃないか。
ところで、パス認証って、CGIの中でやるやつか?
それともサーバ自体の機能かな?
>>896 そのHTMLファイルでパスワードを入力させるのは嫌なの?
#!/usr/bin/perl require "./cgi-lib.pl"; &ReadParse(*in); $name = "$in{'name'}"; $parmission = "$in{'parmission'}"; $oldname = "$in{'old_name'}"; $mode = "$in{'s_mode'}"; $body = "$in{'body'}"; $type = "$in{'s_type'}"; if ($type eq "file"){ ///大元で、ファイルの操作か、ディレクトリの操作かを区別 if ($mode eq "new"){ ///新規作成の場合 if ($name eq""){¬_file;} else{ if (-e $name){&uwagaki_file;} else{ open(FILE,"> $name"); print(FILE $body); close(FILE); print "Content-Type: text/html\n\n"; print "<html><head>\n"; print "<title>ファイル作成完了</title>$style</head>\n"; print "<body>\n"; print "<br><br><center><font size=2>ファイル($name)作成完了しました。</font><br><br>\n"; }}}
¬_fileはファイル名がない場合の警告、
&uwagai_fileは上書き時のメッセージです。
&uwagaki_fileには、open(FILE >$nameなども入っていて、上書きしし、「上書きしました」というメッセージを出す、サブルーチンです。
>>899 えぇと、htmlは省略してしまいましたが、
ファイル、ディレクトリのラジオボタン
新規作成、削除、編集、コピー、属性変更のラジオボタンがり、すべてできるようになっています。
(cgiでhtmlを出力していますが・・)
ですので、submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
>>901 なんでsubmitボタンを押してから入力させたいの?
一緒に入力させればいいのに・・・・
ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
Perlとなんの関係もないね・・・
>>901 > submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
一度クライアントにフォームデータを全部hiddenで返して、再度passとともにcgiに送るしかないのでは?
>ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
これって、入力画面では、
>>897 のが送られた場合、
&ReadParse(*in);
$name = "$in{'name'}";
$body = "$in{'body'}";
<input type="hidden" name="name" value="$name">
ってことでしょうか?
そういうこと。
>>904 やっぱりhiddenで送るしかないんですね。。。
>>903 さんのおっしゃるとおりパスワードを一緒に入力させればいい話でしたね。。。
>>906 俺フォームメールでこれやって挫折したような覚えがあります。。
ここの住人の方が言ってくれるからにはできるんでしょう。
がんばってみます。。。
でも、一緒に入力するほうが、使用する側としても気分がいいですよね・
完全にCGIの話だったな。
では、ノシ
(*^-^)ノシ
ヽ(゜▽、゜)ノシ
913 :
nobodyさん :03/06/05 22:10 ID:mI0dWPG1
windows XPで aとbという名前のティレクトリを子に持つディレクトリ内で @dir = grep { -d } readdir( DIR ); とすると . と .. が入り @dir = readdir( DIR ); とすると . と .. と a と b が入り、ディレクトリである a や b に 大して偽を返してしまうのですがなぜ a や bで-dは偽を返してくるのでしょうか?
熨斗
915 :
_ :03/06/05 22:17 ID:???
>>913 XPのバグじゃないの?
ほれ、関係者にメールだメール。
>>913 おそらく、readdir() で読み込んでるディレクトリと、-d した時点で参照してるディレクトリ
(カレントディレクトリ)が異なってるせいかと。
-d のときにフルパスでチェックするようにしてみては。
#!/usr/bin/perl require "cgi-lib.pl"; &ReadParse(*in); $name = "$in{'name'}"; $check = "$in{'check'}"; print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n<title>文法チェッカー</title>\n</head>\n"; print "<body>\n"; print "<form method=post action=checker.cgi> print "<input type=name name=>ファイル名<br> print "<input type=submit name=submit value=チェック> print "<input type=hidden name=check value=check>\n"; print "</body>\n</html>\n"; if($check eq "check"){ open(FILE ,"$name"); @data = <FILE>; eval{ foreach(@data){print;} ///←ここは作成途中なのであしからず };
919 :
918 :03/06/06 17:00 ID:???
if($@){ print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n<title>文法エラーです</title>\n</head>\n"; print "<body>\n"; print "@data\n"; print "</body>\n</html>\n"; } else{ print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n<title>文法OKです</title>\n</head>\n"; print "<body>\n"; print "OKです。\n"; print "</body>\n</html>\n"; }} ってすると、ボックスにファイル名入れた後、 表示されるのがはじめのと、ifの分岐後のとが複合してしまうんです。 ___________ | | ___________ ファイル名 チェック Content-type: text/html OKです。 ↑雑ですいませんが、こういうことです。 if($check eq "check")の下全部をifでかこって、 はじめの文法チェッカーのところをelseですればできるんですが、こんなかっこ悪いことしてるのがみあたりません。 html出力の重複を避けるにはどうしたらいいですか?
凡例: file_check.htmlの内容。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>文法チェッカー</title> </head> <body> <form method="post" action="checker.cgi"> <input type="text" name="">ファイル名<br> <input type="submit" name="submit" value="チェック"> <input type="hidden" name="check" value="check"> </body> </html> とする。
checker.cgiの内容。 #!/usr/bin/perl require "cgi-lib.pl"; &ReadParse(*in); $name = "$in{'name'}"; $check = "$in{'check'}"; if($check eq "check"){ open(FILE ,"$name"); @data = <FILE>; eval{ foreach(@data){print;} } # ///←ここは作成途中なのであしからず $html = <<"EOS"; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>%s</title> </head> <body> %s </body> </html> EOS if($@){ print sprintf($html,'文法エラーです',@data); } else { print sprintf($html,'文法OKです','OKです。'); } } exit;
どうしても1つのファイルにしたいのなら、 method が GET のときは、921 を出力して終了。 method が POST のときは、922 を実行して終了。 になるように振り分ける。 ・・・など。
なんでこのスレでCGIの質問するんだ? うざいからCGIのスレ逝けよ
CGIでもコーディングの質問なら問題ない。
>>918 ・まず、ほとんど同じコードを二度も三度も書くのはばかばかしいと思うようになろう。
・まとめられる部分はまとめるようにしよう。
・printとprintの間に他のコードが入っても、一向に問題にならない。
・content-typeは、そのCGIが最初に吐き出す文章であることが重要。二度も吐き出す必要はない。
てかさ。Perlとか云々以前にプログラミングそのものがわかってないような。
あのー、 テキストエリアにからのフォームデータ $bodyを(もちろんReadParseして) $body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g; で、CR+LF→LFにならないんでしょうか? 実行するとこの行がエラーになるんですが・・・
>>925 「CGIの質問」はスレ違いだろ。何言ってんだ。
あとCGIのコーディングってなんだよ。
>>927 「エラーになるんですが・・・」じゃねーよバカ
エラー出てるんなら貼れ&
>>1 を100回声に出して読め。
$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
↓
$body =~ s/(.*)\x0D\x0A$/$1\x0A$/g;
↓
$body =~ s/\x0D\x0A$/\x0A$/g;
↓ $body =~ s/\x0D\x0A$/\x0A$/;
>>928 CGIとしてのPerlの質問であっても、コーディングに関してであれば問題ない。
って言いたかったの。
>>929 500エラーです。
チェッカーを見ると
Final $ should be \$ or $name at file.cgi line 111, within string
syntax error at file.cgi line 111, near "=~ s/(.*)\x0D\x0A$/(.*)\x0A$/g"
file.cgi had compilation errors.
>>931 了解
>>932 >>929-930 の回答間違ってた。
$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
↓
$body =~ s/(.*)\x0D\x0A$/$1\x0A/g;
↓
$body =~ s/\x0D\x0A$/\x0A/g;
↓
$body =~ s/\x0D\x0A$/\x0A/;
>>933 うーん、できませんねぇ。
Win改行のままです。。。
>>932 置換後の文字列に正規表現書いてどうすんだ?
937 :
936 :03/06/06 23:55 ID:???
ぁ、$body =~ s/\x0D\x0A$/\n/; これですんなりできたけどこれっていいの?
>934,>936 お前報告の仕方悪い。 エラーが出なくなったことをまず報告してから、その上で期待する結果が得られなかったと言いなさい。 で、改行コードを変換して、どこに出力しようとしてるのかな? まさかSTDOUTに出力して、IEでソース見てたりしないよな?
>>937 Win改行かどうかってどうやって調べてんの?
940 :
936 :03/06/06 23:59 ID:???
ごめん、普通に考えれば
\x0D\x0A=\r\n
\x0D=\r
\x0A=\n
だね。。。。
マッチさせるときも、置き換え後も、
16進数のほうがいいんでしょうか?
>>938 >で、改行コードを変換して、どこに出力しようとしてるのかな?
>まさかSTDOUTに出力して、IEでソース見てたりしないよな?
ファイルに保存するツールなんです。
改行コードを書き換えてファイルに保存する、というところでひっかかってました
941 :
936 :03/06/07 00:00 ID:???
>>939 ファイルの行頭を抜き取って
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
else{$code = "";}
とやってます。
ところで、ちゃんとLFになったかどうかのチェックはどうやってる? あと「エラーがでます」「だめでした」などの曖昧な表現はやめよう。 「どういうエラーが出るのか」「どのようにだめだったのか」を必ず書くようにね。
>>940 > ごめん、普通に考えれば
> \x0D\x0A=\r\n
> \x0D=\r
> \x0A=\n
> だね。。。。
違う。\nはOSによって変わる。
\n = \x0D\x0A DOS,Win
\n = \x0D Mac
\n = \x0A etc.
944 :
936 :03/06/07 00:01 ID:???
945 :
936 :03/06/07 00:02 ID:???
>>943 あ、そうなんですか。
では、改行コードの変換は16進数でしたほうがいいんですか??
こんなんか? #!/usr/bin/perl open(IN,"hoge"); binmode(IN); $file = <IN>; close(IN); &code_check; $file =~ s/\x0D\x0A/\x0A/g; &code_check; sub code_check { if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";} elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";} elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";} else{$code = "none";} print "$code\n"; } \x0D\x0Aの2バイトのファイル読み込ませたら、ちゃんと CR+LF (Win) LF (UNIX) になったぞ。
947 :
936 :03/06/07 00:10 ID:???
>>946 わざわざつくっていただきありがとうございます。でも完成しました。。
ところで、友達も「改行コードはバイナリモードで解決した」
といってましたが、なぜバイナリモードで読むのでしょうか?
私が作ったのはバイナリにしないでも改行コード変換できましたよ?
>>947 お前バイナリモードの意味分かってないだろ?
取り敢えず検索する癖をつけろ。
949 :
936 :03/06/07 00:12 ID:???
#!/usr/bin/perl require "./cgi-lib.pl"; &ReadParse(*in); $name = "$in{'name'}"; ///フォームから受取ったファイル名 $body = "$in{'body'}"; ///フォームから受取った本文 $r_code = "$in{'r_code'}"; ///ラジオボタンで改行コードを選択 open(FILE,"> $name"); # 改行コードの変換 if($r_code eq "lf"){$body =~ s/\x0D\x0A$/\x0A/;} elsif($r_code eq "cr"){$body =~ s/\x0D\x0A$/\x0D/;} print(FILE $body); close(FILE); これでできたんですが、、、どうなんでしょうか
950 :
936 :03/06/07 00:14 ID:???
>>948 テキストモードって勝手にコードの変換がされるんですよね??
951 :
nobodyさん :03/06/07 01:43 ID:Y8iN/hYF
ふたつのファイルをrequireで呼び出すにはどうすればよいのですか? require './data/data_1.cgi'; ひとつだけ呼び出すのは↑こんな感じになってました data_1.cgiとdata_2.cgiのふたつを呼び出したいです
>>951 require './data/data_1.cgi';
require './data/data_2.cgi';
>>951 の質問はこれにて終了しました。
↓次の方どうぞ
953 :
936 :03/06/07 02:27 ID:???
何度もすいませんが ファイルの内容を while( <FILE> ){print;}でテキストエリアに渡した場合は、Windows改行になるのでしょうか?
処理系依存かな
955 :
936 :03/06/07 02:36 ID:???
>>954 処理系依存、といいますと、クライアントのOSに影響するということですか?
957 :
936 :03/06/07 02:54 ID:???
>>956 そうですか。。。
Linuxの鯖なのに
if($r_code eq "lf"){$body =~ s/\x0D\x0A$/\x0A/;}
elsif($r_code eq "cr"){$body =~ s/\x0D\x0A$/\x0D/;}
で変換できているので、CR+LFで出力されていることになりますが、、、
UNIXはLFだと思ったんだけど、意外だ・・・・
>>953 そのファイルがどの環境で作られたのかによるんじゃない?
Windows環境で書いたファイルであれば、どこに持っていこうがCRLFのまま。
これをUNIX系環境で1行読み込んだ場合、LFの前のCRは「文字列の一部」として
そのまま読み込まれるだけだと思うんだが。
なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
自動的にLF改行になるとか、そんな感じに勘違いしてない?
それと、あなたの実行環境ってローカルで動かしてるサーバーだよね?
間違ってもレンタルサーバーとかプロバイダスペースじゃないよね?
なんか会話が噛みあってないから。
置換処理で困っています。 掲示板で(^-^)などの顔文字があればそれを画像にすりかえるために IMGタグに置換しようとしていますが、あらかじめ配列に顔文字のリストを 入れて置換してもうまくいきません。 顔文字のリストは @list = ( "(^-^)", "kao1.gif", "(T-T)", "kao2.gif", ); という感じで、実際に置換している部分は for($i = 0; $i < @list + 0; $i+=2){ $msg =~ s/($list[$i])/<IMG src=\"$list[$i+1]\" 〜略〜 alt=\"$list[$i]\">/g; } としています。まったく置換してくれません。 試しに顔文字のリストの顔の部分をOKなどにしてみると置換されました。 特殊な文字だから置換がうまくいかないのでしょうか? どうすれば解決できるか教えてください、お願いします。
960 :
936 :03/06/07 12:00 ID:???
>>958 >なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
>自動的にLF改行になるとか、そんな感じに勘違いしてない?
へ?ぜんぜん思ってませんよ。。。
961 :
936 :03/06/07 12:05 ID:???
>>958 えと、つまり
Windows環境で、テキストエリアに入力した文字をcgiに送って
$body =~ s/\x0D\x0A$/\x0A/;
こうしても、LFにならないってことでしょうか?
>>959 顔文字が正規表現のメタ文字として解釈されているんでない?
顔文字のメタ文字を\でエスケープするか、もし面倒ならquotemetaであらかじめ
変換しておくとか。(\Q \Eって使えたかな…どなたか助言求む)
できればソースを書きたいんだけど、いま手元に実行環境がないんで勘弁して。
>>961 いい加減うぜぇ。2ちゃんは学校じゃねぇ。
質問等はまとめて話せ。少しは自分で調べて話せ。
>こうしても、LFにならないってことでしょうか?
やってみろバカ。プログラムに実験はつきものだ。
964 :
936 :03/06/07 13:05 ID:???
>>963 やってみました。
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
こいつで正確に改行コードがえられるのかだけ教えてくれませんか?
>>964 それは何も変わらないだろ?チェックしてるだけだ。
もう質問は止めてPerlの超初心者本を読むことをお勧めする。
(´-`).。oO(やってみればぁ、、、)
967 :
959 :03/06/07 13:45 ID:???
>>962 メタ文字を\でエスケープしたりquotemetaもやってみましたがだめでした。
なんでかなぁ・・・。
968 :
nobodyさん :03/06/07 14:02 ID:mCmiN6Nz
>>965 ぃゃ、チェックできるのかを質問してるのに
チェックしかできないって怒られても……
969 :
965 :03/06/07 14:03 ID:???
>>964 すまん。
>改行コードがえられるのかだけ
が
>改行コードかえられるのかだけ
に見えてた。
末尾の改行に関してはそれでいける。
でも
>>966 の言うようにやってみれば分かるだろ。
CR+LF,LF,CRなファイルを用意してやってみればいいんだから。
970 :
nobodyさん :03/06/07 14:21 ID:mCmiN6Nz
>>969 if($r_code eq ゙lf゙){$body =~ s/\x0D\x0A/\x0A/g}
elsif($r_code eq ゙cr゙){$body =~ s/\x0D\x0A/\x0D/g}
でLF改行とCR+LF改行での新規作成はできるんですがCRだけうまくいかないんですよね。それにチェックするスクリプトも一行目の改行コードを調べているので不安なんですが、一つのファイルに改行コードが複数あるってことはないんでしょうか?
それと昨日もらったレスでは/sがいらないみたいなこと言ってましたが一行目だけをLFにするとのこりもLFになるんでしょうか?
971 :
_ :03/06/07 14:21 ID:???
972 :
970 :03/06/07 14:27 ID:mCmiN6Nz
追記 さっきの/sは/gの間違いでした。 で、/gなんですけど、試したところ複数行の文字は/gがないとコードが変わりませんでした。 たぶん/gを省いてくれた人はチェック時のことをいってくれてたんですね。
chmod(0666,"$logfile"); 和鳥でこれが使えないのでデリったら書き込みができなくなった なんか方法はありまつか?
>>970 >if($r_code eq ゙lf゙){$body =~ s/\x0D\x0A/\x0A/g}
>elsif($r_code eq ゙cr゙){$body =~ s/\x0D\x0A/\x0D/g}
>でLF改行とCR+LF改行での新規作成はできるんですがCRだけうまくいかないんですよね。
意味が分かりません。
>チェックするスクリプトも一行目の改行コードを調べているので
意味が分かりません。
>一つのファイルに改行コードが複数あるってことはないんでしょうか?
モノによる。普通は有り得ないが作れないことも無い。
>それと昨日もらったレスでは/s(=>/g)がいらないみたいなこと言ってましたが一行目だけをLFにするとのこりもLFになるんでしょうか?
意味が分かりません。
正規表現の$の意味は?
改行コードが何物かをもうちょっと勉強してみればわかると思うよ。 UNIXでCRがどういう意味を持ってるかってこと。
977 :
936 :03/06/07 17:37 ID:???
>>975 >>if($r_code eq ゙lf゙){$body =~ s/\x0D\x0A/\x0A/g}
>>elsif($r_code eq ゙cr゙){$body =~ s/\x0D\x0A/\x0D/g}
>>でLF改行とCR+LF改行での新規作成はできるんですがCRだけうまくいかないんですよね。
>意味が分かりません。
フォームに入力した文字を、ラジオボタンに押されたものによって、
上のif文で改行コード変更するスクリプトなんです。
LFとCR+LF形式には変換できたのですが、
CR形式に変換できないんです。
>チェックするスクリプトも一行目の改行コードを調べているので
意味が分かりません。
改行コードをチェックするスクリプトです。
# 改行コードの取得
open(FILE, "$name");
$file = <FILE>;
close(FILE);
if($file =~ /(.*)\x0D\x0A$/ && $bin !=~ /40/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/ && $bin !=~ /40/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/ && $bin !=~ /40/){$code = "CR (Mac)";}
else{$code = "";}
このように先頭行だけをとって調べています。
>>それと昨日もらったレスでは/s(=>/g)がいらないみたいなこと言ってましたが一行目だけをLFにするとのこりもLFになるんでしょうか?
>意味が分かりません。
>>933 で、下で/gがなくなっているので・・・
978 :
936 :03/06/07 17:38 ID:???
&& $bin !=~ /40/ これは無視しちゃってください。 ファイル一覧取得するスクリプトの一部分で、 こいつで、ディレクトリ以外の改行コードの取得ってことです。。 すいません。
979 :
936 :03/06/07 17:42 ID:???
本当にもうしわけありません。 CR改行の件ですが、ローカルではできたのにレン鯖ではできなかったんです。 で、ただたんにスクリプトを更新していなかっただけでした。すいません。
(´-`).。oO(こんなけ引っ掻き回しておいてそういうオチに持ってくるのかぁ、、、勉強になるなぁ。)
981 :
936 :03/06/07 18:17 ID:???
>>980 やっぱりできませんでした。
CRの場合、最後の行を改行しないと認識してくれませんねぇ。。。
>>967 どうやってできなかったのかな?うちでは両方できたけど。
%list = (
'(^-^)', 'kao1.gif',
'(T-T)', 'kao2.gif',
);
$msg =~ s/\Q$_\E/$list{$_}/g for(keys %list);
983 :
967 :03/06/07 19:58 ID:???
>>982 あぁ・・・書き忘れてました。\Qと\Eのは書き方はわからなかったのです。
たぶんquotemetaの書き方も間違っていたんだと思いますけど。
できました。教えていただいてありがとうございました。
ディレクトリが存在するかどうか確認する方法ってありますか? 何層も下の場合でも使えるの・・
>>985 ファイルテスト演算子ってディレクトリに使ってもいいんですか?
IPやホスト名を2chのIDみたくしたいです。 誰か教えてください。
つまり、
>>987 は「聞く前に試してみろ」と言いたいのだな.。
993 :
nobodyさん :03/06/07 22:13 ID:UHTFNtX1
初心者で申し訳ないのですが、Perlモジュールのアンインストールは どうやればよいのでしょうか。 調べてもこれといったものが見つからなかったため、教えていただき たい次第です。
>>989 ・・・あんまり回答になってなかった。
「聞く前に試してみろ」と言いたいのではなく、「聞き返す前に読め」といいたい。
せっかく答え返ってきてるのに、何のために聞き返すのかサパーリ。まあ
>>986 は氏ねってこった。
次スレは?
そろそろ新スレ立てたほうが良いのでは?
Perlは死滅。次スレは要りません。
C1000タケダ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。