Perl 初心者コーナー Part23

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

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


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

過去ログやお勧めサイトは >>2-10
2nobodyさん:03/05/16 11:18 ID:???
3nobodyさん:03/05/16 11:19 ID:???
4nobodyさん:03/05/16 11:20 ID:???
[総合]
 ・Perl Com: http://www.perl.com/pub/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
5nobodyさん:03/05/16 11:20 ID:???
[Document&Tutorial]
 ・Perl News: http://www.news.perl.org/
 ・Perl Monks: http://www.perlmonks.org/
 ・use Perl; : http://use.perl.org/
 ・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
 ・Perldoc.com: http://www.perldoc.com/
 ・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
 ・Rex Swain's Home Page: http://www.rexswain.com/
 ・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
 ・Perl Tuts: http://savage.net.au/Perl-tutorials.html
 ・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
 ・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
 ・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
 ・Perlfect Solutions: http://perlfect.com/
 ・The Perl Archive : http://www.perlarchive.com/
 ・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
 ・use Object; : http://perl.infoware.ne.jp/
6nobodyさん:03/05/16 11:29 ID:???
[Module]
 ・Perl Module Reference: http://www.bekknet.ad.jp/~bero/docj/module_/
 ・PPMPackages: http://www.activestate.com/PPMPackages/
 ・河馬屋二千年堂's Page: http://member.nifty.ne.jp/hippo2000/index.htm

[Security]
 ・安全なプログラミングのためのガイドライン:http://www.FreeBSD.org/ja/security/#spg
 ・Perl security:http://www.perldoc.com/perl5.6/pod/perlsec.html
 ・Perl security和訳:http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsec.html
 ・CGI and Security http://www.ansi.co.jp/tech/cgi/security/
 ・The Unofficial Web Hack FAQ:http://www.nmrc.org/faqs/www/
 ・How to Write Secure Code:http://www.shmoo.com/securecode/
 ・Safe CGI Programming :http://www.improving.org/paulp/cgi-security/safe-cgi.txt

[OS]
 ・Linux日本語マニュアル:http://www.linux.or.jp/JM/
 ・FreeBSD日本語マニュアル:http://www.jp.freebsd.org/man-jp/
7nobodyさん:03/05/16 11:30 ID:???
  _n
 ( l    _、_
  \ \ ( <_,` )
   ヽ___ ̄ ̄  )  おちゅかれ。7GET
     /    /
8nobodyさん:03/05/16 13:32 ID:???
>>1
おつ。
9nobodyさん:03/05/16 13:45 ID:???
ここは一応WebProg板な訳だけれど、
そういう限定は一切無し?

それともperlというと暗にcgiのことで、
web用に使う人しかおらん、という前提だろうか。
10nobodyさん:03/05/16 13:52 ID:???
>>9
は?
どっから引っ張ってきた話?
普通にperlです。

11nobodyさん:03/05/16 13:58 ID:???
>9
Perlについての質問箱 5箱目
ttp://pc2.2ch.net/test/read.cgi/tech/1053053082/

CGIではないPerlの話なら、ム板のスレがいいと思われ。
12nobodyさん:03/05/16 14:50 ID:???
ということは、やはりcgiを主眼に置いてるのかな。

cgi書いたことねえ。
13nobodyさん:03/05/16 15:16 ID:???
tu-ka,「CGIに依存しないPerlの話題一般」ってスレが>>1にあったじゃないか。
見落としていた>11こと俺萎え。
14nobodyさん:03/05/16 16:21 ID:???
んー、cgi以外のスレはどこ? と聞いてる訳ではなくて。
ム板の方では、cgiはWebProgに逝け、と誘導されてる訳で、
その割に、こっちの方では特にcgi向けのスレであることを謳ってない。
というか、むしろperl全般に見えるしcgiに特化した話を排斥する
傾向さえ見られる。

スレのスタンスがよくわかんない、という話。
15nobodyさん:03/05/16 16:25 ID:???
>14
基本的にはCGIでのPerl話題。
WebProg板だからな。

CGIに特化した話を排斥しているように見えるのは、その話題がほぼ必ず
「コーディングの話題じゃない」からだ。
つまり、「CGIとしてPerlを使う時のコーディングの話題」のスレってことだ。
確かにスレタイや>>1を見ただけではわかりにくいかもな。
16nobodyさん:03/05/16 16:39 ID:???
新参者ばっかだな。
ム板のPerlスレは、いつもるびきちやらにwebprog行けって
言われて、前の(前の)スレは、あいつに荒らされでぽしゃった。
だから、CGIじゃないPerlの話題もこっちが主流だった。
こっちじゃ、CGIのスレがあるから、Perl初心者コーナーは、
CGI以外のPerlについて話す場所にしようとみんなでしてた。
前の前のスレの>>1を見れば分かる。
でも、るびきちの荒らしがなくなったので、まあ、CGIでも
CGI以外でもPerlのコーディングに関するものなら、いいんじゃ
ないか。高度なのは、ム板、比較的簡単なのは、こっちで
どうかな。
17nobodyさん:03/05/16 17:40 ID:Jkp+t2ia
%mode2name = (
  'sql_arrange' => "顧客絞込み条件の入力",
  'select' => "該当顧客の閲覧",
  'writemail' => "メールの記入"
);

foreach $value (keys %mode2name){
  $HtmlTmp .= qq|$mode2name → |;
}

print $HtmlTmp;

とやると、 
「該当顧客の閲覧 → メールの記入 → 顧客絞込み条件の入力 → 」
と表示されます。

これを、%mode2name = で設定した順番、つまり、
「顧客絞込み条件の入力 → 該当顧客の閲覧 → メールの記入」
と表示させるには、

foreachの部分はどう書けばいいのでしょうか?
18nobodyさん:03/05/16 17:51 ID:???
>>17
ハッシュは代入された順番を保持できないよ。(どういう順番で記録されるかは不定)
順番を保持させたいならリストを使うべし。
19nobodyさん:03/05/16 17:56 ID:???
>>17
foreach $value ('sql_arrange','select','writemail'){
  $HtmlTmp .= qq|$mode2name{$value} → |;
}
20nobodyさん:03/05/16 18:20 ID:???
>>17
ハッシュに入っているキーの量が少ない(メールフォーム程度)なら、
キーに01,02等の通し番号を(キーの頭に)付けておいて、
foreach $key (sort keys %hash)
する手がある。表示もcgiでやるならsprintfして出力するだけだから簡単。
場当たり的なのが欠点。

perl cookbookにはTie::IxHashモジュールを使えとある。
こっちの方がたぶん正道のような気もするが、使ったことないので要調査ということで。
2117:03/05/16 19:01 ID:???
>>19
頭いい!?と思ったが、
ちょっとそれは気持ち悪い。。。

>>20
とりあえず、
>キーに01,02等の通し番号を(キーの頭に)付けておいて
でやってみます
22nobodyさん:03/05/16 23:42 ID:???
%mode2name = (
  'sql_arrange' => ["01","顧客絞込み条件の入力"],
  'select' => ["02","該当顧客の閲覧"],
  'writemail' => ["03","メールの記入"]
);
で、1項目目でソートしたキーを入れるに入れて
foreach ( @hoge ) {
$ref = $mode2name{$_};
$.... .= "$ref->[1]";
}
見たいな感じでいけないかな。実際に動かしてないからちびっと不安
23nobodyさん:03/05/16 23:43 ID:???
入れるに入れて→配列に入れて
24nobodyさん: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];

これでは別々になってしまうし・・・
25nobodyさん:03/05/17 01:02 ID:???
>>24
両方のファイルを結合してソートすればいいんじゃないの?
26nobodyさん:03/05/17 07:15 ID:wMi5ghdi
perlって
ほにゃらら if ほげほげ
ってかきかたはできるみたいですが、
これにelseの意味も加えた1行の書き方ってないですか?
27nobodyさん:03/05/17 07:20 ID:???
優れたソース見て勉強したいんですが、
初心者が見て勉強になるソースってどれでしょうか?
28nobodyさん:03/05/17 07:26 ID:???
>>26
三項演算子かな

>>27
動物シリーズ
29nobodyさん:03/05/17 08:08 ID:+QQFZ4NN
30nobodyさん:03/05/17 10:38 ID:0rspM7nm
エロ嫌いならクリックしなきゃいいじゃん。
http://accessplus.jp/staff/in.cgi?id=11141
プニュ ( ゚∀゚)σ)´Д`)
31nobodyさん:03/05/17 10:55 ID:bv1ocBAi
32nobodyさん:03/05/17 14:49 ID:???
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;
よろしうお願い島。
33nobodyさん:03/05/17 14:57 ID:???
ファイルを一つだけ開く、というのが気持ち悪い
開くなら開く。読み込むなら読み込む。
34nobodyさん:03/05/17 15:03 ID:???
open(DIFF, "diff test1.txt test2.txt|")
35nobodyさん:03/05/17 15:10 ID:???
>>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)は、ちょっとばかばかしいしぃ。


36nobodyさん:03/05/17 15:10 ID:???
>>34
ありがとん。でもdiffは、使わないでってことで。
37nobodyさん:03/05/17 15:13 ID:???
>>32,35
grep(/^$_$/, ..)にしなきゃだめですた。
38nobodyさん:03/05/17 15:40 ID:???
すみません。クソみたいな質問します。
自分でもクソ質問って分かってるけど、なぜか思うように動かないのです。

$pattern[0] = "あああ.30";
($test_1, $test_2) = split("\.", $pattern[0]);
print "$test_1\n";

なぜか代入されない。不思議。
39nobodyさん:03/05/17 15:45 ID:???
>>38
($test_1, $test_2) = split("\.", $pattern[0]);

($test_1, $test_2) = split (/\./, $pattern[0]);

不思議。
4038:03/05/17 16:14 ID:???
>>39
それだとうまく行きました。

不思議。
41nobodyさん:03/05/17 16:16 ID:???
それだと、、って。
そういうもんだろ。

不思議。
4238:03/05/17 16:21 ID:???
@age = split("\," , $data{'age'});
($decode_name, $decode_value) = split("=",$decode_pair);

上の二つは正常に作動してるから、
($test_1, $test_2) = split("\.", $pattern[0]);
これも正常に作動すると思ったんだけど…。

しなっかったのよ。
不思議。
43nobodyさん:03/05/17 16:32 ID:???
>>42
>上の二つは正常に作動してるから、
正常って何だよ。異常だろ。

http://flex.ee.uec.ac.jp/texi/perl/perl_56.html
44nobodyさん:03/05/17 16:39 ID:???
split って /re/ じゃなくても動くよな。
45nobodyさん:03/05/17 16:41 ID:???
省略記述で / / を省ける時や、別の文字を書ける時があったような気がする。
条件は忘れた。
46nobodyさん:03/05/17 16:42 ID:???
代入演算子について質問です。
||=や<<=などの代入演算子について知りたいのでつが、"代入演算子"でぐぐっても=や.=、+=くらいの一般的(といっていいのか疑問でつが)な代入演算子を解説しているサイトしかヒットしません。
代入演算子について詳しく解説してあるサイトをご存知な方はURLを貼り付けてください。
おながいしまつ。
47nobodyさん:03/05/17 16:46 ID:???
>>42
区切りに使う文字によって "" ’’ // に違いが出るの
//が無難かもね
48nobodyさん:03/05/17 16:51 ID:???
>>46
難しく考えなくていいんでないの?
$a ||= &b;

$a = $a || $b;
ってだけでしょ。
仮に、$a=0,$b=1 だったら、
右辺の結果、真になるので、$a=1となるだけ。
49nobodyさん:03/05/17 16:52 ID:???
$a ||= &b;

$a ||= $b;
50nobodyさん:03/05/17 16:55 ID:???
5138:03/05/17 16:56 ID:???
なるほど。
perlは妙な落とし穴が多いですね…。
実はperl独特の落とし穴(?)に何回もはまってます。

ありがとうございました。
5246:03/05/17 17:43 ID:???
ありがとうございますた。
助かりますた。
53nobodyさん:03/05/17 17:45 ID:???
>>42
splitの1つ目の引数に渡せるものは、「正規表現」か「文字列」。
文字列が渡されれば、それを正規表現と解釈する。だから、これらはすべて同じ動作。

split /\./
split m/\./
split qr/\./

split "\\."
split '\\.'
split qq/\\./
split q/\\./
54nobodyさん:03/05/17 17:58 ID:???
>>53
文字列時は \\. になるのは盲点だなー。
勉強になたよ。
5538:03/05/17 18:06 ID:???
なぜ\\になるのかが…分からん。
q[\\.]って超不思議なんだけど。

ですが、俺に中では「気にしない」と言う方向で落ちつきました。
ありがとです。

56nobodyさん:03/05/17 18:23 ID:???
データのエンコードですが。。。
よく引数で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進数にエンコードするにはどうするにはどうすればいいのですか?
データを送って自動でエンコードされたのを取り出すのはなしってことでお願いします。
57nobodyさん :03/05/17 18:35 ID:???
>>56
$encode = join('',map{ s/(\W)/'%' . unpack('H2', $1)/eg; } split(//,$data));

コレでどうやろ?
58nobodyさん:03/05/17 19:07 ID:???
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;
}
5956:03/05/17 19:38 ID:???
>>57さん。
ダメです。
”あいうえお”が”1111111111”になってしまいます。

>>58さん。
これでうまくいきました。
ありがとうございました。
60nobodyさん:03/05/17 20:22 ID:???
前スレで、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";
}

もっとうまく書けるかな?


61nobodyさん:03/05/17 20:37 ID:???
あれは、書いてるうちに埋まってしまう、というのが
面白かったのに。
62nobodyさん:03/05/17 21:14 ID:???
        正直、スマンカッタ!!
     \\  正直、スマンカッタ!! //
 +   + \\ 正直、スマンカッタ!!/+
     .   ___ .  ___  . ___   +
        /. ――┤  /. ――┤ . /. ――┤+
      ./(.  = ,= | ./(.  = ,= | ./(.  = ,= |
 +  .  |||\┏┓∩|||\ ┏┓∩|||\┏┓/  +
   ((  (つ   ノ  (つ   丿 (つ   つ ))
       ヽ  ( ノ   ( ヽ ノ   )  )  )
       (_)し    し(_)   (__)__)
63nobodyさん:03/05/17 21:47 ID:???
@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;
64nobodyさん:03/05/17 22:04 ID:0j4/huIM
「_」以外に、エンコードされない文字列というものはありますか?
漠然とした質問ですみません。
6558:03/05/17 22:07 ID:???
>>64
.*-_a-zA-Z0-9
以外はエンコードされる
66nobodyさん:03/05/17 22:17 ID:???
>>63
/おみご./
67nobodyさん:03/05/17 22:17 ID:ma11SCqX
68nobodyさん:03/05/17 22:37 ID:UhIqbGm5
6桁ぐらいのユニークな番号を作成する方法ってありますか?
69nobodyさん:03/05/17 22:42 ID:???
>>68
これじゃあ?
print sprintf("%06d\n", rand(999999));
70nobodyさん:03/05/17 22:43 ID:???
ユニークである保証が無い
71nobodyさん:03/05/17 22:44 ID:???
>68
$ユニークな番号 = int(rand(900000))+100000;

7271:03/05/17 22:46 ID:???
68 == 70
と仮定してみる
ナニをもってユニークとするのか聞きたいところだ
73nobodyさん:03/05/17 22:56 ID:???
超笑ったんですけど。よかった。
74nobodyさん:03/05/17 23:04 ID:0j4/huIM
>>65
_はエンコードされないですよね?
75nobodyさん:03/05/17 23:07 ID:???
>>65
ああ、すみません、_も入ってましたね。
しかし、
.*-

%2e%2a%2d
とエンコードされますよね?
76bloom:03/05/17 23:08 ID:w1ZjXwV8
77nobodyさん:03/05/17 23:17 ID:???
68 != 70 なんだけどね
そら、発生は一回じゃなくて、最高999999回発生させるんでしょ。
そのそれぞれが、過去に発生させた数字と重複していないことが
保証されている生成方法

って、全検するしかない気もするな
78nobodyさん:03/05/17 23:40 ID:???
>>77
完全にユニークは無理
かなりの確率でユニークであると仮定するぐらいがいいとこ
79nobodyさん :03/05/17 23:51 ID:???
ハッシュ使ってkeysがundefならば重複してないわけだが?
80nobodyさん:03/05/17 23:54 ID:???
$num++
81nobodyさん:03/05/17 23:54 ID:???
tu-ka,何の目的で使うかによってやり方も変わりそうなもんだが。
82nobodyさん:03/05/18 00:06 ID:aBq13e5f
質問。

まず、環境はウィンドウズ98です。
ファイルの読み書き追記モード(open(OUT, "+<file.txt");)で,
読み込みと書き込みを同時に行おうと思ってますが、
truncateが使用不可能なため、
seek(OUT,0,0);
truncate(OUT,0);
print OUT $a;
の手法が使えません。
truncateの変わりになる方法を教えてください。
かなり調べたんですが、わかりませんでした。
83nobodyさん:03/05/18 00:08 ID:???
書き込みモードで開く。
84nobodyさん:03/05/18 00:10 ID:aBq13e5f
> 読み込みと書き込みを同時に行おうと
思ってます。

終点のtell(OUT)以下を削除する方法です。
85nobodyさん :03/05/18 00:10 ID:???
ヒマなんで作ってみた
@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; #コレを繰り返しとな・・・
8685:03/05/18 00:12 ID:???
>>85 訂正
my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $seed[$_];
}
}
87nobodyさん:03/05/18 00:13 ID:???
gensym
88nobodyさん:03/05/18 00:18 ID:???
>>82
>seek(OUT,0,0);
これじゃ追記じゃなく上書きじゃないか
89nobodyさん:03/05/18 00:21 ID:???
>>88
読み込んだ内容を編集して上書きしたいと思ってます。
90nobodyさん:03/05/18 00:21 ID:???
>>82
open(OUT, "+>>file.txt");
91nobodyさん:03/05/18 00:22 ID:???
92nobodyさん:03/05/18 00:25 ID:???
>>90 >>91
色々助言いただいてありがとうございます。
いじくってみます。
93nobodyさん:03/05/18 00:26 ID:???
>>92
っていうか、Win98で鯖を立てることが間違っているのでは
94nobodyさん:03/05/18 00:29 ID:???
質問させてもらいます。
自作関数で、引数が不正の場合に、
Perlの文法チェックでエラーを出力させたいのですが、
方法がわかりません・・・
どうすれば文法チェック時に引数のチェックができ、エラーを出せますか?
95nobodyさん:03/05/18 00:37 ID:???
>>77
@dat0 = @dat1 = ();
foreach(0 .. 999999){ $dat0[$_] = $_; }
foreach(0 .. 999999){ $dat1[$_] = splice(@dat0,rand($#dat0),1); }
ではだめ?
96nobodyさん:03/05/18 00:41 ID:???
>>94
ほっといてもSyntaxErrorになるだろ
不正かどうかのエラー処理はプログラマの責任でやるもの
97nobodyさん:03/05/18 00:51 ID:???
>>94
プロトタイプ宣言しろ。

>>96
うぉい。
9885: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;
99nobodyさん:03/05/18 01:09 ID:???
>>95
なぜ、そんな巨大な配列を作るんだ?
コストがかかってしかたないと思うが・・・
普通にfor文でぶん回せば良いと思うのだが・・・
100nobodyさん:03/05/18 01:28 ID:???
100げと
101nobodyさん:03/05/18 01:43 ID:wPiZL/S/
102nobodyさん:03/05/18 01:53 ID:???
srand();
my @salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
my $salt = $salts[int(rand(64))] . $salts[int(rand(64))];

$crypt = crypt($str, $salt);

こういうルーチンだと、暗号化文字列内に「_」は絶対含まれ
ないですよね?
103nobodyさん:03/05/18 01:55 ID:Qi8mxUK4
1kbのファイル10個を1つずつopenしてprintしてcloseするのと、
10kbのファイルをopenしてprintしてcloseするのは
どっちが処理に時間がかかるのでしょうか?
104nobodyさん:03/05/18 01:59 ID:???
だんぜん前者
105nobodyさん:03/05/18 03:23 ID:???
>>102
どんなルーチンかは関係なくcryptの戻り値に「_」が含まれることはない
そもそも、そのルーチンってsaltをランダムにしてるだけじゃないの
10683:03/05/18 05:27 ID:???
>>84
改めて開くんだよ。それくらい理解しろよ。
107nobodyさん:03/05/18 05:30 ID:???
>>93
>>82は鯖を立てているとは言っていないんだが。
108nobodyさん:03/05/18 06:12 ID:???
>>105
ボケボケでした。ご指摘有難うございます。
貴重なご返答有難うございました。
109nobodyさん: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;
110nobodyさん:03/05/18 07:40 ID:???
尼寺へ行け
111nobodyさん:03/05/18 07:43 ID:???
っていうか、while(<IN>) の中でなんでまた<IN>を読んでるの?
112nobodyさん:03/05/18 08:04 ID:???
>>111
仕様です。
113nobodyさん:03/05/18 08:18 ID:???
>>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);
114nobodyさん:03/05/18 10:11 ID:???
>>113
whileのなかでchompする意味なし
115nobodyさん:03/05/18 10:40 ID:???
>>109
>手元の本だと
タイトル希望。
116nobodyさん:03/05/18 12:35 ID:???
>>114
そうでもないぞといってみる。
117nobodyさん:03/05/18 13:06 ID:???
文字列を暗号化してファイルに記録したいんだけど、
どんな方法がありますか?
118nobodyさん:03/05/18 13:24 ID:???
暗号になってればいいだけならmd5とか
119nobodyさん:03/05/18 13:34 ID:???
>>109
俺も本のタイトルが知りたい。どんな糞かと。
120nobodyさん:03/05/18 14:23 ID:???
CGIの本はいっぱい出てるからね
121113:03/05/18 15:56 ID:???
>>114
その通りなんだが、splitを無理矢理1行で書きたかったんでああなった。
実行効率を考えたら、ループの外でやったほうがいいね。
添削サンクス
122nobodyさん:03/05/18 16:06 ID:???
文字列の中から特定の文字がいくつあるか判定したいのですが、

$count += ($com =~s/test//g);
このような方法しか思いつきません。
もっとスマートなやり方を教えて頂けないでしょうか?
123nobodyさん:03/05/18 16:25 ID:???
>>122
それ以上スマートな方法があるのかと。
と言うか、君の言うスマートってどんな意味?
124nobodyさん:03/05/18 16:33 ID:???
>>122
1文字だけのカウントなら tr/文字/文字/ というのがあるけど、
文字列だとそれが一番シンプルにできるんじゃない?
125nobodyさん:03/05/18 18:07 ID:rnV9NZSQ
perlの正規表現についてくわしく説明されているサイトってありませんか?
126nobodyさん:03/05/18 18:12 ID:???
>>125
そのぐらい探せよ・・・
127nobodyさん:03/05/18 18:21 ID:OtatQ8zk
★大人になってから★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
128nobodyさん:03/05/18 18:33 ID:???
129nobodyさん:03/05/18 18:47 ID:???
>>125
当然Google等で調べたんでしょう。
その結果どのページを見ても理解できなかった、と。
諦めなさい。君には無理だ。
130nobodyさん:03/05/18 18:49 ID:???
>>123-124
置き換えを使わずにできるかと思ってました。
$count += ($com =~/test/g); とか・・・
レスして下さってありがとうございます。
131nobodyさん:03/05/18 19:25 ID:???
@lines[0..1000] = `"/usr/local/bin/wget" -q -O - $URL` or die;

こんな事してるんですがどうやら$URLが長いと途中でちょん切れるようです。
"11223344556677889900" → "11223344556677889"
解決できますか?
132nobodyさん:03/05/18 21:57 ID:???
>>130
できるよ
$count++ while $com =~/test/g;
133109:03/05/18 22:15 ID:???
レスありがとうございます。
>111
$data = <IN>; の部分のことでしょうか?
本では$data = $_;となっていますが、これだと全く代入されません。
自分で書き直しました。
マッチしてるかどうか調べる処理の前に余計に読み込んでいるから
交互に検索失敗・成功してしまうのでしょうか?

>113
ありがとうございます。試してみます。
尚、$keycode、$IDともに2桁以上の場合があります。

134nobodyさん:03/05/18 22:29 ID:???
思った事。
>>1-10
のところに、かなり良いサイト書いてある事に今さら気付いた。
十分立派なリンク集。
135nobodyさん:03/05/18 23:00 ID:???
でも質問するやつは絶対に見ないから大して役に立たないリンク集
136nobodyさん:03/05/18 23:07 ID:???
I will use Google before asking dumb questions.
137131:03/05/18 23:08 ID:???
@lines[0..1000] = `/usr/local/bin/wget -q -O - $URL` or die;
の間違いでした、すみません。

$URLの文字数が59ぐらいまでは大丈夫なんですが、68になるとダメです。
138134:03/05/18 23:11 ID:???
>>135
日本語サイトを順番に見ていってるけど、グット!
大変有益な情報が書いてある。読んでて面白かった。
(知ってるサイトが多かったけど)
139nobodyさん: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
141nobodyさん:03/05/19 01:11 ID:???
>>139
print(FILE "@data\n");
142nobodyさん:03/05/19 01:12 ID:???
>>139
>print(FILE "@data\n");

""の中でリストを展開すると、リストの各要素が" "(半角スペース)で区切られて
出力されるから。
print(FILE, @data); のようにすれば大丈夫なはず。
143_:03/05/19 01:12 ID:???
144nobodyさん:03/05/19 01:13 ID:UimoOLmz
>>141
え?どういうことでしょうか?
145142:03/05/19 01:13 ID:???
間違えた。FILE の直後の , は不要だった。スマソ
146nobodyさん:03/05/19 01:14 ID:UimoOLmz
>>142
できました。ありがとうございました。
147nobodyさん: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;
148nobodyさん:03/05/19 11:05 ID:???
>>147
>&jcode::convert(*HtmlErrormessage, "sjis");
レキシカル変数では型グロブは使えない

&jcode::convert(\$HtmlErrormessage, "sjis");
149147:03/05/19 11:08 ID:???
>>148
あいや、まったく未知でした。ありがとうございます。
150nobodyさん:03/05/19 11:13 ID:???
>>149
つか、なんでjcodeを古いやり方で使ってる奴ばっかなの?
しかもなんか中途半端に::で区切ってるし。
151nobodyさん:03/05/19 11:48 ID:???
( ´・∀・`)へー
152nobodyさん:03/05/19 12:18 ID:???
>>150
配布されてるCGIがそう書いてるのを真似してるのかもね。
で、ライブラリの書式が変わったのは理解できても、型グロブのほうは理解できないので
そのまんま。とりあえず動くからいいや、みたいな。
153nobodyさん:03/05/19 12:21 ID:???
>>150
( ・∀・)つへぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜 へぇ〜
154147:03/05/19 12:26 ID:???
>>152
ビンゴ。
155nobodyさん:03/05/19 12:26 ID:???
if (条件式) に使う条件式で、
同じ条件式を何回もいろんなところで使っているのですが、
こういう条件式自体を変数みたいに?1箇所にまとめることって可能なのでしょうか?
156nobodyさん:03/05/19 12:34 ID:???
>>155
可能。
157nobodyさん:03/05/19 12:41 ID:???
どうしたらいいか聞けよ。
$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
158nobodyさん:03/05/19 12:59 ID:???
これだけヒント与えたのに自分で解決できないのか。ほれ。
$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere {if ($hoge =~ /ahodoredorebaka/) {return 1;} else {return 0; }}
#if ($hoge =~ /ahodoredorebaka/) {print "OK!\n";}
159nobodyさん:03/05/19 13:03 ID:???
メールアドレスって
日本語氏名 <[email protected]>
ってなっていることがありますよね。

ここからメールアドレス部([email protected])のみを正確に取り出したいのです。
この処理を行ってくれるperlモジュールをご存じの方いませんか?
160nobodyさん:03/05/19 13:06 ID:???
#mailaddr.pm
$mailaddr=~s/(.+)</$1/;
161nobodyさん:03/05/19 13:11 ID:???
うまく行かない場合はうまく行かないと言え。
$mailaddr=~s/.+<(.+?>/$1/;
162nobodyさん:03/05/19 14:55 ID:???
($address) = $str =~ /<(.+)>/;
なるべくロングに取得
163nobodyさん:03/05/19 15:03 ID:???
>>132
そのような方法があるとは思いつきませんでした・・・
ありがとうございます!
164nobodyさん:03/05/19 15:16 ID:???
>>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/ }
こうしましょう。
165nobodyさん:03/05/19 15:17 ID:???
おっと。セミコロンが必要。
local *matomare = sub { $hoge =~ /ahodoredorebaka/ };
166nobodyさん:03/05/19 15:26 ID:???
同じ条件式っていうことはその結果は決まってるはずだな。

多分、、質問はそういう意味ではなくて、、むむむ、クロージャーか。

my $expr = sub {
my $hoge = shift;
return $hoge =~ /hogehoge/;
}
print 'TRUE' if $expr->('hogehogehoge');

こうしたいのか?
167159:03/05/19 15:37 ID:???
>>160
ありがとうございます。でも機能しません。("<"が一つ取れるだけ)

>>161
ありがとうございます。でもシンタックスエラーです。

>>162
ありがとうございます。動きました。

168nobodyさん:03/05/19 16:34 ID:???
>>75

超遅レスで申し訳ないが。。
その文字がエンコードされて送信されてくるかどうかは
実はクライアント(ブラウザ)に依存する罠・・・

昔携帯向けのサイトを作ったときハマッタ。
i-modeではエンコードされないのにJ-skyではエンコードされて来て
気が付くのに2晩かかったよ。

全てのクエリーストリングをデコードくぐらせるのが吉。。。
169131:03/05/19 16:36 ID:???
>>137はやはり無理なのでしょうか。
170Perl/CGI:03/05/19 18:04 ID:Ob4BWAW/
CGIで、ファイルに書き込みしたいのに、どうしてもこのopen行が原因でエラーになります。
本とかで調べてもあってるはずなのになんでおかしいのでしょうか。

open(INIFILE,"+<$fileini");
close(INIFILE);
ローカルでこの行が入ってるファイルをテストしてみたら、
Unterminated <> operator
というエラーがでてとまってしまうんです。
この行を含まなかったらぜんぜん問題なしなんですけど、この行で全部とまってしまってるんです。
このエラーはいったいどう対処したらいいのか、そしてどう改善すればいいのか教えていただけないでしょうか?
171nobodyさん:03/05/19 19:58 ID:???
>>169
おまえな、それが一体どこがPerlの質問なんだよ。
いい加減気付けよ。
172nobodyさん:03/05/19 20:06 ID:???
>>170
それはファイルを読み書き両方ができるようにオープンしているようだが、
ファイルハンドルから察するに読み込むだけでいいんではないか?

なら、
open ( IN, $file );
open ( IN, "<$file" );
のどちらかで済む話じゃないか?

まあ、フリーのスクリプトか自作かは知らんが、前後の状況がわからんからこれ以上はいえないが。
173131:03/05/19 20:24 ID:???
>>171
すいませんでした・・・
174nobodyさん:03/05/19 20:26 ID:???
>172
INFILEじゃなくてINIFILEだから書き換えたりもするんじゃない?
175nobodyさん:03/05/19 20:30 ID:???
176nobodyさん:03/05/19 20:58 ID:???
質問させていただきます。

$IPAD = $ENV{'REMOTE_ADDR'}
などとして得たアドレスを2進数に変換したいのです、ご指導お願いします。

例えばアクセスした人のアドレスが
202.213.37.74だった場合、
11001010110101010010010101001010
という風に変換させたいのですが、perlでスッキリかくには
どのようにすればいいのでしょうか?

お手すきな方、宜しくご指導お願いします。

177nobodyさん:03/05/19 21:36 ID:???
>>176
$num="202";
$bits = unpack "B8", chr($num); # $bits=11001010
178nobodyさん:03/05/19 21:45 ID:???
179nobodyさん:03/05/19 21:54 ID:???
>>176
$bits = join('', map { unpack('B*', chr) } split(/\./, $IPAD) );
180176:03/05/19 22:53 ID:???
>>177-179
ご指導ありがとうございます。

>>178のページを参考に自分でやって成功したのですが、
>>179さんの方がスッキリしてるので、こちらを使わせていただきます。
助かりました、ありがとうございます。
181nobodyさん:03/05/20 05:07 ID:???
現在perlでRPG作ってます。CGIで相手端末は携帯です。
データは全てサーバーに保存させています。

で、ちょっと効率の良い処理が思いつかないので質問に来ました。
まず、
●武器などのデータはテキストでデータ保存した方が良いでしょうか?
●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?

また、武器によって攻撃力が変わるわけですが、
●起動ごとに攻撃力を算出させた方が良いでしょうか?
●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
俺としては前者のほうが、バグが出にくく、管理もしやすいのですが負荷が多くかかりそうな気がします。

俺は、プログラム経験が浅いのでこの辺の判断がつきません。汗
経験の長い皆様にアドバイスを頂きたくてやってきました。
よろしくお願いします。
182nobodyさん:03/05/20 05:32 ID:???
う〜ん、やっぱこんな一部的なコト書いても誰も答えられないよね。汗
自分で思考錯誤して頑張ります。
183nobodyさん:03/05/20 05:57 ID:???
>>181-182
つーか、思いっきりスレ違い。

ここはPerlスレだ。CGIの質問は他でやれ。
184nobodyさん:03/05/20 06:01 ID:???
use strict;

使うと変数の局所化が出来るようなのでつが
局所化するとパフォ-マンス的にはどうなんでそ?

あと、一般的に配付されてるスクリプトで
use strict;
使ってる物を見た事が無いのですが普通は使わない物なんでつか?
185nobodyさん:03/05/20 06:10 ID:???
>>183
このスレでいいだろ?アルゴリズムの問題なんだから。
CGIだからどーだって事にはならない。GUIだろうとほとんど同じ。

>>184
取り敢えず、厳格な書きかたが出来る。
局所化は、strictとは直接関係ない。
myだと、呼び出されるまで展開されないから軽い。
myはどのパッケージの名前空間にも属さない。

>>181
処理の規模にもよるが、データはテキストのほうが望ましい。
装備している武器などはそのまま保存すると共に、
攻撃力などは武器が変更された時にいっしょに変えてしまえば?
少々めんどうか?この方法は。
まぁ、どんな処理なのか分からんからなんとも言えん。
186nobodyさん:03/05/20 06:11 ID:???
>>184
> 使うと変数の局所化が出来るようなのでつが

できません。

> 使ってる物を見た事が無いのですが

strictモジュールはコードの検査を行うものなので、リリース時にはコメントアウトするか消す人が多いだろうね。
無 駄 だ か ら
187nobodyさん:03/05/20 06:38 ID:???
>>183
個人が持つ物じゃなくて全体に存在してるアイテムって言うのか、そうゆうのは記述内で定義するのが正解だよ。
もし、一つ一つ個性のある、複雑な効果のあるアイテムとかなら絶対に記述内で定義する必要がある。
たんに「値段」と「攻撃力」みたいな感じのデータのみだったら、テキストでデータを書き出しても良いかもしれない。
188nobodyさん:03/05/20 08:52 ID:???
>181
ネトゲ板のCGIブラウザゲースレの奴か?

>●武器などのデータはテキストでデータ保存した方が良いでしょうか?
>●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
数による。
10や20なら中に記述した方がいいだろうが、1000や2000ならテキストデータにした方がいい。
数が多い場合は、テキストを分割する事で検索速度を速めよう。
例えば武器なら、1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
と検索させる方が鯖に優しいのはわかるな?

>●起動ごとに攻撃力を算出させた方が良いでしょうか?
>●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
計算の度合いによる。
足し算の1回2回なら計算させた方がいい。
逆に剰余算や平方根を多用するようなら、保存させた方がいいかもしれない。
これらも計算の頻度やその処理の重さによる。
攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
バグが出た時に、データを一時DLしてから再計算してULし直せるように。
そうすればメンテ性も上がる。

つたないながらもCGIゲー経験者として。
189181:03/05/20 09:52 ID:???
思ったよりたくさん返事が…。ありがとうございます。

>>188さん
>ネトゲ板のCGIブラウザゲースレの奴か?
違うと思います。俺はム板とこの板にしか出現しません。

>1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
>と検索させる方が鯖に優しいのはわかるな?
槍なら槍、剣なら剣と、種類ごとにデータを分けてしまえと言う事ですね?

>足し算の1回2回なら計算させた方がいい。
はい、単純な足し算です。
ですから。起動ごとに計算させる事にします。
そのほうがバグや計算ミスもなく簡単に管理出来そうです。

>攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
>バグが出た時に、データを一時DLしてから再計算してULし直せるように。
ちょっと意味が分からなかったのですがこれは公開後、利用者のデータにバグが出た場合、
こちら側がデータを手動で直しやすいように。と言う意味でしょうか?

もう一つ質問なのですが、
>>187さんが細かいデータをテキストで保存するのはキツイとご指摘下さいました。
確かに「アイテム」や「魔法」などは一つ一つ違った働きをして、仕様出来る場所も違います。
武器や防具の場合はけっこう単純なのですが…。
>>188さんなら、これらをどこで定義しますでしょうか?
やはりテキストに書きますか?

ちなみに、終わった話(処理)ですがモンスターデータは全てテキストに書き出しました。
一行一モンスターの形式で書いたのですが、一行の文字数が300文字以上になって超見にくくなってしまいました。
190nobodyさん:03/05/20 10:06 ID:???
>189
>違うと思います。俺はム板とこの板にしか出現しません。
違うのか、スマン。
ttp://game3.2ch.net/test/read.cgi/netgame/1031450575/115-
ちょうどここで似たような話題があったので勘違いした。
気を悪くしたなら許してくれ。

>こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
大まかに言えばその通りだな。
ただ、本当に手動で100人以上のデータを修正していたら日が暮れるだろ?
それを自動でやってくれるスクリプトをローカル用に組んでおくと後で楽だよと。

>>>188さんなら、これらをどこで定義しますでしょうか?
>やはりテキストに書きますか?
繰り返しになるが、数による。
1000や2000のデータを内部で定義するとメモリを無駄に消費するからな。
俺ならアイテムや魔法のデータをテキストから読み出して、キャラデータと一緒に保存する。
アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
そうすれば普段は50しか読み出しを行なわずに済む。
1000のアイテムを検索するのは、アイテム購入とか、新規でアイテム入手する時だけになるわけだ。
敵からアイテムを拾う場合は、敵データにアイテムデータも一緒に入れる。
あんたのやり方の場合はそれは向かないかもしれないけどね。
結局、システムごとにやり方なんか違うものだと思うぞ。
毎回必ず1000のアイテムを読み込む必要のあるシステムなら、それこそ内部に記述した方がいい。
191181:03/05/20 10:40 ID:???
>>190
なるほど!
大変参考になりました。
>アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
まさにその通りです。

そこで思いついたのですがアイテムや魔法のIDや名前などの簡単に部分はテキストで保存し、
効果は以下のように定義しようと思いました。

#アイテム使用時のルーチン
sub item_001{
my ($item) = q['アイテム使用処理'];
eval "$item";
}
非常に大雑把な感じですが、処理はこんなイメージで進めていこうと思います。
大変参考になる話をありがとうございました。
192nobodyさん:03/05/20 10:41 ID:???
ロックの問題があるから、どうにもテキストファイルを使うのは躊躇してしまう。
データベースの方が鯖に優しくはないが安全だよなあ。
193nobodyさん:03/05/20 10:43 ID:???
楽したいだけだろ
194181:03/05/20 10:51 ID:???
全体のデータ(モンスター集)などは、書きかえられる事がないので安全です。
個人のデータは個人で使っているので、他者と書き込みがかぶる事はありません。

それと、処理全体には一応実行ロックをかけ、
さらに同一人物は5秒以内の連打アクセスが出来ないようほどこしてあります。
(テスト中はジャマなので解除してますけど)
195nobodyさん:03/05/20 13:17 ID:???
ネットゲームの意味が全くねーな。
196nobodyさん:03/05/20 14:21 ID:???
フォームからIDを入れさせて、
入力したIDがあらかじめ用意されたIDと一致してるかどうかで
表示する画面を分岐させたいのですが

現状は、
IDをテキストファイルに
10000
10001
10002
 ・
 ・
という形で入れておいて
ループでIDファイルの一行と入力したIDが一致するか否かで
処理しています
処理が遅いので別の手段をとりたいのですが、
何かいい方法はありませんでしょうか?

IDは8桁のランダムな数字列で、
テストはID5000件と10000件でやりました
197nobodyさん:03/05/20 14:26 ID:???
>>196
ID"だけ"で良いのならば。
ID名でファイルを作成し、ファイルが存在するか否かで処理。
何万件も処理するならDBを利用すべきでしょう。
198181:03/05/20 14:27 ID:???
8桁でしたら、8個のファイルに分けてしまったらどうでしょう?
199nobodyさん:03/05/20 14:29 ID:???
名前消すの忘れてた。
>>しかも197さんのが効率良いし。
200nobodyさん:03/05/20 14:32 ID:wO+tQvft
すみません、初心者の質問答えてやってください。
Perlによる普通の掲示板でログの先頭行のタイトルだけを
取るにはどういう構文にすればいいんでしょうか?
201nobodyさん:03/05/20 14:34 ID:???
>>200
マルチは許せんな。初心者だとしてもだ。
202nobodyさん:03/05/20 14:38 ID:???
>>201
向こうが板違いだと気づいたんでこちらに書き込んだんです。
向こうには謝っておきました。
マルチになってすみません;
203nobodyさん:03/05/20 14:43 ID:???
この板のどっかのスレでも見たような気がしかも数回・・・。

まぁいいや。
HTMLの話です。それ。がんばってHTMLしてください。
※これ以上質問を繰り返さない事。板違いです。
204nobodyさん:03/05/20 14:43 ID:???
なるほど、ファイルで処理するというのは思いつきませんでした
でも5000とかファイルが生成されるのは
何かひっかかるものが…
ちょっとテストしてみてDB使うかどうか考えます

8個ファイル作るというのもシンプルでいいかもしれないですね
これもやってみますです

早いレスどうもです
205204=196:03/05/20 14:44 ID:???
引用NOもレス番も忘れた…

>>204
>>197->>198宛です
206nobodyさん:03/05/20 14:46 ID:???
あ、間違えたごめん。HTMLの話じゃなかったね。
先頭行だけ取る時は
<ファイルハンドル>
って感じで取得すると一行だけ取れるよ。
207198:03/05/20 14:50 ID:???
またやらかした。汗
ファイル8個って意味分からん数字だった。汗
今日は大ボケ連続です。ここら辺でボケてるの全部俺です。

10個にしよう。10個。
一番左の桁が[0-9]で10個。
桁数とファイル数はいっしょにしたらダメだこりゃ。ごめんなさい。
208bloom:03/05/20 15:08 ID:vZIU7+LM
209nobodyさん:03/05/20 15:23 ID:???
後述の関数で、どうも、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;
}
210nobodyさん:03/05/20 16:15 ID:???
$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;

だとちゃんと置換されるのに、、

$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
だと、

$id[0]の値に置換されてしまいます。
これは、どのように改善すればいいのでしょうか?

まだまだ、変数に対する理解が不十分なのでその辺だとは思うのですが、
調べてもわかりませんでした。
211nobodyさん:03/05/20 18:34 ID:???
>>210
よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
(適当な発言です)


ええと、質問にまいりました。
検索しても出てこなかったのですが、指定したサブルーチンが存在するかどうか確かめる方法はありますか?
存在しないルーチンに飛ぶとエラーになってしまうので、存在するかどうか確かめてから飛びたいのです。
(こちらが指定したサブルーチン名は変数のため、目視では解決できません)
212nobodyさん:03/05/20 18:47 ID:???
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);
213bloom:03/05/20 19:08 ID:vZIU7+LM
214nobodyさん:03/05/20 19:46 ID:???
>>211
シンボルテーブルを見るか eval でトラップ
215Perl/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);
}
216Perl/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
エラーがでてとまります。
ご指導、指摘お願いします。
解決策も教えてください。
217nobodyさん:03/05/20 20:07 ID:???
$fileiniの中身は?
218210:03/05/20 20:11 ID:???
>>211
>よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
結果は同じでした(泣)
219Perl/CGI:03/05/20 20:17 ID:nlGr4tqO
>>217
一応$fileiniのなかは
$access="http://www.……";(URLは省略させていただきました。)
に、最初っからしています。
220nobodyさん:03/05/20 20:24 ID:???
>219
httpでファイル指定はできません。
221Perl/CGI:03/05/20 20:32 ID:nlGr4tqO
>220
いや、これはリンクです。
リンク先のアドレスです。
222nobodyさん:03/05/20 20:35 ID:???
>221
じゃあ、
print $fileini;
としたら何が表示されるんだよ。
223Perl/CGI:03/05/20 20:57 ID:nlGr4tqO
>222
CGIで読み出してそのまま使えるようにしてあるので
$access="http://www.……";
というふうにしてます。
224nobodyさん:03/05/20 21:00 ID:???
>223
つまりお前さんは
open(INIFILE,"+<$access="http://www.……"; ");
こうなる事を期待してるのか?

俺が聞いてるのは、「$fileiniで指定された先のファイルの中身」ではなくて、
「$fileiniの中身」なんだが日本語わかる?
225動画直リン:03/05/20 21:08 ID:vZIU7+LM
226nobodyさん:03/05/20 21:15 ID:ITOFryED
ちょいと質問なんだが、
今、アクセス解析つかっているんですが、
ログファイルには
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
          ・
          ・
          ・
          ・

ってなってるんですが、こういう風に複数行ある場合は、読み出して一覧を出力したいんですが・・
具体的に

------------------------------←水平線
アクセス時 : 日時
リファラー  : リファ
ホスト名   : ホスト
IPアドレス  : IP
ユーザーエージェント : エージェント
------------------------------

アクセス時 : 日時
リファラー  : リファ
ホスト名   : ホスト
IPアドレス  : IP
ユーザーエージェント : エージェント
------------------------------

みたいにしたいんですが・・・・
一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
何かいい方法ないでしょうか?
227nobodyさん:03/05/20 21:19 ID:???
>>226
> 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
> 何かいい方法ないでしょうか?
一行ずつ処理すればよいのではないかい?
真相は分からんが。
228nobodyさん:03/05/20 21:21 ID:ITOFryED
>>227
一行ずつ処理ですか・・・
えと、読み込んでforeachにまわすとか?ですか?
すんません、リファレンス1冊買って勉強します。。
ネットでは情報が少ないですよね
229nobodyさん :03/05/20 21:45 ID:???
>>211
無名のサブルーチンを作って、undefかどうかってのは駄目なんだろうな・・・
230nobodyさん:03/05/20 21:54 ID:OOsiMZA+
$idnum = substr($REMOTE_ADDR, 8);
$idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8);
って2ch互換ID?
とテストしてみる
231nobodyさん:03/05/20 22:05 ID:???
IDって統一性はないし、いらないなと思いました。
232nobodyさん:03/05/20 22:26 ID:???
>>226
複数行って意味が分からないが、普通に

my $format = <<'EOM';
------------------------------
アクセス時 : %s
リファラー  : %s
ホスト名   : %s
IPアドレス  : %s
ユーザーエージェント : %s
EOM

while (<LOG>) {
print sprintf($format, split /<>/);
}

とかじゃ駄目なの?
233210:03/05/20 22:47 ID:???
>>210
手元の本みたら、
変数はスカラ変数と配列変数しか使えませんとかいてありますた。

ということは、一番スマートなやりかたは、>>210とするしかないのでしょうか?
234139:03/05/20 23:14 ID:iNE6jQJj
open(FILE, $name);
@data = <FILE>;
で、ファイル読み込む(txtやcgiソース)
そして、編集できるように、
テキストエリアに出力
print "<textarea>@data</textarea>\n";
↑けっこう略

すると、@dataが""で囲まれている?ので、2行目以降の先頭に空白ができます。
この場合はどうすればいいですか?
235nobodyさん:03/05/20 23:26 ID:???
文字列を暗号化しようと思って、いろいろ探してたら、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

236nobodyさん:03/05/20 23:32 ID:???
>>234
open(FILE, $name);
print "<textarea>";
while ( <FILE> ) {
print;
}
print "</textarea>";

237139:03/05/21 00:00 ID:DxtaiKT1
>>236
おぉ。。できました。ありがとうございます
238nobodyさん:03/05/21 00:04 ID:???
初々しくて良い
239nobodyさん:03/05/21 00:04 ID:???
>>234
普通に
print "<textarea>", @data, "</textarea>\n";

または
$" = '';
print "<textarea>@data</textarea>\n";

特殊変数 $" の値を変更することで、ダブルクォート文字列内で
配列を展開するときのセパレーター(要素間に挟み込まれる文字
デフォルトは半角スペース)を好きな文字に変更できる。
覚えておいて損はないよ。
240_:03/05/21 00:05 ID:???
241nobodyさん:03/05/21 00:54 ID:???
>>209
レスがないってことは、この関数の部分はとくに問題ないってことなんでしょうか?
242139:03/05/21 01:10 ID:DxtaiKT1
>>239
それためになります。
ありがとうございます
243nobodyさん:03/05/21 01:12 ID:???
欲しい情報を見つけることが出来なかったので、
ご存じの方がいましたら教えていただきたいのですが。

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に対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。

この問題の解決方法をどなかたご教授下さい。
244nobodyさん:03/05/21 01:14 ID:???
>>243
10 : if ($::ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($::form{'key'} eq '')

こうしてみたらどうよ?
245243: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 と関数が指摘されているようですが、
これらの関数を使用する前に初期化が必要なんでしょうか?
246nobodyさん:03/05/21 01:18 ID:???
>>245
面倒くさい。
できるだけまとめて、ソース晒す事できないのか?
247nobodyさん:03/05/21 01:18 ID:???
>>241
> open(MAIL,"| $MyPathSendmail -t");
を、
open(MAIL,">&STDOUT");
にしてひとまず標準出力に吐き出して確認してみたら?
あと「sendmail -t」を調べてみる。
248243:03/05/21 01:20 ID:???
>>244
ご指摘の通りに変更してみましたが、結果変わらずでした。
警告文のあるeqではなく、そこで扱っている変数に問題があるんでしょうか?
249243:03/05/21 01:21 ID:???
>>246
すみません。部分抜き出して、試せるソースを用意してみます。
250nobodyさん:03/05/21 01:22 ID:???
>>248
ちなみに、-w付けなかったら動くのか?
251243: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'};
}
続く
252243: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);
}
253nobodyさん:03/05/21 01:46 ID:???
>>251-252

気にたった点。
  >(%form) = &get_form('sjis');
  (%form)の()を外した方がよさそう。

  >local($charset) = @_;
  特別な意味がない限りmyを使う事を推奨されてたと思う。
  myの方が早いし。

  >return (%FORM);
  これも()を外した方がよさそう。


・・・力になれなかったかも・・・
スマソ



254nobodyさん:03/05/21 01:48 ID:???
あ、ちなみに、上記ソースで俺の環境(Win2k、Perl5.8)では、文法エラーも何も出なかった。
255nobodyさん:03/05/21 01:52 ID:???
>>243
結論から言えば、何も問題ない。
-w を付けて尚かつ一切の警告を受けたくないということなら
疲れるだけだから止めた方がいいよ。

ちなみに -w をつけると

・一度しか使われない識別子
・値をセットせずに参照されるスカラー変数
・サブルーチンの再定義
・未定義のファイルハンドルの参照
・読み出し専用でオープンしたファイルハンドルへの書き込み
・数値以外を数値として扱った場合
・配列をスカラーとして扱った場合
・深さが100以上のサブルーチンの再帰呼び出し
・その他いろいろ

に該当する時、警告されます。
変数を初期化なしで使うなんてperlでは当たり前のことでも
イチャモンつけて欲しいなら別だけど、普通はデバッグ時に
意図しないで上記のことをしていないか診断したいときにだけ使います。
256243:03/05/21 01:55 ID:???
>>253
ご指摘ありがとうございます。
なるほど、これから気を付けて行きたいと思います。

こちらの環境はRedhat8.0/Perl5.8なのですが、
perlのバージョンは同じようですし。うむぅ。

実行出来ない訳ではないので、黙殺しても良い部分だとは思うのですが。

どうもありがとうございました。
257nobodyさん:03/05/21 01:56 ID:???
>>251-252
その警告の行以外に原因があるようだな

$charsetにlocalをつけておきながら$form_dataや@key_valueを
そのまま使っているし、全体を見ないとなんとも言えないな
258243:03/05/21 02:05 ID:???
>>255
な、なるほど(汗
perlを始めたばかりで、初めのうちから正しい書き方を
身につけようとか思っていたのですが、どうやらそれが
良いことばかりでは無いようですね。

素直に黙殺します。

これからは-wはデバッグ時のみ実行する事にします。

ご指摘いただきました方々、色々とありがとうございました。

>>257
おっしゃる通りです。
警告文が該当している箇所を急いで抜き出したものでしたので。
変数とかの扱いをちゃんと書いて、最終的にもう一度確認して行きたいと思います。

259nobodyさん :03/05/21 02:08 ID:???
$charset自体は指定してるの?
260243:03/05/21 02:24 ID:???
>>259
抜き出したスクリプトでも(勿論、元スクリプトでも)
&get_form('sjis');
とサブルーチンに値を渡しているので、平気だと思います。
実際に元の方の出力はsjisになってましたし。
261209:03/05/21 02:28 ID:???
>>209
にレスがないってことは、関数自体は問題ないってこと?
262nobodyさん:03/05/21 02:30 ID:???
>>261
しつこい!
ダミーで出力して自分で見れ!
263nobodyさん:03/05/21 05:21 ID:???
>>258
use warnings (-w)は別にいつも付けてる必要はないけど、
use strictでコードする癖をつけないと後で泣くよ。
264nobodyさん:03/05/21 07:17 ID:???
コードするってなんだよ。
265nobodyさん:03/05/21 09:11 ID:???
動詞の原型に「する」を付けて日本語化するのは
ポピュラーな方法だぞ?
コーディングする、の方が言葉として変。
266nobodyさん:03/05/21 09:38 ID:???
コードって名詞なんですけど。
灰皿する。
机する。
本する。

ま、どーでもいいけど。
267264:03/05/21 09:43 ID:???
>>265
この場合はおかしいと思わないか?

>>266
一応英語では動詞でもある。でも日本語の中で使う場合は名詞だよなぁ。
268nobodyさん:03/05/21 09:55 ID:???
>>266
怪我する
269210:03/05/21 10:16 ID:???
>>210>>233) ですが、
どなたかファイナルアンサーください
270nobodyさん:03/05/21 10:21 ID:???
>>269
特に問題がないのならそれでOK。

271nobodyさん:03/05/21 11:21 ID:???
んなことどうでもいいし。

perlスレはもうやめたのか。
272nobodyさん:03/05/21 11:29 ID:???
英語の知識に欠ける人間が他人に無知を押し付けるスレはここですか?
273nobodyさん:03/05/21 12:47 ID:???
非常識な人間が非常識なことを(ry
274nobodyさん:03/05/21 15:39 ID:???
>>269
>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>だと、
>$id[0]の値に置換されてしまいます。
正規表現では[ ]は意味を持ってしまうのでエスケープしないと

$in{'mailbody'} =~ s/<id>/$id\[$i\]/ig;
275nobodyさん:03/05/21 16:19 ID:???
>>274
ワロタ
もすこしがむばりましょう。
276nobodyさん:03/05/21 16:50 ID:???
なるほど!と思ったら違うのか…
277Perl/CGI:03/05/21 17:01 ID:XtYsWXu+
>>224
すいません、そういうことでしたか。
$fileiniが指定してるのは
初期設定ファイルのことで、admin.iniの形式にしてます。
んでそのファイルの中身は以前書いたものになってます。
レス遅くなってすいません。
278動画直リン:03/05/21 17:08 ID:JZ9K0e/X
279ど初心者:03/05/21 17:08 ID:???
みなさんどのようにしてPerlを覚えましたか?
私は すぐわかるPerl => 初めてのPerl以降詰まってます。
280nobodyさん:03/05/21 17:46 ID:???
>>279
名前は忘れたけど、地球儀みたいな絵が書いてあるPerl/CGI入門書から入った。
すげー分かりやすく、それだけで、簡単な掲示板が作れるようになった。

「CGIのための 実践入門Perl」
黄色い鍵の絵が書いてある本。
これも、かなり分かりやすい本だった。
俺のバイブル。

「新Perlの国へようこそ」
サルが温泉つかってる絵がかかれてる。
上の2冊読んでたら、理解できるはず。
書いてる事は、ちょっと難しいが、リファレンスやらオブジェクトやら勉強できる。

「ラクダ本」
全部なんて読んでない(w
この関数の詳しい動きが知りたい!
そんな時に開く本として置いてある。
最強の本だけど、いきなりすべてを知ろうとして読むと、
挫折するっぽい。

と、現在中級者のちょっと上レベルの俺が言いたい事は、
「Perlで作るCGI入門 基礎編」 この本は、読みにくく俺にとっては無駄遣いしたとしか思えない
・・・と。
281ど初心者:03/05/21 17:57 ID:???
>>280
了解です!ラクダは辞書的な読み方をすればいいんですね!
進めて頂いた入門的な本も探してみます。
あらっしたぁ!
282210=(269):03/05/21 17:58 ID:???
>>274
>>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>>だと、
>>$id[0]の値に置換されてしまいます。
>正規表現では[ ]は意味を持ってしまうのでエスケープしないと

やっても、結果同じなんですけど・・・・
283nobodyさん:03/05/21 17:59 ID:zxc8lPDx
CGI&perlポケットリファレンス

地味でへたれっぽいけどすごくちゃんとした内容。
ラクダよりも、ちょっとしたリファレンスとしては便利。
284ど初心者:03/05/21 18:01 ID:???
>>283
あらっしたぁ!
買います。
あらっした。
285ど初心者:03/05/21 18:10 ID:???
え〜っと「あらっした=有難う御座いました」です・・・
286nobodyさん:03/05/21 18:31 ID:???
オイラもCGI書くためにPerlを習いだしたけど、
>>283のはすごく良い。

頭で覚えるより>>283のを一冊脇に置いて、
実際に簡単なスクリプト書いてみるのが一番覚えやすい。
こうしたいけどどうしたら良いんだろう?とか
「疑問→解決」が一番吸収しやすいしね。
287nobodyさん:03/05/21 18:52 ID:???
初心者向けじゃないけど
「Effective Perl」
いい本だ
288nobodyさん:03/05/21 19:21 ID:???
↓のスレ、まだあったんだ。オイラが本買うのにだいぶ参考になったスレ。

【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
289ど初心者:03/05/21 20:57 ID:???
>>286->>288
ありがとう御座います。凄く参考になりました。
これをきっかけにパールマスター(パールをマスターした人)を目指してみます。
有難う御座いました。
290nobodyさん:03/05/21 20:59 ID:???
私は、とほほのPerl入門のリファレンスと
ひたすら既存のスクリプト改造で育ったかな。
本はポケットPerlリファレンス買った。
291nobodyさん:03/05/21 21:02 ID:???
ポケットPerlリファレンス=>>283と同じの
適当に題名書いちゃった…(*´ー’
292nobodyさん:03/05/21 21:02 ID:???
>>290
ページごとに完結してるから見やすいのがいいやね。
まさにリファレンス。
293nobodyさん:03/05/21 21:09 ID:???
Perlでcgi組んでてオブジェクト指向してもないのに、
画面遷移図をUMLのステートチャート図で書いてるのって変ですかね?
294nobodyさん:03/05/21 21:12 ID:???
>290
俺はとほほさんとこのをプリントアウトして使ってる。
ちょっと調べたい時とかは、らくだ本みたいに大きくもないし便利。
295nobodyさん:03/05/21 21:53 ID:???
>>98
Unrecognized character \x81 at unique.cgi.
ってでるんですが・・・
296295:03/05/21 21:56 ID:???
解決しますた・・・
297nobodyさん:03/05/21 21:58 ID:???
全角空白が混じってたと思うのだが、解決したならその方法も書いてくれるとありがたい(w
298nobodyさん:03/05/21 22:08 ID:???
>>297
寝ぼけてました・・・後でx81か!って気づきました。
その通りです。先頭に全角スペースがあっただけでした。
299nobodyさん:03/05/21 23:03 ID:???
暗号化で、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);
}

300nobodyさん:03/05/21 23:04 ID:???
上の続き

sub encode {
  my($name)=shift;
  &endecode($name,hex(0x20));
}
sub decode {
  my($name)=shift;
  &endecode($name,-hex(0x20));
}
301nobodyさん:03/05/21 23:20 ID:???
質問。Locationを使って別のページに飛ばしたいんだが、
飛ぶときと飛ばないときがある。なんで?そんなことってあるの?
調べたところ一部のサーバーではLocation禁止というところも
あるみたいだが、うちは飛ぶ。

でも飛ばないときもある…
302nobodyさん:03/05/21 23:26 ID:???
>301
PerlというよりCGIの質問だな。
ブラウザごとに飛ぶ飛ばないを調査して、どういう条件で飛ばなくなるかを
自分なりに調査した方がいいと思うぞ。
あとは出力されているヘッダがどうなってるかを調べてみるとか。
どちらにせよスレ違いだから、調査の上で適切なスレへ行きな。
303nobodyさん:03/05/21 23:30 ID:???
>>302
調査はした。で、同じ条件・同じ方法で飛ばしてみようとしても
飛ぶときと飛ばないときがある…ますますわからない。

ありがとん。
304nobodyさん:03/05/22 00:12 ID:???
>>301
つか、マルチすんな。
305山崎渉:03/05/22 01:55 ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
306210=233=269:03/05/22 05:04 ID:???
>>270
それでOKていうのは、

$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;

でOKってことですか?
というか、それしか、やりようがないということなのでしょうか?
なんかキモイスクリプトだなーと思ったもので。
307nobodyさん:03/05/22 06:23 ID:???
まだやってたのか…
人に聞くより自分でアレコレ試した方が早いことも多いよ?

270じゃないが、
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
で、文法的にも何も問題ない。

置換前に
print "\$i=$i \$id[\$i]=$id[$i]\n";
と一行書いて、変数に何が入ってるか確認。
308nobodyさん:03/05/22 10:15 ID:???
なにこれ。
新種の山崎登場?

とりあえずage
309210: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";
 }
310nobodyさん:03/05/22 11:37 ID:???
>>309
$i以外を使ってみろ!といってみるテスト。
for (0 .. $#email) { # など・・・
それでもだめならPerlのバージョンさらし+環境さらし。
311310:03/05/22 11:40 ID:???
あ、もしかしたら\n含んだ文字列か?>$in{'mailbody'}
そりなら/igs;
312307:03/05/22 12:40 ID:???
>309
ひとつの $in{'mailbody'} に対して、@mail 要素数だけ置換繰り返すの?
置換した結果を置換して、それをまた置換した結果を置換…以下ループ(´Д`;)
まず間違いなくその辺に問題があるんじゃない?

>311
行頭や行末を使ったマッチングじゃないので /s は関係ないぽい。
313nobodyさん:03/05/22 13:26 ID:???
>>299
CGI部分は端折って試したけど、普通に動作したよ。Shift_JISでだけど。
ちょっと見た感じ、print のとこで encodeにもdecodeにも同じ $n 渡してるけど、
decodeには encodeした文字を渡さないと意味ないんじゃない?
ただ両方表示してるだけというなら片方は化けて当然だよね。

それと、普通そういうのはCGIでテストしないで、まずコンソールでテストするよ。
たとえ最終的にCGIにしても。。問題が切り分けられないからね。
314nobodyさん:03/05/22 20:02 ID:???
Perl4の鯖にmy使ったらエラーでまつか?
315nobodyさん:03/05/22 20:52 ID:???
>>314
試せよ。

俺はモジュール使いたいんで、
Perl4しかインストールしてない鯖なんか使う気にならんが。
316nobodyさん:03/05/22 20:58 ID:???
>314
出た
317nobodyさん:03/05/22 21:10 ID:???
perl4の人は、なんでバージョンアップしないの??
あとちょっとで6になりそうなのに・・・
318nobodyさん:03/05/22 21:23 ID:???
>317
プロバが放置してるんだもんよ。
319nobodyさん:03/05/22 21:49 ID:???
>>317

>>318を補足するならば、
・鯖管理者に技術がない
・鯖管理者に暇がない
・バージョンアップして、今動いているものに不具合が出ることを警戒している
などの理由によって放置されている。

320nobodyさん:03/05/22 21:51 ID:???
やめてよー。せっかく5に慣れたのに。
321nobodyさん:03/05/23 00:22 ID:???
スクリプト内でperlのバージョンを取得して
結果と一緒に出力させたいんですが、
%ENVにも含まれてないそうで取得の仕方に困っています。

知ってる人がいたら教えて下さい。
322nobodyさん:03/05/23 00:27 ID:???
$]
323nobodyさん:03/05/23 00:32 ID:???
>>322
出力出来ました。
こんな簡単な質問に答えてくれてありがとうございます。
324nobodyさん:03/05/23 14:42 ID:82gPpiu/
他のサイトからtxtファイルを読み出すようなことってできますか?
open(INTXT, "http://aaa.co.jp/readme.txt");
みたいにreadme.txtファイルを開いて表示したいのですがうまくいきません
325nobodyさん:03/05/23 14:46 ID:???
>324
LWPで検索。
326nobodyさん:03/05/23 14:47 ID:???
ソッケトとか、プロトコルとか、そーゆー言葉知ってますか?
知らなかったら検索してください。
327nobodyさん:03/05/23 14:57 ID:82gPpiu/
>>324>>326
ありがとうございます
その辺をもうちょっと勉強して見ますね。
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
329nobodyさん:03/05/23 15:41 ID:???
>>324
ソケットとか知らなくても似たようなことは出来ちゃうもんなあ
楽してやがるぜ
330nobodyさん:03/05/23 16:21 ID:???
@ArrayCity の要素の中に、$cityが含まれているかどうかを
調べる以下のコードって、もっとスマートにかけませんか?
(あるいはそういう関数ってないでしょうか?)

$city = "tokyo";
foreach $value (@ArrayCity){
if ($value eq $value){
$Flag = 1;
last;
}
}
331nobodyさん:03/05/23 16:46 ID:???
>>330
grep
332nobodyさん:03/05/23 16:49 ID:???
$city = "tokyo";
if(grep(/$city/,@ArrayCity)){ $Flag = 1; }
333nobodyさん:03/05/23 17:29 ID:???
ソートについて質問があります。

(わかりやすいようにチャンネルとテレビ局名を例にしてます)
@channel = (6,1,8,4,10)
@tvname = ('tbs','nhk','cx','ntv','asahi');


っていう配列があって、

これを、
@channelの要素の小さい順に、@tvnameの要素をソートすることって
どうすればできるのでしょう?

要は、
@new_tvname = ('nhk','ntv','tbs','cx','asahi');
を取得したいのですが。
334nobodyさん:03/05/23 17:32 ID:XGb65p6n
なんで連想配列つかわないの?
キーをソートしたらいいのに・・・
335333:03/05/23 18:14 ID:???
>>334
あ、そうか・・・すみません
336333:03/05/23 19:55 ID:???
すいません、やはり、使わないでできる方法ないですか・・・?
スパゲッティ状態で、連想配列に変換しようとしても、うまくいかず。。。
337333:03/05/23 19:55 ID:???
>>336
訂正です
使わないでできる方法→連想配列を使わないでできる方法
338nobodyさん:03/05/23 20:39 ID:???
正直できるか分からないが

my @no = sort {$channel[$a] <=> $channel[$b]} 0 .. $#channel;
my @new_tvname = @tvname[@no];
339nobodyさん:03/05/23 20:57 ID:???
>>338
333じゃないけど、それできたよ、すごい。
340nobodyさん:03/05/23 21:22 ID:???
@tvname[@no]
こういうのはじめてみた。勉強になった。
341nobodyさん:03/05/23 21:57 ID:???
>>338
さすがperlだな・・・
342nobodyさん:03/05/23 22:15 ID:???
一応ハッシュに変換する方法も書いておくと、これまた強烈なんだけど、

@tv_table{@channel} = @tvname;
@new_tvname = map $tv_table{$_}, sort {$a <=> $b} keys %tv_table;
343nobodyさん:03/05/23 23:01 ID:???
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";
344343: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で宣言しておかないとダメなのでしょうか?
345nobodyさん:03/05/23 23:59 ID:???
>>340
配列スライスってやつだよ。
346345:03/05/24 00:02 ID:???
ああぁ。。俺は>>338じゃないっす。一応言っとかないと。
配列スライスは例えば($second, $third) = @array[2,3]; とかできるっす。
347345:03/05/24 00:07 ID:???
($second, $third) = @array[1,2]; だ・・・鬱氏
348nobodyさん:03/05/24 00:10 ID:f0Btk8DH
「orgid(シリアル番号),planid(外部キー),countryid(外部キー),orgname」
っていう列を格納しているCSVファイル(DBではないのです(泣))があるのですが、
それに対して、
「select * from orgmaster where flagplan=1 ordeby planid countryid」
した結果をはき出したいと思ってますが、とんとわかりません。

どのようにすればいいのでしょうか?

なお、DBD::CSV は使えない環境です・・・
349nobodyさん:03/05/24 02:21 ID:???
>>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__
350nobodyさん:03/05/24 02:40 ID:???
>>345 捕捉thx

>>343-344
Perl4?
Perl5ならリファレンスでいけると思うけど。

後、use varsは使わない方がいいと思う
351nobodyさん:03/05/24 02:42 ID:???
被った__| ̄|○
352nobodyさん:03/05/24 05:09 ID:???
なんで?
353343:03/05/24 08:00 ID:???
>>349
御指南ありがとうございます。
せっかくいただいたのですが、今は試せる時間が無いので今日の夜にでも自分トコで使ってみます。
外部にサブルーチン持たせる時はそういう使い方でしたか…
あの長ったらしい分がここまで短くなるとは、奥が深いです。

>>350
失礼しました。
環境はPerl5.008です。リファレンスというキーワードで勉強してみようと思います。

use varsは色んなperlの解説サイトで、strict宣言するときに…
みたいな事がかかれていたのですが、使わない方向で頑張ってみます。
354nobodyさん: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が呼び出された回数は記録できるんですが、私はダウンロードされた数が知りたいんです。
どうすればいいですか?ダウンロードが完了したらカウントアップってのをしたいんですが・・・
355nobodyさん:03/05/24 18:03 ID:???
質問です。

例:
$value1 = 'http://www.yahoo.co.jp';
$value2 = 'Copyright (C) 2003 Yahoo Japan Corporation. All Rights Reserved. ';

この場合、$value1 と $value2 には大文字小文字の違いはありますが、yahooの文字列が両方ともに存在します。
このように、$value1 と $value2 を比較して、なかに同じ文字列が存在する場合に真とすることって可能なのでしょうか?
例ではyahooが同じ文字列ですが、実際は何が同じ文字列になるのかわからないこととします。
356nobodyさん:03/05/24 18:17 ID:???
>>354
Location:
で飛ばさない方法というのは如何でしょうか?

>>355
可能です。

と、答えると逆ギレされるのだろうか?
この世の中ってば、ほんと怖いです。
ま、「1文字一致」っていうのもあるから許されますよね?ね?ね?
357nobodyさん:03/05/24 18:18 ID:LfXTm2oZ
358354:03/05/24 18:20 ID:CEfAWsDp
>>356
ロケーションで飛ばさない、、といいますと??
ほかに方法がありますか?あればぜひご教授ください。
359nobodyさん:03/05/24 18:29 ID:???
>>358
:../ip/ip.zipの内容をCGIで吐けってことだろ。
最後まで吐ききればダウンロード完了っつーことで。
360354:03/05/24 18:32 ID:CEfAWsDp
>>359
ファイルの中身をcgiに記述する、、、ということでしょうか?
ぜんぜんわかりません、ごめんなさい。
もう少しわかりやすくお願いできますか?
361nobodyさん:03/05/24 18:36 ID:???
>354
どちらにせよ、「DLを試みた回数」はわかっても、「DLを完了した回数」はわからないよ?
途中で回線切断されたら終わりだし。
362354:03/05/24 18:41 ID:CEfAWsDp
>>361
そうですか。。。
途中で切断でもいいので、「保存」を押して転送が開始された時点でのカウントでもいいのですが・・・
363nobodyさん:03/05/24 18:42 ID:???
>>360
ダウンロードカウンタでも落としてきて参考にしなよ
364354:03/05/24 18:44 ID:CEfAWsDp
>>363
わかりました。探してみます
365354:03/05/24 18:56 ID:vyZFmtfU
うーん、5.6個みてまわったんですけど、cgiのクリックされた時点でカウントするタイプみたいですね。
、、これであきらめます。
366nobodyさん:03/05/24 18:56 ID:???
>362
CGI使わずに、鯖のアクセスログとか見た方が鯖に優しいぞ。
367nobodyさん:03/05/24 19:16 ID:4X2MnE2O
【ITスクール】

ITスクールを開催しています。
スクール形式は1dayパックで3時間だけです。
授業料金は安く、即、実践へ活用できます!

http://homepage3.nifty.com/it3s/index.htm
368nobodyさん :03/05/24 19:58 ID:???
>>362
formを使って、ソレをカウントしてそれからロケーションに飛ばせばいいんじゃないの?
369355:03/05/24 20:11 ID:???
>>356
> 可能です。
そうですか。。。
漏れにはその方法がわからないけど、こんな風なのはどうか評価してください。

連続する5文字が両方にあったら真とするということに勝手にします。
で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
次に2文字目から6文字目までの5文字を配列に入れる。
以下繰り返し。
最後に@value1、@value2の比較。

駄目でしょうか?
2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
370nobodyさん:03/05/24 21:11 ID:???
371nobodyさん:03/05/24 22:21 ID:???
>>360
ちょっと俺が間違ってた。
CGIで吐くんじゃなくて別のポートを見張るサーバを別に立てて、そこへ向けてLocationで飛ばす。
で、送出できたバイト数を数えればダウンロードできたかどうか分かる。
簡易HTTPサーバ作るってこと。
372356:03/05/24 22:27 ID:???
>>369
> で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
あのぉ、、、(汗)
> 駄目でしょうか?
さすがに「しゃーねーなぁ、、、それでいこか。」とは口が裂けても云えませんm(_ _)m
> 2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
さんざん既出だとは思うが、文字コードを云々・・・

「検索アルゴリズム」
いっぺんこれでググってみると新しい道が見つかるかもよ。道は険しいけれども。
(「木」「ハフマン」「辞書」とか出てくるかもしれんが@「圧縮」も似たようなもん)
373nobodyさん:03/05/24 22:46 ID:???
>>355
if ($value1.$value2 =~ m/(.+).*\1/i) {
my $word = $1;
if ($value1 =~ /$word/i && $value2 =~ /$word/i) {
print $word,"\n";
}
}

こういうのはいかが?
374nobodyさん:03/05/24 22:47 ID:???
藻前、自分ができないからって、逃げるなよ。
375nobodyさん:03/05/24 22:48 ID:???
>>373のままでは色々問題あるのでその辺は適当に処理してくれ
376nobodyさん:03/05/24 22:49 ID:???
>>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; # 無かった
}
377343:03/05/25 00:49 ID:???
>>349
お礼が遅くなり、申し訳ございません。
無事にサンプルスクリプトを動かす事が出来、それを踏まえて自分のスクリプトでやりたい事が実現できました。ありがとうございます。
しかし、上記のサンプルコードでプラス変数を追加し、文字列変換の def 部分をその変数で置き換えた場合にエラーが出てしまいました。
変数を表す場合は、@{$_[3]}ではダメだとまでは判別できるのですが、実際の表記の仕方が見当もつかない状況です(連想配列の場合もそうなんですが)

そこで、答えそのものではなくても、strict使うのであればここを読め、の様なサイトはないでしょうか?
>>4のサイトを全て回りましたが、普通に*で渡すようにとの解説ばかりでした。
378349:03/05/25 01:32 ID:???
>>377
use strict 以前の話なのですよ。343さんがハマってる部分は。
むしろ use strict は全然関係無し。

まず * が何を表していて、何故 \ が出てきたか、@{ } は何を
しているのか、どうしてこのコードで引数に渡した配列そのもの
の値を置換する事ができるのか。そういう点を全部読み解き、
理解しましたか?

あと、エラーが出た場合はどんなエラーが出たのか言って
くれないと、何が悪いのかサッパリ見当付かないですよ。
379nobodyさん:03/05/25 01:54 ID:???
>>4のサイトでなくて個人的にお勧め っ・∀・)っ ttp://www.rfs.jp/
380343:03/05/25 02:15 ID:???
>>378
ご指摘ありがとうございました。
ご指摘いただいている箇所の理解が全然足りないようです。
先ほどから検索をかけて、
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
あたりが見つかりましたので、そこを熟読して、あと手元に青ラクダ本がありますので、
シンボリックリファレンス項目あたりも熟読してから再度チャレンジしてみようと思います。

それと質問をする側として必要な情報の提示を怠り、申し訳ありませんでした。

自分の理解を深めてから再度頑張ってみます。

>>379
お勧めサイトありがとうございます。
色々と載っていて、とても役に立ちそうです。
381nobodyさん: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
382nobodyさん:03/05/25 15:17 ID:???
>>381
困ったことに同一環境で正常に動作しました。
テスト方法は、上記のスクリプトの先頭に、
print "Content-type: text/html\n\n";
$year = "2003"; $month="5"; print "$year $month\n";
を追加して、$monthを変更しつつ数回実行。
383381: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のディレクトリが作成できるのに
なぜスクリプトからだとできないのだろう・・・
384nobodyさん:03/05/25 16:33 ID:???
>>383
die使わなければいいだけでしょ。
エラー処理じゃなく分岐したいだけでしょ?
ファイルテスト演算子の-eでディレクトリがあるかどうか判別したら?
385nobodyさん:03/05/25 16:42 ID:???
質問です。
以下のURLにある、商品名とメールアドレスを入力してボタンを押すと、検索結果を入力した
メアド宛てに送信するというシステムがあるのですが。

該当ページURL
ttp://www.hakuraiya.way.cc/quote.html(海外の薬を個人輸入代行する業者のページです)

で、ソースを見ると
http://www.hakuraiya.way.cc/cgi-local/order/quotemail.cgi
こういうCGIに入力データが送られ、検索処理後にメール送信しているようなのですが、これは
どういう風に動いているんでしょう?
入力されたデータを処理し、予め用意した商品リストと照合・検索して、結果をメール送信する
わけなので、最低でも処理用CGIスクリプトと商品データファイルが必要なところまでは理解
出来るのですが、仕組みがイマイチわかりません。

スクリプト名等で検索しましたが全くHITしないし、こういうシステムは商用&有償なのは想像が
つきます。私自身はこれで商売をしようという気持ちはなく、自分のCGIの勉強の教材にしたいと
考えているので、以上のシステムに心当たりがある方、または「こういう風にスクリプトを組んで
いるんじゃないか?」という風に教えてくださる方、どうかご助力ください。
よろしくお願いします。
386nobodyさん:03/05/25 16:48 ID:???
>>385
>入力されたデータを処理し、予め用意した商品リストと照合・検索して、結果をメール送信する
仕組みは自分で答えを言っちゃってるじゃん
検索スクリプトの結果をブラウザに返す替りにメール本文にするって
そんなに難しく考えることじゃないと思うけど

こんなCGI探してますスレッド ver.9
http://pc2.2ch.net/test/read.cgi/php/1051456859/l50
ここのリンク集を探せばあるかも、あるいはないかも
387nobodyさん:03/05/25 17:20 ID:???
>>385 >>386
>いらっしゃーい、Perlのコーディングで困ってる人のスレです。
388nobodyさん:03/05/25 17:29 ID:???
>>387
アルゴリズムに関する質問はスレ違いじゃないみたいよ。
最終的にはコーディングを目標にしてるみたいだからいいじゃん。

>>385
リンク元は見てないけど、結果を表示しつつsendmailでメールを送ればよろしい。
難しいことじゃないよ。
389nobodyさん:03/05/25 17:30 ID:LMu0ezCc
if($_ =~ /filename\=.+?\.(.+)?\n/i || $_ =~ /name\=.+?\.(.+)?\n/i){
}
こういうif文を書くと、1番目と2番目の(.+)はそれぞれ$1、$2と
なるのでしょうか。
それとも両方とも$1となるのでしょうか。
すみませんが教えていただければ幸いです。
390nobodyさん:03/05/25 17:37 ID:???
>389
なぜ試さない?
391389:03/05/25 17:53 ID:???
>>390
あぁ?知らねぇよ。お前アタシが敬語使ってんだから敬語使えよ。
バカじゃねぇの?つかお前書き込むなよ。キモい。

392nobodyさん:03/05/25 18:04 ID:???
>>383
>>384の言うとおり、dieを使うとその時点でスクリプトが終っちゃう。
手元のリファレンスによると、孫ディレクトリは子ディレクトリが無いと作れないみたい。
どうしてもやりたい場合は、File::Pathモジュール使うとよい、とあった。
393nobodyさん:03/05/25 18:35 ID:???
>>390
そこに試す環境がなかったので、質問させていただきました。
友達に聞かれて答えられなかったので。
会社にに戻って試してみましたので、すみませんでした。
おっしゃるとおりです。
ちなみに。>>391は偽者ですので。
この書き込みも、会社から書き込めないことから、友達の家
より代理書き込みしてもらってるので、IDでわかるかと思います。
394385:03/05/25 18:48 ID:???
>>386>>388
レスどうもありがとうございます。

>>386
>検索スクリプトの結果をブラウザに返す替りにメール本文にする
ああ、なるほど!そうすればいいのか。仰るとおり、難しく考えすぎていました。

>>388
こちらも、ヒントありがとうございます。上に書いたとおり、難しく考えすぎていたので
胸のつかえが取れたような気分です。助かりました。

お二方のレスを参考に、検索+sendmailのスクリプトを探して、組み込み改造など
頑張ってみたいと思います。本当に、どうもありがとうございましたm(_ _)m
395381:03/05/25 22:28 ID:???
>>384
>>392
丁寧にありがとうございました。
if文などで試してみます。
396nobodyさん:03/05/25 23:52 ID:???
K0NTタンのCGIはグローバル変数を使いまくって
そして使わなくなったものを undef していないから
メモリを大量に使ってしまうのですか?
397nobodyさん:03/05/26 00:21 ID:???
>>396
変数のスコープを抜けたら、OSにメモリを返すとでも言いたいのか?
398nobodyさん: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,}/;
上はどうでしょう?
ご意見おながいします。
399398:03/05/26 00:27 ID:???
間違えました

誤 \1
正 $1

です。
400nobodyさん:03/05/26 00:33 ID:???
>>398
CGIモジュール使えよ。
CGI_Liteでもいいけどさ。
そんなくだらないことで悩まなくてすむようになるんだから。
401398:03/05/26 00:39 ID:???
知りませんですた。
ググってきます。
402398:03/05/26 01:20 ID:???
>>400
CGI.pm がこんなに素敵なヤツだったなんて
正直、感動しますた。
ありがd
403398:03/05/26 01:27 ID:???
さらに質問でつ。
http://pc2.2ch.net/test/read.cgi/php/1024795138/383
で質問したんですが誰もいないみたいなので
こちらで誰か教えてください。
おながいします。
404398:03/05/26 01:43 ID:???
もっと質問でつ。

use CGI;
$query = new CGI;

と書いたときモジュールが使えなかったらエラーになりますか?
それとも

if($query){}

と、できますか? どうなんでしょう?
405nobodyさん:03/05/26 03:14 ID:???
>>404
自分の環境で実際に動かしてみればわかるだろ

use CGI;
の時点でエラーが出る。
406nobodyさん:03/05/26 03:15 ID:???
今時CGI.pmが入ってないなんてことは無いか
俺も相当アフォだな、、、逝ってこよう。
407nobodyさん:03/05/26 03:45 ID:???
>>403
evalを使うのにそういう書き方自体が無駄
408380: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;
を使う。という方法以外で一般的な方法というのは無いのでしょうか?

409380じゃないです:03/05/26 04:07 ID:???
あらっ?
名前入力してしまいましたが380は間違えです。
410_:03/05/26 04:16 ID:???
411nobodyさん:03/05/26 05:14 ID:???
>>408
改行コードと文字コードは別物だぞ。
文字コードは、SJIS。 改行コードは、LFにすれば問題解決。
412nobodyさん :03/05/26 05:19 ID:???
>>408 $dataつーのが、最後に改行が有るものと仮定するとして・・・

$data =~ tr/\x0d\x0a//d;
が高速。
413nobodyさん:03/05/26 06:37 ID:qholo4T7
ユーザごとにリストボックスの項目数を変えるよな
ことを考えてるのですがこれって実現可能ですか。
リストで表示させる項目を一つの変数の中にまとめて
"a","b","c"と書いても実行するとリストは"a","b","c"と
繋がって表示されてしまい1項目しかでなかったものでして。
ある人は10個項目でててある人は5項目でてるような
ことがしたいのです。
414nobodyさん:03/05/26 09:30 ID:???
>>413
マルチポストはやめましょう。
415nobodyさん:03/05/26 10:06 ID:???
>>413
言ってる意味がよーわからんので推測でだが、出来る。
ユーザごとに指定した数を指定しておいて、配列をその数だけ
回すなりなんなりでいいんじゃん?
416nobodyさん:03/05/26 10:19 ID:???
>>114
添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが

>>119
$?
417nobodyさん:03/05/26 10:20 ID:???
レス番号激しく間違えた…スマソ

>>414
添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが

>>419
$?
418nobodyさん:03/05/26 10:36 ID:???
>>417
で、今度は誤爆?
419nobodyさん:03/05/26 10:36 ID:???
>406
未だにPerl4の鯖だってあるんだよ。
420nobodyさん: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};
}

というようにまわしたいのですが、
★ここが不明★の部分がわかりません。どうすればいいのでしょうか?
421bloom:03/05/26 11:08 ID:gUjk1KcM
422nobodyさん:03/05/26 11:13 ID:???
>>420
ソフト・リファレンスでググってみ。
423420:03/05/26 11:42 ID:???
>>422
がってんわかりました。ありがとうございます。
424nobodyさん:03/05/26 12:52 ID:???
$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]

みたいに表示さすにはどうすればいいのでしょうか?
425408:03/05/26 13:58 ID:???
>>411
そーだったんですか・・・知らなかった(-_-;)
>>412
それ使わせてもらいます。
どうもありがとうございました。
426nobodyさん:03/05/26 14:22 ID:???
Perlのgrepって、小文字大文字の区別をなくすオプションってないんでしょうか?
427426:03/05/26 14:23 ID:???
すいません、ありましたね。iオプションで。
手元のリファレンスには何にもかいてなかったもんで
428nobodyさん:03/05/26 15:09 ID:ave5j164
例えば、
http://www.2ch.net/dir/file.txt
という文字列を、
/dir/file.txt
のようにするにはどちらが効率的なんでしょうか?

# 正規表現のみの場合
$url =~ s/http:\/\/.*?\//\//i;

# 関数も使う場合
$url =~ s/http:\/\///i;
@temp = split(/\//, $url);
shift(@temp)
$url = "/" . join("/", @temp);
429nobodyさん:03/05/26 15:32 ID:???
>>428
どちらでも好みの方を。
速度が速い方が良いなら、100回くらいループさせてベンチ取ればいい。
430nobodyさん:03/05/26 15:49 ID:???
431424: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なんて書式の意味も、書いてないし。。。
この書式で探したのですが、わかりませんでした。。。
どういうことなのでしょうか?
432356:03/05/26 20:54 ID:???
>>431
> print sort @george, 'to', @harry; の意味がわかりません。
結果からして、
print sort((@george,'to',@harry));
なんぢゃないかなと逝ってみる震度6弱。
433nobodyさん: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'}")
こうすると、すべてパスワードが違うとでます。フォームから渡せてないんでしょうか?
434nobodyさん: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
436431:03/05/26 21:21 ID:XWjbOab7
>>432
あー。。。了解すますた。
437nobodyさん:03/05/26 22:23 ID:???
>>433
後者でもちゃんと &ReadParse; やってる?
438nobodyさん:03/05/26 22:32 ID:haPyfOxB
>>437
え?&ReadParseって、cgi-libのライブラリのでしょ?
$in{'password'}
こうやったらライブラリいらないんじゃないんですか?
どっちにしてもライブラリはいるんですか?
439nobodyさん:03/05/26 22:43 ID:???
>>438
なんかねぼけたこと言ってる奴だな……

PerlはCGI専門言語じゃない。
ブラウザのフォームから送られたデータを取得するには、
それ相応のステップをふまなければならない。
なにもしなければ、%inは空のままだ。
当たり前だ。何もしなかったんだから。

顔洗って出直してきなさい。
440nobodyさん:03/05/26 22:48 ID:haPyfOxB
>>439
そんな・・・
方法を教えてください。お願いします
441440:03/05/26 22:51 ID:haPyfOxB
あまったれてすいません。検索すればいくらでもでてきますね。
要はPOSTの場合
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
で読み取って、splitできりきざんでやればいいんですね。
442nobodyさん:03/05/26 22:55 ID:???
つうか、&ReadParse使えば?
443440:03/05/26 23:02 ID:haPyfOxB
>>442
それでもいいんですけど、あんまりライブラリを使うのが好きじゃないんですよ・・・
全部で10行くらいだから中にいれてもいいかな〜って・・
444440:03/05/26 23:04 ID:haPyfOxB
何回も書き込みすいません。
cgiを使う側の場合、
・cgiソースは簡潔がいいからライブラリ使う。
・ソースが多少多くてもいいからライブラリはできるだけさける。
どっちがいいんですかね?
445_:03/05/26 23:09 ID:???
446bloom:03/05/26 23:10 ID:gUjk1KcM
447nobodyさん:03/05/26 23:24 ID:???
やっぱり何か寝ぼけてるなぁ・・・
448nobodyさん:03/05/26 23:28 ID:???
>>444
人によって違うんじゃないかな。何を求めるのかによって。
ここで判断をあおぐようなことじゃないと思う。

449440:03/05/26 23:33 ID:haPyfOxB
>>448
そうですね。レスサンクス。
realParseだけなんで中に書きます
450nobodyさん:03/05/26 23:36 ID:x8s60k6p
目的によってシステムを構築しなさい
その際、じっくりと頭の中でシステムを描きなさい
そうすればおのずと答えは出てきます
451nobodyさん:03/05/27 00:16 ID:???
>>444
マジレスするなら……

俺は開発速度を優先するべき状況にいるので、
ライブラリはとことん利用する立場だ。
Perlの場合はモジュールが便利だ。CPANを見るべし。

ライブラリを使えば、ソース自体を短くすることができ、
短いソースは同時にバグの入る確率が少なくなることを意味する。
副次的にバグの絶対数を下げる効果も期待できる。
(ライブラリにバグが入ってたらどうしようもないが、
 自分よりも能力のある人間(作者)を信じて突き進むのみだ)

ま、好きにしろい。
452nobodyさん:03/05/27 00:18 ID:LZ3W66wZ
>>438
いると思う。
自分でフォームデコード書くならいらないけど。
453452:03/05/27 00:22 ID:LCoN4Nuw
しくった。

漏れは勉強がてら、
ライブラリに頼らず自分でコード書く。
454424: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
456nobodyさん:03/05/27 01:10 ID:???
457454:03/05/27 01:28 ID:tldcRAHy
>>456
あー、それですねー。実は前に読んでちんぷんかんぷんで、
そのままにしてました。。。
しかし、今読んでもちんぷんかんぷん。。。
(わからない用語ばかりで、用語を調べるとよけいにわからなくなる(泣))

もしよかったら、恐縮がですが、
($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5])
を配列として表す方法を教えていただけませんjか?
そしたら、演繹的に勉強していきますので・・・。
458nobodyさん:03/05/27 01:49 ID:???
>>454
データ形式を見直したほうがいいのでは……
それと、$ORG{}[0]の要素が未定義じゃマズいでしょ。それもソートの対象になるんだから。
459454:03/05/27 01:59 ID:tldcRAHy
>>458
あ、ほんとですね。。。ありがとうございます。
460nobodyさん:03/05/27 02:25 ID:???
>>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" ← @{} で配列としてデリファレンス

これでもう分かるよな?
461457: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:???
463nobodyさん:03/05/27 11:43 ID:???
>>461
次はsortの動きについて勉強しようね。
誰か、心優しい人はどぞ。↓
464nobodyさん:03/05/27 12:10 ID:???
>>461
まず「コンパイルエラー」みたいな曖昧なエラー名はやめよう。
必ず表示されたエラーメッセージを正確に書くこと。

そのソース、実行してみたけど syntax error at hoge.pl line 7, near "})" とか、
あまりに初歩的なミスをやってる。foreach の使い方もヘン。
データの管理法も、あまりソートとかに向いてない形式だから変えたほうがいいと
個人的には思う。
漏れも試行錯誤してみたが、データを一度結合してからソートして、ループ内で
また分割するという非効率な方法しか思いつかなかった。
465461:03/05/27 13:03 ID:???
>>464

KCatch.pmを使っていたのですが、
コンパイルエラーとしかいってくれなかったので、そういうもんだと思ってました。。。
すみません。

別のものに変えてみようかしら
466nobodyさん:03/05/27 13:09 ID:???
>>465
kcatchってそういうもんなの?
CGI::Carpを使ってみては。(使い方はぐぐってね)
もっとも、コマンドラインで実行させるのが一番手っ取り早いんだけど。
467nobodyさん:03/05/27 13:14 ID:???
「ぐぐって」とは?
468nobodyさん:03/05/27 13:16 ID:???
>>467
googleで検索して
http://www.google.co.jp/
469465: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(以下略)」と・・・
なんでだろう
470nobodyさん:03/05/27 13:33 ID:???
ソース晒せ
471465: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>|;
}
472nobodyさん:03/05/27 14:02 ID:???
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しか出なかったの?
っていうか、あなたの実行環境ってどんなん?
473463: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,
};

つづく
474463: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);

こんな実行結果がお望みですか。
タブは見やすいように全角スペース
475nobodyさん:03/05/27 14:22 ID:Z3njAYJb
>foreach ($key {sort { @{$ORG{'adanaid'}}[$a] <=> @{$ORG{'adanaid'}}[$b] } @{$ORG{'adanaid'}) {
@{$ORG{'adanaid'}) いっこ括弧閉じが足り無くない?
476nobodyさん:03/05/27 14:26 ID:???
>>475
それでも動かない罠
477_:03/05/27 14:33 ID:???
478nobodyさん:03/05/27 17:02 ID:Ahi5sL61
スミマセン、質問です
Jcodeモジュールの使えないサーバーで
Unicode(UTF-8) -> Shift JISの変換を行いたいのですが
どうすればよいでしょうか?
479nobodyさん:03/05/27 17:18 ID:???
>>478
CJKVConv.pl を使うとか
480nobodyさん:03/05/27 17:56 ID:???
>>478
実はPerl5.8の鯖で、Encodeモジュールが入ってるとか。
481478: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"などにしても作ることが出来ませんでした。

どなたかお答えを願います。
483nobodyさん:03/05/27 19:42 ID:???
mkdir
484名前はまだ無い:03/05/27 20:03 ID:???
ありがとうございます
485469:03/05/27 20:33 ID:CEAVaVCK
>>472

2つのサーバで試したんですけど、syntax error at とかいってくれないですねー。
両方ともFreeBSDなんですけど、関係ないですよねー・・・
486471:03/05/27 20:35 ID:???
>>473-474 さんありがとうございます。
なるほどーーーです。
変数の一元目にソートするものを持ってくるわけですね。

アルゴリズム考えるのに、foreachのところばかりにとらわれてました。
もっと全体的視点からアルゴリズムを考えないとだめですね。

ありがとうございます。コード参考にさせていただきます。
487動画直リン:03/05/27 21:10 ID:77ADrmTJ
488nobodyさん:03/05/27 22:20 ID:???
>>485
ちょっと呆れた。

鯖で実験すんなよ。
他人の物で無限ループとかのひどいバグがあるかも知れないプログラムを走らせようとするな。
そういうのは、ローカルでしっかりチェックしてから鯖にあげるもんだ。

まずローカルにPerlをインストールすること。(WinならActivePerl)
スクリプトのバグがあるかどうかのチェックは、
1.MS-DOSプロンプトを開き、
2.スクリプトのあるディレクトリまで移動し、
3."perl スクリプト名"と入力する。

CGIを実行しようとすると、うまく行けばHTMLが吐き出されるはずだし、
バグがあればエラーメッセージが出て止まる。

自分の尻拭いは自分でできるようになろう。
489nobodyさん:03/05/27 23:22 ID:???
16777215(\xFFFFFF)以上の文字を
$num = sprintf("%X", 116777215);
のようにして16進数に直そうとすると、全て\xFFFFFFになってしまいます。
どうしたらいいでしょうか?
490nobodyさん:03/05/28 00:45 ID:d/eWTjVe
@array = qw( apple orange banana angle tv home ・・・・・・・ );

のようになっている配列に対して、anにマッチする要素の
インデックス番号(上の例なら 1, 2, 3 ・・・)を得たいのですが
ループを回さずに綺麗にできる方法はないでしょうか?
491nobodyさん:03/05/28 00:55 ID:???
>>490

my $count;
my %temp = map { $_, $count ++ } @array;
@result = @temp{grep { /an/ } @array};

こんな感じかなー。インクリメントのあたりが怪しいけど。
492nobodyさん:03/05/28 01:07 ID:???
>>491
難しく考え過ぎ。
@array = qw( apple orange banana angle tv home );
@result = grep $array[$_] =~ /an/, 0..$#array;
493nobodyさん:03/05/28 01:30 ID:???
>>489
$number = 16777215(\xFFFFFF)以上の文字;
$num = sprintf(qq{%04X%04X},int($number/0x10000),$number%0x10000);
みたいな。
494490:03/05/28 01:43 ID:???
>>490-491
ひたすらgrepかmapを眺めていて、どちらかでできそうだと
思っていたのですが、全く思いつきませんでした。
まだまだ修行不足でした。ありがとうございました。
495nobodyさん:03/05/28 03:57 ID:???
他のサーバーにあるファイルをhttpで読み込みたいんですけど、
それを解説してるページってあります? ぐぐっても見つかんなかった。


496nobodyさん:03/05/28 03:58 ID:???
フォームから受け取った値から、下記の記号を取り除こうとすると、
if($name eq "ほげ"){
if($value =~ tr/;<>*|`/&$!#{}:;'"$//){
$error[n] = "エラーだぴょん";
$errorh = "1";
}
}

カタカナなんかもエラーの対象になってしまうのであります。
なんでなの?
497nobodyさん:03/05/28 04:03 ID:???
>>496
エスケープ
498nobodyさん:03/05/28 04:17 ID:???
>>496
なんじゃこりゃ・・・
499nobodyさん:03/05/28 04:26 ID:???
日本語も混じってるテキストファイル(EUC-JP)からハッシュ値
だけ抜き出したいんですけどうまく抜き出せません。他にもゴミ
がついてきます。
#!/usr/bin/perl
while(<STDIN>){
if(/\b[a-z|0-9]{32}\b/){
print;
}
}

どうしたらいいですか?
500nobodyさん:03/05/28 04:32 ID:???
>>496
あまりに問題外すぎます・・・。
もう少し勉強した方が・・・。

>>499
どんなファイルフォーマット?
501nobodyさん:03/05/28 04:48 ID:???
フォーマットめちゃくちゃでも抜き出せるように
したいんですけど無理ですかね。。?もちろん、
空白か行頭、行末にはさまれてはいます。
502nobodyさん:03/05/28 04:54 ID:???
>>501
たとえば、こんな状態で・・・って数行晒してくれない?
ハッシュ値って、どんな値なのかさっぱり。
503nobodyさん:03/05/28 05:32 ID:???
>>502そうですよね。すみません

おらおらおらおら無駄無駄無駄無駄 by じょうたろう
vizelj f6c08af464e2db2d05988c121db29156

こんな感じです。ハッシュ値ってのは最後の英数字の
羅列です。アルファベットの小文字または数字で構成
されていて長さは32文字固定です。
504nobodyさん:03/05/28 06:55 ID:???
>>493
目から鱗が落ちました。ありがとうございました。
505nobodyさん:03/05/28 07:58 ID:???
パターンマッチした部分だけが必要なら $& とか $1 とか使う。

if(/\b([0-9a-z]{32})\b/){
print $1;
}
506nobodyさん:03/05/28 13:22 ID:???
oepn(FA,">file");
close(FA);

のように、新規ファイルを作成すると
パーミッションが 0644 になってしまうので

 chmod(0777,"file");

のように0777に変えてやってるんですが、うまくいきません。(パーミッション変更出来ない)
サーバによっては上手く行くので、原因はサーバ側の設定でしょうか?
もしそうであれば管理者に相談しようと思うのですが、
それ以外で解決策ありますでしょうか?

やりたい事としては
・新規ファイル、ディレクトリを作成→パーミッションを777にしたい
です。
507nobodyさん:03/05/28 13:42 ID:???
>>506
ファイルは忘れた(なんかあったと思う)
ディレクトリなら、
mkdir "dirname",777;
とかでいけたはず。
508nobodyさん:03/05/28 13:52 ID:???
画像のアップローダーを作っててサイズ制限の機能をつけてるんですが、
現状標準入力から受け取って、ファイルとテキストを切り分けて、ファイルのサイズを取得して
サイズが大きいと蹴ってるのですが、

これだとサーバーに送信された後の処理なので、送信される前になんらか手を打てないしょうか?
509nobodyさん:03/05/28 13:55 ID:???
ファイルを777にする必要ってないだろう。
鯖によっては777を禁止してるとこもあるかもしれないな。
755にも変更できないのか?
510nobodyさん:03/05/28 13:58 ID:???
>>508
うろ覚えで悪いが、送信時にいけなかったっけか?
<input type=hidden name=MAX_FILE_SIZE value="500000">
たしかこんな感じで。
valueに最大ファイルサイズを入れればいいと思う。

ただ、うろ覚えなので確認は自分で。
511508:03/05/28 14:02 ID:???
>>510
なるほど、フォームでやれるわけですね、
ちょっと調べてみますサンクスコ
512nobodyさん:03/05/28 14:15 ID:???
>506
umaskとか。
513nobodyさん:03/05/28 14:51 ID:???
>>511
調べるとPHPだとそのタグでいけるようですが、
Perlでは見当たりませんでした

試してみてもやっぱりダメでした
ぬぬ
514nobodyさん:03/05/28 15:06 ID:???
>>513
そうか、PHPだけか…すまんかった。

じゃあちょっと手抜きだが、これでは駄目?


if($ENV{CONTENT_LENGTH} < $max_filesize) {
ファイルがでかかった時の処理
exit;
}

これだとpostされたデータ全体になるので、厳密な画像サイズだけでは無いけど
まあ、大体で制限できるかと。
515514:03/05/28 15:09 ID:???
悪い、逆だった。


×if($ENV{CONTENT_LENGTH} < $max_filesize) {
○if($ENV{CONTENT_LENGTH} > $max_filesize) {

516513:03/05/28 15:22 ID:???
>>514-515
その処理にしようかとも迷ったんですが
同じcgiで画像の添付数やテキストの入力量にかなりバラつきがあるので
やめました

もうちっと試行錯誤してみます。
517nobodyさん:03/05/28 16:15 ID:???
$text = qr/abc/;
print $text;

ってすると qr の仕様らしくて、$text の中に特殊な意味を持つ文字列が入るんですが、
これを取り除く、または取り除いたデータを参照できる方法はないですか?

二重 foreach の中で正規表現は効率悪い、というのをラクダ本で見たので
やってみたのですが、$text そのものを表示して使いたいため
これがネックで困ってます…。

ラクダ本、何か宇宙語のようで読むのが大変ですw
518山崎渉:03/05/28 17:03 ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
519nobodyさん:03/05/28 18:02 ID:???
↑アク禁にしてくれ。困る。
520nobodyさん:03/05/28 18:26 ID:???
>>505
うまくいきました。さんくす!
521nobodyさん:03/05/28 18:53 ID:???
>>519
山崎渉は透明あぼ〜んに登録して桶
522nobodyさん:03/05/28 19:24 ID:uwixhF+z
文章の1行目から3行目までを指定して
改行を取り除きたいのですが、
どのようにすればいいのでしょうか?
改行を取り除くのは
$body =~ s/\n//g;
これでできるのですが、
$bodyの中の1行目から3行目までだけの
改行を取り除きたいと思っています。
523nobodyさん:03/05/28 19:46 ID:???
>>522
@bodys = split (/\n/, $body);
chomp ($body[0], $body[1], $body[2]);

いくら初心者のためのスレだと言っても、
最低基礎くらい覚えてこい!
524523:03/05/28 19:51 ID:???
@bodys = split (/\n/, $body);
@head = splice (@bodys, 0, 3);
$body = join ("\n", @bodys);

スマン、俺も、ちゃんと勉強しておく。。。
525nobodyさん:03/05/28 20:15 ID:+jnsOx/q
>>523
はぁ?じゃマジ初心者はどこいったらいいのよ?
お前スレタイ読んで出直してこいや(w
526525:03/05/28 20:16 ID:???
すまねぇ・・・ちゃんと過去ログ読むわ・・・
527nobodyさん:03/05/28 20:29 ID:uwixhF+z
>>523

ありがとう。
でも配列使えないんですよ。
ポインタみたいな物使ってるので。
$body_item->{'body'}
これの中身の最初の\nから3つ目の\nまで消したいんです。
528nobodyさん:03/05/28 20:31 ID:uwixhF+z
あとstrict使っているのでグローバル変数は使えないんです。
529_:03/05/28 20:32 ID:???
530nobodyさん:03/05/28 20:37 ID:???
ヨクワカランケド
for($i=0; $i<3; $i++){
  $body_item->{'body'}[$i] =~ s/\n//g;
}
531nobodyさん:03/05/28 20:38 ID:???
>>528
use vars
532nobodyさん: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.
というエラーが出ます。
533nobodyさん:03/05/28 20:46 ID:???
しるかぼけ!
198行目がなんなのかもわからんのに
534nobodyさん: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

このようなエラーが出ます。
535nobodyさん:03/05/28 20:49 ID:???
\x81 。。。。
536nobodyさん:03/05/28 20:54 ID:uwixhF+z
ただ先頭から3つの\nを取り除くだけも結構大変ですね。
537nobodyさん:03/05/28 20:57 ID:???
>>534
馬鹿なのか回答者をおちょくっているのか・・・
538nobodyさん:03/05/28 20:58 ID:C2cSB0SK
ここのせいでオナニーしすぎだよまったく・・・
         ↓

 http://www.dvd-yuis.com/index2.html
539nobodyさん:03/05/28 20:58 ID:uwixhF+z
>>537
全然おちょくってないです。
本当に困ってるんですよ。
540nobodyさん:03/05/28 21:00 ID:uwixhF+z
何か他に案はないでしょうか?
541nobodyさん:03/05/28 21:01 ID:uwixhF+z
substr使っても駄目だったし本当にどうすればいいんだろう・・・
542nobodyさん:03/05/28 21:05 ID:???
>>539
use vars ここにグローバル変数にしたい変数を羅列;

use vars qw($a @b %c);という感じで。
543動画直リン:03/05/28 21:10 ID:52+C0e9R
544nobodyさん: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
こういうエラーが出ます。
545523:03/05/28 21:15 ID:???
>>533
ワラタ
546nobodyさん:03/05/28 21:15 ID:???
うわー。名前消し忘れてるし〜。
547nobodyさん:03/05/28 21:15 ID:???
>use vars qw(@body_item->{'body'},@head);

カンマ区切りじゃなくて、半角スペース区切りだろ
548nobodyさん:03/05/28 21:18 ID:???
>>544
@head = splice (@{$body_item->{'body'}}, 0, 3);
549nobodyさん:03/05/28 21:18 ID:uwixhF+z
>>547
半角スペースでも試しましたが駄目でした。
550nobodyさん:03/05/28 21:20 ID:???
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'}});

いっぱい間違ってないかい?
551nobodyさん:03/05/28 21:20 ID:???
use vars qw(@body_item @head);だと思うんだが。
552550:03/05/28 21:22 ID:???
あ、最後の行
$body_item->{'body'} = join ("\n", @{$body_item->{'body'}});

@{$body_item->{'body'} = join ("\n", @{$body_item->{'body}});
変更。
553nobodyさん: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)"
554550:03/05/28 21:23 ID:???
555nobodyさん:03/05/28 21:23 ID:???
>>522
1行目から3行目までを取り込み、全ての改行コードを削除してから残りの行を付け加えるのでは駄目なのか?
556550:03/05/28 21:24 ID:???
>>555
俺も最初に思ったが、どしてもスカラー変数から改行を取り除きたいらしい。
557nobodyさん:03/05/28 21:25 ID:???
>>556
そうか(^_^;)
で、配列も使いたくないらしいから、split+joinもだめなのね。
558nobodyさん:03/05/28 21:26 ID:uwixhF+z
>>551
それだと
Bad name after body' at user_lub/xxxx/xxx.pm line 209.
というエラーが出ます。
559550:03/05/28 21:27 ID:???
>>557
いや、厳密には配列に入ってるんだよ。
それが、リファレンスで入ってるんで、ちょっと扱いがわかってないっぽい。
要領は同じなんだけどね〜・・・

って、雑談ぽくなってきたので、これにて。
560550:03/05/28 21:28 ID:???
>>558
もういい・・・。
すべてのソースを晒せ。
561nobodyさん: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
このようなエラーが出ます。
562nobodyさん:03/05/28 21:29 ID:???
>>561
それ、ちゃんと変更できてない。
ソース晒せって。全部。
圧縮して、アプローダ。
563nobodyさん:03/05/28 21:30 ID:uwixhF+z
>>555
それは出来ないんですよ。ソースが膨大でDatabase使ってますから。
564nobodyさん:03/05/28 21:31 ID:???
>>563
掲示板で教えるのは限界がある。
・・・とにかく、@body_item->{'body'}ってのを、@{$body_item->{'body'}} へ、ちゃんと変更する。
全部。
565nobodyさん:03/05/28 21:34 ID:???
>>563
って言うか、そのエラー出てるモジュールだけを晒してくれれば早い。
566nobodyさん:03/05/28 21:38 ID:uwixhF+z
>>565
pakage使ってますから横の繋がりもあるんですよ。
567nobodyさん:03/05/28 21:39 ID:???
>>566
それでもいいから。
エラーは、そのモジュール局部的な物と見てる。
それとも、晒せないソースなのか?
今のペースだと、スレ1つ消化するくらい説明のやり取りが必要になるぞ。
568nobodyさん:03/05/28 21:40 ID:???
at user_lub/xxxx/xxx.pm line 196
だったら、196行目だけ晒せばいいだろ!
569nobodyさん:03/05/28 21:41 ID:???
>>563に違和感を覚える。

ソースって読み込み元のことか?
570nobodyさん:03/05/28 21:41 ID:uwixhF+z
>>567
分かりました。
もうちょっとやって駄目ならそこの部分のソースを2chアップローダに
上げます。
571nobodyさん:03/05/28 21:41 ID:???
>>568
196行目のエラーが無くなったら、別の行でエラーが出る罠。
572nobodyさん:03/05/28 21:43 ID:uwixhF+z
>>568
196行目は
my $body;
です。
573nobodyさん:03/05/28 21:44 ID:???
>>572
(T-T)(T-T)(T-T)(T-T)(T-T)(T-T)
574nobodyさん:03/05/28 21:55 ID:???
$str =~ s/^(.*?)\n(.*?)\n(.*?)\n/$1$2$3/;
575nobodyさん:03/05/28 22:00 ID:???
>>495
LWPモジュールでググれ。
576nobodyさん:03/05/28 22:02 ID:???
>>517
$text = 'abc';
$regex = qr/$text/;

これでいいだろ?
んで、表示する時は$text使えばいいんじゃねーか。
577nobodyさん:03/05/28 22:04 ID:???
Perl、何か宇宙語のようで読むのが大変ですw
578nobodyさん:03/05/28 22:09 ID:uwixhF+z
>>574
完璧です。
それで完璧に出来ました。
ありがとうございます。
579nobodyさん:03/05/28 22:16 ID:uwixhF+z
>>574
どこでそのような方法を勉強したのでしょうか?
perlのリファレンス見てもそのような表現方法は載ってなかったので
どうやって勉強したのか気になります。
580nobodyさん:03/05/28 22:18 ID:???
>>579
処理のアルゴリズム。
勉強したけりゃ、人が書いたソース読め。
581nobodyさん:03/05/28 22:23 ID:uwixhF+z
>>580
そうですか。
人のソースで勉強したのですか。
人の書いたソースでも、あの表現方法を理解するのは
私には難解です。
まだまだ勉強が足りないですね。
582nobodyさん:03/05/28 22:27 ID:uwixhF+z
$str =~ s/^(.*?)\n(.*?)\n(.*?)\n/$1$2$3/;

ちなみにこれについて教えていただきたいのですが、
$1$2$3というのは変数だと思いますが、strict内で変数宣言しなくても
エラーが出ませんでした。どうしてなのでしょうか?
普通は my $1;などと変数宣言しないといけないはずですが。
583nobodyさん:03/05/28 22:37 ID:???
584nobodyさん:03/05/28 22:42 ID:???
てゆーか、正規表現知らずにPerlやってるのが信じられんのだが
585nobodyさん:03/05/28 22:44 ID:???
「〜はずですが」←これが多いねぇ〜
586nobodyさん:03/05/28 22:47 ID:uwixhF+z
>>583
特殊変数だったのですね。
$n
最後に一致した正規表現内の()グループに相当する部分文字列が設定されるのですね。

正規表現を勉強しないといけませんね。
587nobodyさん:03/05/28 22:58 ID:uwixhF+z
何はともあれ、ありがとうございました。
588nobodyさん:03/05/28 23:14 ID:???
教科書に載っている以上のことができないっつーのも、なんかアレだな。
これもゆとり教育の弊害か。
589nobodyさん:03/05/28 23:20 ID:???
つーか正規表現載ってないperlのリファレンスってなんだ?
590nobodyさん:03/05/28 23:41 ID:???
いきなりレスが増えたから荒されたのかと思ったよ。山崎
こんな香具師、いつもならスルーなのに今日はどうした?
591nobodyさん:03/05/28 23:53 ID:???
$body =~ s/\n//;
$body =~ s/\n//;
$body =~ s/\n//;

完璧だ!
592nobodyさん:03/05/29 00:08 ID:NXYitVzp
バカは放置しないと直らない

構うなよバカを
593nobodyさん:03/05/29 00:23 ID:QV3HKWce
ここ(σ ̄ω ̄)σいいじゃん
http://homepage3.nifty.com/coco-nut/
ここ(σ ̄ω ̄)σ神がいます
http://jbbs.shitaraba.com/computer/2364/
594nobodyさん:03/05/29 00:58 ID:???
バカのお祭りみたい
595nobodyさん:03/05/29 01:57 ID:???
>>574
>>578
くそぉぉ!!
祭りに乗り遅れた!!
面白そうな祭りしてたんだな・・・

しっかし・・・ひどいな(w
596nobodyさん:03/05/29 10:45 ID:m7OaXWdv
だって初心者スレだもん
597nobodyさん: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ファイルからもってきた値に変えたい
  ]
);
あと、リファレンスについて、猿でもわかる解説ってないでしょうか・・・?
598bloom:03/05/29 11:10 ID:AQrs4zcG
599nobodyさん:03/05/29 11:51 ID:???
くだらないことで一日悩んでるくらいなら、らくだ本買いなよ。
600nobodyさん:03/05/29 11:54 ID:???
>>599
なぜ、ラクダ本を薦めるのかがわからん。
たしかに最強の本だが、ラクダ本で理解するのは難しいだろ。
ある程度分かってからなら、さらに深く理解できると思うけど。

お勧めは、「新Perlの国へようこそ」
俺は、これでリファレンス&オブジェクトを勉強した。
601nobodyさん:03/05/29 12:00 ID:e3PaTXyE
そこまで言い切ってしまうなら、本なんて買わずにそこら辺のサイトで
十分と思われ。
まあ漏れもラクダ本は好きじゃないけど、これくらい買う気にならないと
どうせやっても頓挫するよ、くらいの目安にはなると思う。

ちなみに漏れは「初めてのPerl」みたいなタイトルの本買って勉強しますた。
602_:03/05/29 12:01 ID:???
603nobodyさん:03/05/29 12:18 ID:???
より高度なスクリプトを書きたい、と思い立つまでは、
入門もリファレンスもネット上で足りるよな。

それでも理解不能な超初心者向けの本というと何だろう。
もはやPerl以前のところから説明してそうだけど。
604597:03/05/29 12:34 ID:???
>>600
おれが一番読んでいるのは、その「新Perlの国へようこそ」です・・・
やばいのかな、おれって
いや、リファレンス以外はらいたい、その本で理解できたつもりなんですけどね
605nobodyさん:03/05/29 14:19 ID:???
ソ ー ス 嫁 。
606nobodyさん:03/05/29 14:42 ID:???
良質なソースキボンヌ
607nobodyさん:03/05/29 14:59 ID:hW1BfWjc
Content-Disposition: attachment; filename=name.xxx;\r\n
を使ってダウンロードさせるプログラムがあって、
そいつをNetScape7でダウンロードさせると、ファイル名のケツに.cgiがつくんです。
対処方法はありますか?
608nobodyさん:03/05/29 15:10 ID:f7DLEcKa
perlってペールって読むの?
それともパール?
どうなのYOー
609nobodyさん :03/05/29 15:17 ID:???
>>608 pearlを最初使おうとしてたらしいからパールでいいんで無かろうか?

まぁ、俺は駱駝本は欲しいなと思ってはいるけど、
入門段階で本を買ったら覚えれるという発想も安直だと思うのだが如何だろう?
610nobodyさん:03/05/29 15:41 ID:???
ペールです
611nobodyさん:03/05/29 15:49 ID:???
ベッケンバウアーです
612nobodyさん:03/05/29 15:51 ID:5xhJzi5f
Activeperlでsslのかかったサイトにアクセスしたいのですがどうすればよいでしょうか?

いちおうNet::SSLeayというモジュールが必要ということで
ppm install Nea::SSLeay としてやってみたもののうまくできません。
どうすればよいでしょうか?

perl初心者ですが申し訳ありません。
613nobodyさん:03/05/29 17:15 ID:???
perlは ぱるる。urlは うるるだ。
614nobodyさん:03/05/29 17:48 ID:???
とにかく問題は、潜在的な理解能力には差があるということ。

らくだ本を読めば理解できる人が全てというわけでは無いんだから、少し配慮しよう。
615nobodyさん:03/05/29 17:50 ID:???
潜在的ってか、やる気の問題だろ。
質問の内容がアホすぎる奴が多い。
いかにも「とりあえず聞いてます」みたいな奴。

ちったあ調べて来い! ってんだ。
616nobodyさん:03/05/29 21:40 ID:???
>>603
Perl以前っていうか、
Perlの開発者の説明やPerlの元々の意味が載ってた本なら見た事ある
617nobodyさん:03/05/29 22:00 ID:???
すぐわかるperlが200円で買える。。。でも送料、振込み金
考えるとあんま安くないな...。
あ、簡単なperlの本は読んだんですけど必要ないですかね?
掲示板とか作るところでつまずいたんで買おうと思ってるんですけど。
618nobodyさん:03/05/29 22:03 ID:???
↑↑↑
あ、スレ違いでした。すいません。
619nobodyさん:03/05/29 23:22 ID:RP1Tv8fK
Socketについて1から詳しく教えてる優良なサイトってありますか?
よければ教えて下さい。検索に出なかったもので、、
620nobodyさん:03/05/30 00:11 ID:???
>>619
http://www.google.com/search?num=50&hl=ja&ie=Shift_JIS&q=Socket+perl&lr=lang_ja
ちゃんと調べたのか・・・。
検索したら、山ほど引っかかるが?
これ、全部読んでもダメなら本探しに行くがよろし。
621sample: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>
622nobodyさん:03/05/30 02:15 ID:???
623597:03/05/30 02:28 ID:???
すいません、
なぜ、
14-16行目は
$template->param(
  LIST => \@list
);

10行目は
push @list, $%list;なのでしょうか?

つまり、どうして、push @list, \%list でないのでしょうか?
624597:03/05/30 02:29 ID:???
言い忘れましたが、
>>623 は、
>>621 さんへの引用&返信として書きました。
625_:03/05/30 02:42 ID:???
626621:03/05/30 02:50 ID:???
>>623
単純な入力ミスだ、ぐらい判ってくれ。
push @list, \%list;
627直リン:03/05/30 03:10 ID:KvuUHxNV
628nobodyさん:03/05/30 03:11 ID:k5B8Isn5
CGI::Applicationでフォームのパラメータを受け取った時
(key=aaa&key=bbbのように)
同じキーの値が複数ある場合、何で分割されているのでしょうか?
CGI.pmは同じキーの場合、配列にして戻ってくるらしいのですが、
見たところ配列でもないし、何で分けられているのかさっぱり分かりません・・。
629623:03/05/30 03:17 ID:???
>>626
あ、なんだ、すいません。ほっとした。
630nobodyさん:03/05/30 03:22 ID:/oIAPWL0
どこかのホームページでUDPもconnectできると書いてあるんですが、どうやるんでしょうか?
普通にconnect関数を使えばいいのでしょうか?
調べてみましたがどこにも書いてなかったのでお願いします。
631nobodyさん:03/05/30 11:03 ID:MqvbgP4I
配列にアクセスする時は、
$hoge[0]じゃないといけないのに、@hoge[0]でもOKだったんですけどなぜですかね
632直リン:03/05/30 11:10 ID:KvuUHxNV
633nobodyさん:03/05/30 11:25 ID:wqqbPD7W
色々なスクリプトを参考にPerlを学び始めたのですが↓の意味がわかりません。
$salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); #aska.cgiのある一行です
関数的な意味ではなく文法的な意味が。&&や||がどの部分にかかっているかとかがいまいちわかりません。
分解したり()つけたりどなたか分かりやすく説明していただけないでしょうか。
634nobodyさん:03/05/30 11:39 ID:???
>>633
$salt = (($logpw =~ /^\$1\$(.*)\$/) && $1) || substr($logpw, 0, 2);
パターンマッチが成功したら→ $salt = $1
失敗したら           → $salt = substr($logpw, 0, 2)

違ってたらすまん
635nobodyさん:03/05/30 11:44 ID:???
>>631
それはね〜。
スライスと言ってね〜
$はスカラー変数として評価されて、
@は配列として評価されるんだよ〜。

たとえばね〜。
配列の要素0と3と6をコピーしたいとするよね〜。

@hoge = ($hage[0], $hoge[3], $hoge[6]);

↑これだと、ちょっと面倒だよね〜。

@hoge = @hage[0, 3, 6];

↑これだと、すっきりして見えるよね。
スライスって便利だね〜。

マジ、本読もうね〜。
636635:03/05/30 11:45 ID:???
>@hoge = ($hage[0], $hoge[3], $hoge[6]);
ここの所、ちょっと変数名間違っちゃったけど、
言いたいこと分かってくれるよね〜?
637nobodyさん:03/05/30 11:48 ID:???
>>630
>どこかのホームページでUDPもconnectできると書いてあるんですが・・・
へー。どこかのホームページにそんな事書いてたのか〜。

>調べてみましたがどこにも書いてなかったのでお願いします。
へー。どこにも書いてなかったのか〜。


・・・( ´_ゝ`)ヘー
638nobodyさん:03/05/30 11:55 ID:???
>>634
それで合ってるっぽ。

$salt = ($logpw =~ /^\$1\$(.*)\$/ ? $1 : substr($logpw, 0, 2) );

こう書いた方が、まだ分かりやすい・・・
639nobodyさん:03/05/30 12:04 ID:???
>>634
>>638
ありがとうございます。無事理解できました。
640630:03/05/30 14:51 ID:qOosOO5S
>>637
失礼しました。
どこかのホームページではなく、とあるホームページです。

自分なりにconnect関数について調べたのですが、udpを使用しての使い方は載ってませんでしたので…。
641nobodyさん:03/05/30 14:58 ID:???
>>640
いや、そういう意味じゃなく、
その「どこかのホームページ」に書いてたなら、
その「どこかのホームページ」内に、説明がなかったのかね?って意味。

ちょっと、ひねくった言い方してみた。
642nobodyさん:03/05/30 15:03 ID:???
643630:03/05/30 15:11 ID:uU/3TkKV
>>642まさにそこです。
udpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。

当方の見落としですかね?
644630:03/05/30 15:12 ID:qOosOO5S
>>641
>>642

>>642のサイトです。
udpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。

当方の見落としですかね?
645630:03/05/30 15:13 ID:gys3ZHK8
二重カキコスマソ。
646nobodyさん: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:こういう場合、どこを修正すれば良いのでしょうか。パーミッションが悪いのか、パスが悪いのか、それともアップロードの仕方が悪いのか、もっと他に原因があるのでしょうか。

よろしくお願いします。
647nobodyさん:03/05/30 16:47 ID:???
>>646
ローカルってWin?
ローカルで動くならperlの文法は合ってるんだろうね。
どっかで初歩的なミスしてると思うよ。
ま、スレ違いなので、
http://pc2.2ch.net/test/read.cgi/php/1048686475/l50
↑こちらへどうぞ。
648nobodyさん:03/05/30 18:30 ID:axvQjxfE
文字列の行番号を調べる方法はないですか?
649nobodyさん:03/05/30 19:06 ID:???
>>604
新Perlの国へようこそで十分リファレンスは理解できるぞ?
650nobodyさん:03/05/30 19:09 ID:???
>>612
モノが足らない。他に3つぐらい必要

>>628
CGI::Applicationは内部でCGI.pmを使ってるから処理は同じ。

>>643
UDPでconnectってのは単に宛先を省略できるようになるだけ。
実際にコネクトしてるわけじゃない。
651nobodyさん:03/05/30 19:36 ID:???
age
652_:03/05/30 19:41 ID:???
653nobodyさん:03/05/30 20:14 ID:???
お聞きします。
連想配列Aと連想配列Bがある場合、AにBをコピーさせたいのですが、
コピーする際にキーの重複を避ける為にBのキーに固定文字を追加して
移動させるにはどのように書けば良いのか教えて下さい。

配列の場合にはそのままpushで簡単だったのですが…
654nobodyさん:03/05/30 21:59 ID:???
>>653
「固定文字を追加」ってのがちょっと意味不明。解説キボンヌ
655nobodyさん:03/05/30 22:04 ID:v3ScOAWp
%a = ( 1 => "a",2 => "b")

%b = (1_b => "a",2_b => "b")
ってことじゃねーの?
656nobodyさん:03/05/30 22:45 ID:???
The duct tape of the internetってなんすか?
657653:03/05/30 23:01 ID:???
>>654
すみません。
>>655の解釈の通りです。

連想配列の解説を読みあさって、自分でも作ってみました。

while (($key, $value) = each(%B)) {
  $A{"b_$key"} = $value;
}}

一応、期待通りに動いてはくれているのですが、
もう少しスッキリ書けないものかと思いまして。
これが最善の用法ですかね?
658nobodyさん:03/05/30 23:11 ID:v3ScOAWp
あのぅ、
<!--#exec cgi="./acslog.cgi" -->でアクセスされたときと、
http://aaa.net/acslog.cgiでアクセスされたときを分岐したいのですが
無理ですか?
659658:03/05/30 23:13 ID:v3ScOAWp
aaa.netってほんとにあるのかよ。・。・・
適当ですのでお気にしないでください。
660nobodyさん:03/05/30 23:38 ID:TYAZIili
661nobodyさん:03/05/30 23:52 ID:???
>>657
それでできるなら、それでいいんじゃない?
俺なら・・・

while (($key, $value) = each(%B)) {
  $key .= '_b';
  $A{$key} = $value;
}

こうするけどね。

>>658
あのさ・・・
本当に教えてほしいなら、ちゃんと質問しようよ・・・
何を質問したいのか?って所から考えちゃったよ・・・

HTMLに埋め込んでるSSIで呼び出されたCGIファイルの実行結果と、
CGIファイル直接アクセスされた時の実行結果を変えたいって事でしょ?

SSIで呼び出す時は、GETで情報埋め込んでおいたらどう?
662nobodyさん:03/05/30 23:56 ID:???
>>657
@A{ map "b_$_", keys %B } = values %B;

>>658-659
その質問は CGI 関係のスレへ振ってくれ。
あとコレ読んで。
http://www.goto.info.kanagawa-u.ac.jp/~horiyuki/rfc/rfc2606j.txt
663653:03/05/31 01:29 ID:???
>>661
なるほど、そっちの方が後で読んだ時にわかりやすいですね。
ありがとうございます。

>>622
すごい。
そこまで端折れるものだったとは。

状況によって、>>661さんと>>662さんの構文を使い分けていきたいと思います。

ありがとうございました。
664658:03/05/31 01:30 ID:6mtQ8nNe
>>661
SSIでacslog.cgi?aaa
とかしても意味ないんじゃないですか?
?つけても、execで実行すると.cgiで実行した結果になるんですが・・・・
665nobodyさん:03/05/31 02:13 ID:???
激しくスレ違い
666nobodyさん:03/05/31 02:55 ID:???
>>664
・・・ヘ?
GETで値送って、その値見て処理を変えるんだよ?
直接CGIにアクセスされても、GETで値送らない限り処理変えられると思うが・・・?
とりあえず、>>665の言う通りスレ違いだから、これ以上はCGI質問板へ。
667Name_Not_Found:03/05/31 05:21 ID:yCzSry8L
Perl(サーバ)でのtimeの値が1増えるまでの時間(1sなはず)と
JavascriptでのsetTimeoutやsetIntervalでの1000msの長さに
違いが出るということはあるのでしょうか?
サーバはinfoseekで試したのですが1分30秒の間に
10カウント近くtimeの方が早く、時計を見ていた結果、
Javascriptのほうが正しいっぽいのです。

何か情報をお持ちの方、お答えをお願い致します。
668nobodyさん:03/05/31 05:36 ID:???
どーやって計測したのか書けよ…。
違いが出たのなら、記述ミスを疑うべき。
669nobodyさん:03/05/31 05:37 ID:???
>>667
それはPerlの問題ではない。
インターネット経由でCGIを実行するんだから、数秒のタイムラグはあって当然。
同じスクリプトをローカルで実行させてみ?
670nobodyさん: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"が出力されてしまうところが理解できないのです。
置換文字列内のハッシュの添字は変数展開されないのでしょうか?
どなたかご教示ください。
671nobodyさん:03/05/31 10:02 ID:???
こうか?

s/($1)/$h{$1}/;
672直リン:03/05/31 11:10 ID:1EAhrEiJ
673658:03/05/31 12:00 ID:isLkXnpR
>>662>>665>>666
すいませんでした。
CGIスレに行きます。
674nobodyさん:03/05/31 15:03 ID:???
>>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/ と等価
675nobodyさん:03/05/31 16:21 ID:???
正規表現てむづかしいよね。
いつか、ちゃんと勉強しなおそうとは思うけど。
676670: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"になる

インデックスの式はーあたかも文字列の外部に置かれているかのようにー
普通に評価されていることに注意しましょう。まず最初にインデックスの
式に対して変数展開が行なわれるわけではないのです。
(引用終り)
この部分、何を言っているのかさっぱり分からない(変数展開してると思う)
のですが、配列のインデクスに対して変数展開が行なわれないのなら、
ハッシュの添字に対しても同じことかな、と思ってしまったのです。
変数展開する/しないで頭の中ゴチャゴチャです。
677nobodyさん:03/05/31 17:55 ID:???
>>676
ダブルクォートで囲んだら変数展開されるんだから、何も問題ないだろうに。
678nobodyさん:03/05/31 18:10 ID:???
>>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] を見る事に
なってしまう。
679nobodyさん:03/05/31 18:11 ID:???
s/ではく/ではなく/
680nobodyさん:03/05/31 18:32 ID:???
s/$1/$h{$1}/;
   ↑このスラッシュの前後で、
$1の中身が"abc"→undef となるのか。勉強になった。
681nobodyさん:03/05/31 19:42 ID:???
Perlについて興味を持ち始めたんですが、
ボタンをクリックして処理を始めるというのがいまいちわかりません。
投稿 ボタンをクリックすると、 投稿処理が始まりますよね?
どのようにしていその処理に移ればいいのでしょうか?

厨な質問でスマソ・・・
682nobodyさん:03/05/31 21:02 ID:???
Perlと何の関係もない。
683nobodyさん:03/05/31 21:16 ID:???
>>681
どうもCGIを作りたいみたいだから、先に
スレタイを読んで理解すること、HTMLを理解することを薦める。
HTMLを理解しないとどうせCGIからHTMLを吐けないからね。
<form action="hoge.cgi">
684nobodyさん:03/05/31 21:16 ID:???
>>681
×Perlについて興味を持ち始めたんですが、
○CGIについて興味を持ち始めたんですが、

×厨な質問でスマソ・・・
○スレ違いな質問でスマソ・・・
685nobodyさん:03/05/31 21:20 ID:FYLpMA2J
>>681
スレ違いだけど教えてやる。

投稿をクリックするとform actionで指定されたcgiを呼び出す。
で、呼び出されたcgi側でフォームで指定されたメソッドにしたがって処理。
686nobodyさん:03/05/31 21:26 ID:???
CGIスレがあるのにPerlスレでCGIの質問をするのはなぜ?
このスレの方が大抵いつも上にあるから?
687_:03/05/31 21:30 ID:???
688nobodyさん:03/05/31 21:39 ID:Ecff4K+l
Perl=CGIって考えの房が多いから。
689nobodyさん:03/05/31 21:49 ID:???
初心者はperlとcgiの区別が付かないから
690nobodyさん:03/05/31 22:00 ID:qGkh6pMi
>>689
アッタマイイ(・∀・)!!
691nobodyさん:03/05/31 22:18 ID:ZijosZey
あのー
xmailでメール送信する場合って、
open(MAIL, "| /usr/sbin/xmail/sendmail -t");
で送れるんですか?
692nobodyさん:03/05/31 22:23 ID:???
画像ファイルのサイズを取得する方法を
詳しく説明してる様なサイトってないでせうか?
693nobodyさん:03/05/31 22:27 ID:???
>>691
xmailスレで聞け

>>692
stat使うかseek+tellで。
694nobodyさん:03/05/31 22:40 ID:???
>>692
「ファイルテスト演算子」でぐぐりる。
my $filesize = -s $filename;
695nobodyさん:03/05/31 22:41 ID:???
>>694
> my $filesize = -s $filename;
my $filesize = (-s $filename);
スマソ
696693:03/05/31 22:42 ID:???
サイズを得る演算子があったか。恥かいてしまったな。
697nobodyさん:03/05/31 22:58 ID:m6zPJsPy
掲示板のスクロールバーの色を変えるにはどう書けばいいのですか?(´Д⊂ク
698nobodyさん:03/05/31 22:59 ID:???
>>697
「Perlで」ですか?(´Д⊂ク
699nobodyさん:03/05/31 23:11 ID:???
>>697
マルチうざいです。
しかも、向こうで答えようとしている人がいるのに何でマルチするのですか?
なぜ、わざわざスレ違い、いや板違いであるこのスレで質問するのですか?
そして、textareaのスクロールバーなのか、
ウィンドウのスクロールバーなのかくらいハッキリさせろ。
cf. http://pc2.2ch.net/test/read.cgi/hp/1053619342/226 だよね?(´Д⊂ク
700nobodyさん:03/05/31 23:15 ID:ZijosZey
>>699
板違いの何がいけないんですか?
701nobodyさん:03/05/31 23:24 ID:???
>>700 鼬の最後っ屁
702nobodyさん:03/05/31 23:31 ID:???
>>700
お前は、人の迷惑を考えないガキと見た。
703612:03/05/31 23:31 ID:3Wm6q7+j
Activeperlでsslのかかったサイトにアクセスしたいのですがどうすればよいでしょうか?

いちおうNet::SSLeayというモジュールが必要ということで
ppm install Nea::SSLeay としてやってみたもののうまくできません。
どうすればよいでしょうか?

perl初心者ですが申し訳ありません。

650さんにものが足りないといわれましたが、なにが足りないのでしょうか?

704nobodyさん:03/05/31 23:33 ID:ZijosZey
>>703
マンコ
705nobodyさん:03/05/31 23:33 ID:???
>>699のL5-6は勘違いだったスマソ。質問のソースを読めば分かるか。

>>700
何の板なのか、そしてここは何のスレかを腹筋しながら50回音読してください。
# 向こうで答えが出ているのにわざわざマルチするなんて最低だよq(^-^)
706nobodyさん:03/05/31 23:45 ID:???
>>612
1 スタートメニューからperl package managerを起動する
2 search sslする
3 Crypt-SSLeayが見つからなければ
repoでリポジトリを確認し、repo 2とかやって切り替える。2に戻る。
4 install (3で見つけた番号)
だったと思う。俺はもう既にインストール済みだから手順を確認できない。
707nobodyさん:03/06/01 00:16 ID:???
スレ違い・板違いのどこが悪いんですか。
初心者だから仕方ないでしょう。
誰でも最初は初心者に決まってるじゃないですか。
質問には全部答えてあげればいいじゃないですか。ガキじゃないんだから。
そしてスレの内容をめちゃくちゃにして誰もが不利益を被るようにすればいいじゃないですか。
708nobodyさん:03/06/01 00:20 ID:???
>>707





何ですか コレ?
709nobodyさん:03/06/01 00:27 ID:???
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
710nobodyさん:03/06/01 00:47 ID:DeFU3cB4
あの、
Win32モジュールってどこにあります?
なかなか見つからないんですが・・・
711nobodyさん:03/06/01 01:03 ID:???
>>707
1.本気で自分は絶対に間違ってなく、他の全てが間違っていると考えている。
->本物。なので処置なし。放置。

2.薄々自分のやったことに後ろめたさを感じているが、認めたくない。
->厨房。頭が冷えるまで放置。と言うか物の道理がわかるまでネットにつなげるな。

3.ネタ
->放置

おお、実態がどれであろうと放置以外に選択肢がない。
712nobodyさん:03/06/01 01:06 ID:???
>>710
ウィンドウズにActivePerlを入れてるなら、
スタート->検索->ファイルやフォルダで検索を開き、Win32で検索。

……Perlとかんけーねえ!?
713動画直リン:03/06/01 01:10 ID:FDrVWEME
714nobodyさん:03/06/01 01:36 ID:DeFU3cB4
>>712
ごめん。はじめっからはいってるんだね。
すんませんでした。
715707:03/06/01 02:34 ID:???
本当にすみませんでした。
やっと目が覚めました。
初心者だからって、それに甘えてルールを破る事って
いけないことですよね。。。
自分が甘ったれだって、気がつきました。
もう少し、勉強してきます。
ありがとうございました。
716本物の707:03/06/01 02:44 ID:???
>>708 >>709 >>711
お前ら>>707の最後の一行嫁。
お前もついでに嫁>>715
717本当の本物707:03/06/01 03:08 ID:5qKTyD6i
すみません。本当にすみません。
僕が、変な質問の仕方したばかりに、
偽者が現れて、荒れてきてます。。。
>>716は、偽者です!
僕は、今ちゃんとまじめに勉強してます。
今後も、もしかしたら僕の偽者が現れるかもしれませんが、
どうか、放置してください。
本当の本当に、ご迷惑をおかけしました。。。。
IDも晒しておきます。
718直リン:03/06/01 03:10 ID:FDrVWEME
719本物の707:03/06/01 03:20 ID:???
>>717
お前レス番間違えてるだろ?
720本物の707:03/06/01 03:21 ID:???
>>707は板違い・スレ違い野郎を皮肉ってるだけだ。
721nobodyさん:03/06/01 03:40 ID:???
板違い/スレ違いを構ってやってそういう板/スレだと思われると困るC〜
んだから、板違い/スレ違いが来たら叩くだけだC〜
その結果スレが荒れたって困らないC〜
荒れて困るほど人が多い板じゃないC〜
722nobodyさん:03/06/01 03:54 ID:???
>>721
荒れると、困るというか嫌だが、何か?
俺以外でも、そう思うヤツはいてると思うが、何か?

荒れて良いなんて思った事なんて、一度もない。
Perl使ってCGI組んでる俺は、PerlだろうがPHPだろうが、
WebProg板全体のレベルアップを願う一人だ。
723nobodyさん:03/06/01 04:36 ID:???
今日の日記。

あまりに下らない流れを発見した。
724nobodyさん:03/06/01 04:36 ID:???
何だかんだ言って、みんな人が良いんだから
725670=676:03/06/01 05:30 ID:6WOnkruh
>>678さん
有り難うございます。
$y = 2;を、$x = "$y";で展開すると、$xは2(数値)ではなく、"2"(文字列)
になるということですね。
言われてみれば当り前のことですが、これがはっきり認識できていません
でした。
726nobodyさん:03/06/01 12:16 ID:???
>>722
馬鹿に馬鹿といってその結果荒れるのはしょうがない。
727nobodyさん:03/06/01 12:47 ID:???
スクリプト言語の功罪か。
728nobodyさん:03/06/02 02:35 ID:???
ちょっと疑問に思った。

unlessやらuntil使わずに、ifとwhileに!を組み合わせて使う。

ナンデダロ(・∀・)
729nobodyさん:03/06/02 07:03 ID:???
>>728
それの方が、見やすい、理解しやすい場合がある。
または、その人が、それの方が見やすい理解しやすいからかな?
730nobodyさん:03/06/02 08:32 ID:???
pack,unpackを詳しく説明してるサイトを
ご紹介してもらえませぬか?
731nobodyさん :03/06/02 08:38 ID:???
>>730
こういう所でいいのかな?

ttp://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
732nobodyさん: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>";
}

(つづく・・・)
733732: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)

734732:03/06/02 12:28 ID:???
もし大変そうでしたら、手順だけでもかまわないので、
教えていただければ幸いです
735nobodyさん:03/06/02 12:37 ID:???
>>732-734
わからん・・・
何を聞きたいのかが分からん・・・

手順だけを教えてくれって・・・
処理のアルゴリズムは、プログラマーが考える事であって・・・
処理方法は、何十種類も、何百種類もある。
ところで・・・お前は、ソートの動きを理解してない、いつぞやのヤツでは?
736732:03/06/02 12:43 ID:???
>>735
あー、そうなんですね・・・。言われてみれば確かに。

定石でもあればと思ったのですが・・・

>ソートの動きを理解してない、いつぞやのヤツでは?
どうなんでしょう。
ソートで質問したことはあるけど、最終的には理解したつもり。。。なんですが・・・
737nobodyさん:03/06/02 13:09 ID:???
>>736
>>471 ←この辺のヤツじゃない?

とりあえず・・・
自分では、どんな処理してみたの。
それを、晒してみろ。
738732: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>";
}
739nobodyさん:03/06/02 14:33 ID:???
>>738
いや・・・
それでできたなら、それでいいんじゃない?

一言言わせて貰えば・・・
なぜ、二つのリファレンスで管理してるのか・・・
一つで管理してれば、そんな処理せずソートできるのに。

・・・と、この辺は、そちらの都合でそうしてるんだろうし。
これ以上、何も言う事はないかな。

何作ってるか知らんが、適度にがんがれ。
740名無しさん@お腹いっぱい。:03/06/02 15:39 ID:vewE58z2
あるディレクトリのファイル数を調べる方法を教えてください。
741nobodyさん: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で空フォルダを作成する場合の方法をご存知の方居ませんか?
検索ではなかなか出てこなくて・・・
744nobodyさん:03/06/02 19:20 ID:???
フォームから「<input type="file">」でアップロードしてもらったJPEGファイルの、
横幅や縦幅を取得するにはどうすればいいのでしょうか?
745nobodyさん:03/06/02 19:26 ID:???
>>743
mkdirを使う。
ちなみに「フォルダ」じゃ見つかりにくいと思われ。「ディレクトリ」で探そう。

>>744
Perlと無関係。
746744:03/06/02 19:30 ID:???
>>745
あ、そうすね。すみません逝ってきます
747名無しさん@お腹いっぱい。:03/06/02 19:46 ID:vewE58z2
>>745
ありがとーう。
mkdir($Dir, 0777);としても755になっちまいましたが。
作ったディレクトリの中にファイルを作ったり出来たんで上手くいきました。
748nobodyさん:03/06/02 19:56 ID:???
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を使っている全てのかしょで、
同様の現象が起きています。

いったい、どこを疑えばいいのでしょうか?
749nobodyさん:03/06/02 19:58 ID:???
>>747
umask
750nobodyさん:03/06/02 20:51 ID:???
unmaskでは?
751nobodyさん: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:???
754nobodyさん:03/06/02 22:02 ID:???
>>750
ハァ?
755748: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と書いてなくても化けてなかったし・・・
756nobodyさん:03/06/02 22:32 ID:???
perlで画像の縦,横の大きさを取り出すには?
757nobodyさん:03/06/02 22:39 ID:???
>>756
画像のフォーマットによる。
758nobodyさん:03/06/02 22:51 ID:???
>>756
>>757を補足。
Image::Size モジュールとか、
GDモジュールとか、
Image::Magickモジュールとか、その辺をググれ。

上から順番に簡単。
759nobodyさん:03/06/02 22:55 ID:???
>>748
念のためにコンテントヘッダーと、<meta>の両方を使って文字コードをsjisにしてみる。
それでもなおわからないのであれば、
1.エディタを疑う。(勝手にEUCにして保存してないか)
2.鯖の設定を疑う。
もう一度確認してみたまい。
7度探してって言うだろ?
760nobodyさん:03/06/02 23:04 ID:9tPqBm3m
拾ってきたCGIファイルをワードパッドやメモ帳で開くと
日本語の部分が文字化けしてることがあるんですが
どうやれば文字化けしないで済みますか?
編集したくてもできなくて困っています。
761直リン:03/06/02 23:10 ID:mGHfwiJV
762nobodyさん:03/06/02 23:10 ID:???
>>760
スレ違い。

EUC-JPなどSHIFT_JIS以外の文字コードにも対応している
テキストエディタ使いなさい。
http://www.vector.co.jp/
763nobodyさん: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
766764:03/06/03 01:20 ID:0MDIlf0d
申し訳ありません。自己解決してしまいました。
報告としてはmkdirのあとに更にchmodをすることで解決するようです。
767nobodyさん:03/06/03 02:02 ID:???
>>766
そんなんあたりまえだろヴァカ
768nobodyさん:03/06/03 02:09 ID:6112bZio
・_・y━””ここで一服
http://homepage3.nifty.com/coco-nut/
そしてあぷろだはここ
http://www.k-514.com/imgbbs1/imgboard.cgi
769748:03/06/03 11:54 ID:???
1個のテンプレートファイルを開いて(ここで、すでにsjisになってることを確認)
(ちなみに秀丸)
一応、もう1回、SJISで明示的に保存したら、うまくいきました。

と、同時に、別のかしょ(テンプレートファイルもまったく別<いじってない)
が、このあと全てなおってました。。。

意味不明です。。。まぁ、なおったからいいんですが・・・
770nobodyさん:03/06/03 12:09 ID:1E21CA31
>769=748 いやだからね CGIファイルがeucなら、 明示的に「Content-Type: text/html;charset=Shift_JIS\n\n」って書かないと、 sjisのテンプレをeucだとして読み込んで出力するんだから化けるの当たり前っしょ
771nobodyさん:03/06/03 13:26 ID:8vlIkX7m
例えば'ef78a90134ef78a90134'という[0-9a-z]を使った文字列を、先頭から2文字づつを16進数としてアレイに格納するにはどう書けば良いでしょう?
文字数が偶数個であることは保証されています。
s/(..)/$1 /gで一旦変換後split, hexするのは思いつきましたが、もっとカコイイ書き方はありますか?
772nobodyさん:03/06/03 13:29 ID:???
773nobodyさん:03/06/03 13:58 ID:???
>>771
unpack
774nobodyさん:03/06/03 14:22 ID:???
open と opendir について質問です。

MS-DOS や windows のファイル共有で使う UNC 名(?)を
open や opendir で使うにはどの様な書式でファイル名を
渡せばいいのでしょうか?

$name = '\\\\share_name\\dir\\';

opendir( DIR, $name );

とか、やっても駄目でした。
775748:03/06/03 14:46 ID:???
>>770
あー、そういうことなんですね。ありがとうございます。
776nobodyさん:03/06/03 15:41 ID:???
配列を先頭からm個に切り詰める方法で何かいいのない?
無限ループ内でm個になるまでpopするくらしか思いつかない。。
777nobodyさん:03/06/03 15:46 ID:???
>>776
$#a=m-1;
778nobodyさん:03/06/03 15:47 ID:???
>>776
splice
779776:03/06/03 15:50 ID:???
うぉ、速レスが2つも。
ありがとうございます。

splice、すっかり忘れてた。恥かしい限りです。
780771:03/06/03 17:11 ID:???
なるほど、↓んな感じですね。'H'の意味を間違えてはまってました。
unpack('a2' x (length($str) / 2) , $str);
781nobodyさん:03/06/03 19:59 ID:???
Undefined subroutine &jcode::f called at jcode.pl line 400.
というエラーが出てしまいます。

もちろんjcodeはいじってませんし、なお、jcode.plは最新版です
この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか?
どこを直せばいいかまったくわからず・・・
782nobodyさん:03/06/03 20:07 ID:???
>781
まず辞書をひく。
783nobodyさん:03/06/03 20:34 ID:PcOC09to
質問です。
えとアクセスしたらIPとそのアクセスした日にち・時間をログに保存するスクリプト教えてください。
お願いします!!ちなみにこれは荒らし対策です
784781:03/06/03 20:37 ID:???
jcodeとは別の自作の方のscriptを、前のバージョンに戻ってそこから書き直したら、
エラーが出なくなりました。

>>782 いや、英語はわかるんですけどねー・・・
結局原因がわからなかったものの、解決してしまいました(なんか歯切れが悪いですが)
785nobodyさん:03/06/03 20:48 ID:???
786nobodyさん: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
787nobodyさん:03/06/03 21:10 ID:9Ku6+BeZ
Undefined subroutine &jcode::f called at jcode.pl line 400.
というエラーが出てしまいます。

もちろんjcodeはいじってませんし、なお、jcode.plは最新版です
この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか?
どこを直せばいいかまったくわからず・・・

788nobodyさん:03/06/03 21:28 ID:???
>>784
おまえは本物のアレか?
「読んだけどよくわかりませんでした」

jcode内部にfなんてルーチンねえよボケって意味だろうが。
可能性としては、
1.おまえのjcodeの扱いが変。
マニュアル読みつつ、jcode呼び出してるところを全部チェックする。
2.jcodeのバグ。
製作者に報告。

ま、1を5000回くらいやってから2だと結論するようにな。
789nobodyさん:03/06/03 21:33 ID:???
相手にしるなと
790nobodyさん:03/06/03 21:48 ID:???
>>786
やり方次第で。

とりあえず思いついたのは、

1.一行取り出して、
2.末尾の時間をコピーし、
3.それをepoch秒に変換し、
4.この秒をキーにしてハッシュに行全体を代入する。
これをファイルが尽きるまで繰り返す。

5.ハッシュからキーを全て取り出し、
6.数値として扱ってソートする。

7.ソート後の順番で値を全部ファイルに出力すれば、完成。

実際のコーディングで難しいのは、3のあたりかもなー。
Dateなんたらモジュール使えば楽にできそうな気もする。
力技で20030603214900みたいな形式に変換しても用は足せるだろうが。
791786:03/06/03 22:38 ID:EuO1wjCe
>>790
レスありがとうございます。
う〜ん、なんか初心者の私には難しそうですね。
さくっとあきらめようかしら。
792nobodyさん:03/06/03 22:44 ID:I9aep0OW
793直リン:03/06/03 23:10 ID:HzexL3AB
794nobodyさん:03/06/03 23:15 ID:???
2バイト文字か、そうでないかを判断する方法を教えてください
795nobodyさん:03/06/03 23:16 ID:???
>794
文字コードで検索。
じゃなきゃ、>>4のサイトをまわってみ。
796nobodyさん:03/06/03 23:22 ID:???
>>791
ソースを晒してみろ。
バグが出てる部分だけでもいいし、
全部を、どこかのアプローダーに上げてもいいし。

少し、見てやるから。
797791:03/06/03 23:23 ID:???
ごめん・・・誤爆ですた。
798796&797:03/06/03 23:24 ID:???
ドツボだ・・・
誤爆2回ですた。
799nobodyさん:03/06/03 23:52 ID:???
>>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";
}
800nobodyさん:03/06/04 02:44 ID:???
大分類(数字二桁)>小分類(ハッシュで 種類,価格) とデータを管理していて、
大分類の数字(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";
}
としても
801800: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"; }
としてもエラーになってしまいます。
どのようにするのがベターなのでしょうか…
802nobodyさん:03/06/04 03:32 ID:???
>>801
でりふぁれんす
803800: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|;
}

たったこれだけで出来るとは・・・すげー(;´Д⊂ヽ
804800:03/06/04 04:00 ID:???
まじですげー
考えたやつエライ(;´Д⊂ヽ
興奮が収まらない・・・
805786:03/06/04 10:33 ID:nmL3emss
>>790
>>799
レス、ありがとうございます。
やっぱり始めたばかりの私には
まだ荷が重いみたい(〃▽〃;)
勉強して出直してきまーす。
806nobodyさん:03/06/04 10:42 ID:???
論理値 $flagに対して
if ($flag) とやるみたいに、

論理値 $HOME[$myhomeid]->{flag} に対して、
if (!$HOME[$myhomeid]->{flag})
としたいのですが、

できない模様です。

どのように表現すればいいのでしょうか?
if ($HOME[$myhomeid]->{flag} == TRUE)
とするしかないですか?
807nobodyさん:03/06/04 10:52 ID:???
>>806
・・・かなり、できる模様ですが。
808nobodyさん:03/06/04 10:53 ID:???
>>805
せっかく作ってやったんだからやってみろよ。
>>799の@mon=...の行は不要だった。消してね。
それとよく見たら、昇順ソートしたいのね。
それなら、{$a <=> $b;}ってとこ、{$b <=> $a;}にすればできるよ。
809806:03/06/04 11:01 ID:???
>>807
え、if (!$HOME[$myhomeid]->{flag})で問題ないはず、ってことですか?
おかしいなー。
810nobodyさん:03/06/04 11:03 ID:???
>>806
>>807
$HOME[$myhomeid]->{flag} = "false"とかやってるに100真珠
811nobodyさん:03/06/04 11:09 ID:???
>>810
ああ・・・なるほど。
それじゃ、俺も同じく・・・

文字列を評価して偽の判定を期待してるに3000カノッサとスパーひとしくん人形を20個。
812直リン:03/06/04 11:10 ID:qArPuVJp
813nobodyさん:03/06/04 13:06 ID:tEfKxFs6
win98で動くPerl用エディタの定番を教えてください。
814nobodyさん:03/06/04 13:15 ID:???
>>813
スレ違い

Perl書くのにどんなエディタ使ってる?
http://pc2.2ch.net/test/read.cgi/php/1014357485/

使いやすいエディタって何よ?
http://pc2.2ch.net/test/read.cgi/php/991372719/
815_:03/06/04 14:11 ID:???
816nobodyさん:03/06/04 15:14 ID:???
自作CGIを評価するスレ
http://pc2.2ch.net/test/read.cgi/php/1049514428/301
これに
> 1、goto文なんか使うな!
って書いてある。
漏れも誰かかにそう言われてずっとそれを守っているのだが、
(つーか、使いたい状況になったことはないが)
何で「使うな」のかと今自分に問いただしても答えが出せない。

ぐぐってみても、C言語でgoto文使う香具師は云々はヒット汁が、
perlでは見当たらない。

だれぞ漏れにgoto文使うなの意味を教えれ!
817nobodyさん:03/06/04 15:23 ID:???
>>816
gotoは用途によっては使ったほうが便利な場合もある

goto ( &sub); みたいに
818nobodyさん:03/06/04 15:48 ID:???
>816
昔のN88BASIC(構造なんて考えずに何でもあり言語)のころからの諺。
スパゲティになるから。
819nobodyさん:03/06/04 15:48 ID:???
>>816
GOTO文有害論は半世紀近い昔に結論されてる。man perlfuncのgotoのところ見るべし。
>>817のは例外
820nobodyさん:03/06/04 15:55 ID:QLc9Kvie
モジュールの中でCGIやCGI::Liteのようなものは

$cgi->is__error and (独自の終了処理);

とすることができるのですが、HTML::Templateのように
自動的にSTDERRに書き込んで終了してしまう物は
どのように自分のスクリプト側でエラーを捕捉することが
できるのでしょうか。

どうかよろしくお願い致します。
821nobodyさん:03/06/04 16:37 ID:yPvJTG3F
822nobodyさん:03/06/04 16:52 ID:gwvKQAZH
★クリックで救える○○○○があるらしい??★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
823nobodyさん:03/06/04 16:54 ID:???
>>821
こんな便利なモジュールがあったとは知りませんでした。
本当にありがとうございました
824動画直リン:03/06/04 17:10 ID:qArPuVJp
825動画直リン:03/06/04 17:10 ID:qArPuVJp
826_:03/06/04 17:23 ID:???
827816:03/06/04 17:51 ID:???
>>817-819
サンクス!
> スパゲティになるから。
が言い得て妙でつた
828nobodyさん:03/06/04 18:25 ID:???
そらそうだろう
829nobodyさん:03/06/04 19:38 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 );
}
830nobodyさん:03/06/04 19:52 ID:???
>>829
chompの動作を誤解してる。
chompは引数の末尾に改行があったらそれを削除するが、
同時に削除した改行文字の数を返り値として戻す。
その数字をsplitに渡してるだけなので、望んだような結果にはならないだろう。
831829: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>までで停止してます。。。
厨なのは分かってますが、どなたかぜひご教授ねがいますです。。。。。
834nobodyさん:03/06/04 22:22 ID:???
>>832-833
あのさ・・・
<b>で停止するって事は、
それ以降で問題が起きてるって事でしょ?
&gethost か、&getip ってルーチンに問題があるんでしょ。
そこを晒しなよ。

それと、ヒアドキュメント使った方がいいぞ。
835nobodyさん:03/06/04 22:28 ID:???
ご、ごめんなさい。やっぱり出直してきますです。。。。
お邪魔シマスタ、、、、
836室長:03/06/04 22:28 ID:???
本当にすみませんでした、、、
837nobodyさん:03/06/04 22:36 ID:???
>>832
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print $ENV{'REMOTE_ADDR'};
838834:03/06/04 22:41 ID:???
>>835-836
おおぉ?
俺、そんな強い口調っぽい書き込みだった・・・?
俺が分かる範囲で付き合ってあげるから・・・・
逃げるこたぁないだろぉ〜
839nobodyさん:03/06/04 22:44 ID:???
おいおい、別に逃げなくてもいいよ。

もしかして、ソースって>>832で全部だったりして……
まさかね。
840nobodyさん:03/06/04 22:46 ID:???
>>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(〜〜〜
っていうのがあったです
必要だったんですか。。。。

厨房でほんと恥ずかしいです。。。ごめんなさいです。。。
843834:03/06/04 23:20 ID:???
>>840
たしかに。
でも、>>832のソースでのバグ取りの質問でしょ。

>>841-842
おっかしな事言うヤツだな・・・
環境変数って言葉を知ってて、なぜ%ENVを知らない・・・?
%ENVが環境変数その物なんだが・・・

とにかく、まったく分かってない状態だな。
変に触って、レンタルサーバとかに上げるなよ・・・。
迷惑になるから。
最低、簡単な掲示板くらい作れるようになれ。
話はそれから。
844室長:03/06/04 23:23 ID:???
>>843
そうだったですか。。。。
もっと勉強してから出直してきますです。
皆さん本当にありがとうございました。感謝です
お邪魔しましたです。。。
845nobodyさん:03/06/04 23:46 ID:???
>>843
> 最低、簡単な掲示板くらい作れるようになれ。
> 話はそれから。

「初心者」って敷居高いのですねぇ、、、
846nobodyさん:03/06/04 23:49 ID:???
while(($n,$v)=each(%ENV)) { print sprintf("%s = %s<br>\n",$n,v); } とかやると環境変数が何なのか掴みやすくなるかも
847nobodyさん: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のときには「\」が必要で、
最後の行では\が不要なのでしょうか・・・?
要不要の違いはどこで判断するのでしょうか?
848nobodyさん:03/06/04 23:55 ID:???
診断くん?
849834:03/06/05 00:00 ID:???
>>845
う〜ん?敷居高い?
俺が初めてPerlで作ったCGIって掲示板だったが・・・
本見ながら、必至で作った。
出来上がった掲示板は・・・
返信機能も、Cookieの機能も、改ページ機能も、
何の機能もない、ただ書き込んだ内容がズラズラ表示される掲示板だった・・・
掲示板と言うか、ゲストブックかな?
そこから、いろんな本買ったり、人のスクリプト読んだりで勉強したけど・・・

掲示板が基本だと思うけどね〜。俺は。
850834:03/06/05 00:05 ID:???
>>847
> $list{sta_kanji} = "春日部";   #駅名を漢字で
ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?

\が必要な時と、必要じゃ無い時は・・・
出力してみろ。

print \$list[0]->{sta_kanji};
print $list[0]->{sta_kanji};

二つの違いを見てみれば分かる。
851nobodyさん:03/06/05 00:08 ID:???
簡単な掲示板を作れってのはちょっと酷だろ。
まずは他人の掲示板の改造から入るのがいいんじゃないか?
まぁ、大前提としてHTMLをわかってないといけないが。

あ、そうそう。
掲示板の改造とかなら改造スレで質問してね。
852nobodyさん:03/06/05 00:11 ID:???
おれが初めてperlに触ったのは、minichatの改造だたーよ
853nobodyさん:03/06/05 00:15 ID:???
cgiの基本は掲示板かもしれん
854834:03/06/05 00:25 ID:O0RMOoYP
print \$list[0]->{sta_kanji};
で、
SCALAR(0x80d55c8)
と出ましたが、わかりません(泣)
スカラー値ということでしょうが、
一体どこのスカラーを差しているのでしょうか?(変な日本語かな)

あと、0x80d55c8っていうのは、なんなんでしょうか?
ググろうかとも思いましたが、そもそもググる単語がわからず。。。
855847:03/06/05 00:29 ID:???
すいません、>>854 において、名前欄を書き間違えました。ただしくは >>847でした。

あと、
>>850 さん
>> $list{sta_kanji} = "春日部";   #駅名を漢字で
>ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
いえ、間違いというか、その直後にpush (@list, \%list);してるので。
(@listと%listがややこしかったですね、すいません)
856nobodyさん:03/06/05 00:29 ID:???
何でもそうだけど、目標があるのとそうでないのとでは、やっぱり意識が違う。
掲示板って、作ったあとそのまま使えるし、プログラム的にも簡単な部類だし
おそらく世の中にあるCGIでは最も数が多いだろうから、参考にするコードも多い。
Perlを覚える教材としては一番ふさわしいと思う。

そういう俺も、最初は掲示板の改造→自作→その他のCGI、という流れで覚えた。

>>854
それは変数の内容があるアドレス。そこにスカラー値が入ってる。
ぐぐるなら「デリファレンス」。
(本来はリファレンスなんだけど、それだと無関係なほうがいっぱい引っかかるんで)
857nobodyさん:03/06/05 00:34 ID:???
>>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";
を比べて見やがれ。
858834:03/06/05 00:41 ID:???
>>851-853
そっか、みんな改造から入ったのか〜。
プログラム入門がPerlだった俺は、死ぬ思いだった・・・

ちなみに、CGIの基本は掲示板だと俺も思う。
Perl/CGIができるヤツに、掲示板作らせたら一発でレベルが分かる。

>>855
見落とししてた・・・。スマン
ちなみに、答えは>>856が答えてる通りで、
メモリ内の、スカラー値が格納されてる番地を表す。
Cのポインター相当。
859nobodyさん:03/06/05 00:47 ID:???
俺はCGI以前からサーバプログラム作ってたからいかにサーバに負担かけないかという
習性が身についてたのね。minibbs見たときはぶっ飛んだよ。
860nobodyさん:03/06/05 01:34 ID:???
>>849
同意

>>851
改造の方が難しくないか?(改造ってHTMLいじるとかそんなんじゃないよね?)
それに1から順を追って作った方が理解できると思う。
861nobodyさん:03/06/05 01:41 ID:???
>860
改造ったって、BBSの入力項目一つ増やすだけだって立派な改造でしょ。
それなら簡単だし、変数とかにも触れて、案外入門としてはいいかもとか思ってる。

tu-ka,俺がそうだった。
1から順を追って作ろうとすると挫ける性格なんだよ。
大体、そういうやり方で覚えられる奴はこんなところで質問しない。
862nobodyさん:03/06/05 01:44 ID:???
そういうやり方 = 1から順を追って作るやり方、ね。
863nobodyさん:03/06/05 02:24 ID:???
>>861
>BBSの入力項目一つ増やすだけ
って言ってもCGIの入力・処理・出力を全てやらなきゃいけないから辛いと思うんだがなあ。
1から作る方だと、まず出力、次に入力したやつを出力、最後に入力した奴を処理して出力
と段階を追っていけるから理解が早いのではないかと。
改造の方だと一応改造に成功しても、結局中でどういう処理がされているかが分からないし。

俺はプログラマの講師をやっていた頃があって、その経験からこういう結論になってる。
CGIに関しては数回に渡って100人ぐらいに教えたけど、改造させるより1から作らせる方が飲み込み早かったよ。

まぁ個人差があるから全員がそうというわけではなかったから、このように意見が分かれるんだろうな。
864nobodyさん:03/06/05 02:33 ID:???
>>854
んー、jcode::convertの内部の動きを見てないので想像だけど、
内部的にデリファレンスされた値を受け取って処理できないんじゃないかな。
jcode::convertに特有の仕様だと思うなぁ。

リファレンスについては、
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_toc.html#TOC86
ここを読むといいかも。(結構難しいけどね)
オライリージャパンから出てる「プログラミングPerl」が手元にあるなら
ひたすら「リファレンスとネストされたデータ構造」の章を読む。

ぐぐるときは「ハードリファレンス」「シンボリックリファレンス」なんて
キーワードを使ってみるといいかも。
865nobodyさん:03/06/05 02:38 ID:???
>>861
俺は逆に、「人の作ったものの改造」が苦手だ。
(悪い例かもしれないけど)某K○NTのBBSスクリプトとか
拾ってきて、さていじろうと思っても、
どこがどこの処理をしてるのかサパーリわからん。
今にして思えば、変数のスコープがぐちゃぐちゃしてたから
わかりにくかったんだろうけどね。

掲示板で勉強していくなら、「この掲示板と同じものを自分で作ろう」
っていうのが一番いいと思うな。
改ページとか、どうやるんだろうって処理は既存のものを参考にして、
あとは自分の手で書いたほうが結局は理解が早い。

あと、モジュール使うと非常に勉強になるね。
使い方をマスターするために必要な知識がたくさんあるから
結果としてそういうものも身に付いていく。
866nobodyさん:03/06/05 02:48 ID:???
cgilib.plとかCGI.pmとかだけは最初に使わない方がいいな。
基礎(%ENV,QUERY_STRING,PATH_INFO,type="file",etc.)を身に付けるためにも。
結局は外部モジュール使うようになる(し、そうすべきだ)けど、
この辺の遠回りは無駄にはならないと思うし。
>>865は分かってるだろうけど一応。
867nobodyさん:03/06/05 02:52 ID:???
BBSの入力項目を1つ増やすだけ、の話をするヤシは、
プログラマ板のデスマーチ大作フラッシュを見て泣いてくれ。

スレに関係ないのでsage
868nobodyさん:03/06/05 02:57 ID:ECImrkCL
>>863

全く同感。

俺も最初は他人の物に手加える方が楽かと思ってたが、
あるキッカケで丸ごと自作のを書いたら、そっちの方が
楽だったし、何よりも頭に入った。
おかげで、他人のスクリプト見ても理解する能力も格段に進歩したし。

他人のもんいじるって言うのは、工数自体は少ないから
楽に感じるかもしれないけど、実はあまり足しにならないし、
いつまでたっても初心者になり続ける罠。
869868:03/06/05 03:00 ID:ECImrkCL
あ、というか、今はバイトでperlやってるけど、他人のものいじる
方が全然疲れるし難しいと思うよ。まーそりゃ予めいじられるのを
前提としたフラグとかある部分に関してはそんなことないけど。

それに単機能の掲示板作るのって全く難易度高くも何ともないと思うんだけど。
それすら酷って言う奴は…
初心者と認められるにはワンライナー限定っすか?
870_:03/06/05 03:03 ID:???
871nobodyさん:03/06/05 03:04 ID:???
アセンブラをいぢってたこともあって、リファレンスやらポインタは難無く理解できた。
がしかし、クラスやらインスタンス、淫ヘリ箪笥・・・ちーっとも理解できていません(つД`)

movem.l d0-d7/a0-a6,-(sp)
の頃が懐かしい、、、
872直リン:03/06/05 03:10 ID:C/yWLjzO
873nobodyさん:03/06/05 03:10 ID:???
>>866
あぁ、わかります。
フォーム内容のデコードとか画像アップロードする際の
--------- ←こんなのの除去とか、
「プログラミング言語」とは直接関係の無いことかもしれないけど、
知ってると知ってないじゃ全然違うし知ってなきゃいけないことだし。

俺が初めて買った「Perl/CGI入門」系の本も、
ccgi-lib.plとjcode.plを使えと書いてあったけど、
アレを読んでも何が行われているのかは全くわからないな。
「動けばいい、内部構造など知らん」ってのは
プログラマの立場としてはあんまり良くない態度だわなぁ。
874nobodyさん:03/06/05 07:30 ID:UTEewkkC
クライアントアプリをperlで作るにはどうすればいいのでしょうか?
ベクターなどで探してもコマンドラインを使って操作するようなアプリしかなかったのですが、
誰でも操作できるようにコマンドラインを使わないで
クライアントアプリを簡単に作る方法はないのでしょうか?
875nobodyさん:03/06/05 07:52 ID:l4KCIFT8
じゃあコンソールで。
876_:03/06/05 09:06 ID:???
877動画直リン:03/06/05 09:10 ID:C/yWLjzO
878nobodyさん:03/06/05 11:32 ID:???
>>874
クライアントがPerlをインストールしている前提ならば、
Perl/Tkを使えば可能になる。
879_:03/06/05 12:06 ID:???
880nobodyさん:03/06/05 14:02 ID:???
>>878
その点、MacOSXは有利だよね。

いまちょっといろいろと考えているんだけどね。
881_:03/06/05 14:10 ID:???
882nobodyさん:03/06/05 15:51 ID:62PtIZ8T
ガイシュツかも知れないけど、cyrptの逆アセというか、
希望の暗号化文字を引っ張り出すような関数は
誰か作ってないのでしょうか?
883nobodyさん:03/06/05 16:04 ID:???
>>882
そもそも非可逆なアルゴリズムなので、デコード的な処理は不可能。
884nobodyさん:03/06/05 16:23 ID:uDBKSvvR
逆アセってなに?
885nobodyさん:03/06/05 18:36 ID:???
逆アセンブルの略、、単に使ってみたかっただけでしょう。

そもそも、アルゴリズムは公開されてるんだし…

そもそも、概出だし…
886nobodyさん:03/06/05 19:03 ID:y1a1B1oZ
キャップにmonaとか出してる人いるでしょ、ソレやりたいの。
887nobodyさん:03/06/05 19:11 ID:???
>>886
はいはい、もうどっか逝って
888nobodyさん:03/06/05 19:21 ID:???
<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→パス認証→データに書き込み。だと
          ↑ここでフォームのデータが送られないんですが、どうすればいいでしょうか?
889nobodyさん:03/06/05 19:25 ID:???
だからCGIの質問はCGIスレでしてくれってば。
890nobodyさん:03/06/05 19:34 ID:???
え、CGIってphpとかrubyとか全部含めてだから、
perlのことはPerlスレじゃないの?
891nobodyさん:03/06/05 19:37 ID:???
Perlじゃないんだよ。
892nobodyさん:03/06/05 19:37 ID:???
>>1にも書いてあるが、ここはPerlの「コーディング」のスレなんだよ。
そもそも>888はたまたまPerlを使ってるのかもしれないが、その質問自体は、
Perlに限られた話じゃないから、CGIスレ向けということ。
893nobodyさん:03/06/05 19:37 ID:???
とりあえずソース晒せ。
894nobodyさん:03/06/05 19:40 ID:???
でも既に>>181みたいなのにも答えてるわけだから、もはやコーディング専門というわけにも
いかんだろう。
アルゴリズムまで許容するとなれば、>>888のような質問もアリでは。
895nobodyさん:03/06/05 19:44 ID:Dbz7wb1c
あなたが探してるのってこれだよね?でも眠れなくなるよ!
http://endou.kir.jp/betu/linkvp/linkvp.html
http://angelers.free-city.net/page003.html
896nobodyさん:03/06/05 19:46 ID:???
>>893
えぇと、ソースといわれると、300行以上ありまして、
ファイルの作成、編集などのツールです。(ログファイルにというのは、簡単なたとえのつもりです。
要するにフォームのデータをパスワード画面を通して(1回余分な部分を通過して)送るにはどうすれば?ということが聞きたかったんです。)

できあがってるんですが、それにパスワードをつけないと危ないので、つけようとおもっているんです。
とりあえず、新規作成の時のhtmlのソースと、
作成のときのcgiのところをさらしますね。
パスワードとかはまったく手をつけてないじょうたいです。
897nobodyさん:03/06/05 19:47 ID:???
<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>
898nobodyさん:03/06/05 19:48 ID:???
>>890
888を見ただけじゃ、readparseって文字見て
恐らくPerlかな、としか分からないだろ。
Rubyかもしれないじゃないか。

ところで、パス認証って、CGIの中でやるやつか?
それともサーバ自体の機能かな?
899nobodyさん:03/06/05 19:48 ID:???
>>896
そのHTMLファイルでパスワードを入力させるのは嫌なの?
900nobodyさん:03/06/05 19:50 ID:???
#!/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";
}}}
901nobodyさん:03/06/05 19:55 ID:???
¬_fileはファイル名がない場合の警告、
&uwagai_fileは上書き時のメッセージです。
&uwagaki_fileには、open(FILE >$nameなども入っていて、上書きしし、「上書きしました」というメッセージを出す、サブルーチンです。

>>899
えぇと、htmlは省略してしまいましたが、
ファイル、ディレクトリのラジオボタン
新規作成、削除、編集、コピー、属性変更のラジオボタンがり、すべてできるようになっています。
(cgiでhtmlを出力していますが・・)

ですので、submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
902nobodyさん:03/06/05 19:55 ID:???
>>898
単なるCGIの中での認証です。
903nobodyさん:03/06/05 19:57 ID:???
>>901
なんでsubmitボタンを押してから入力させたいの?
一緒に入力させればいいのに・・・・
ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK


Perlとなんの関係もないね・・・
904nobodyさん:03/06/05 20:00 ID:???
>>901
> submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
一度クライアントにフォームデータを全部hiddenで返して、再度passとともにcgiに送るしかないのでは?
905nobodyさん:03/06/05 20:01 ID:???
>ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
これって、入力画面では、>>897のが送られた場合、
&ReadParse(*in);
$name = "$in{'name'}";
$body = "$in{'body'}";

<input type="hidden" name="name" value="$name">
ってことでしょうか?

906nobodyさん:03/06/05 20:01 ID:???
そういうこと。
907nobodyさん:03/06/05 20:02 ID:???
>>904
やっぱりhiddenで送るしかないんですね。。。
>>903さんのおっしゃるとおりパスワードを一緒に入力させればいい話でしたね。。。
908nobodyさん:03/06/05 20:03 ID:???
>>906
俺フォームメールでこれやって挫折したような覚えがあります。。
ここの住人の方が言ってくれるからにはできるんでしょう。
がんばってみます。。。
でも、一緒に入力するほうが、使用する側としても気分がいいですよね・
909nobodyさん:03/06/05 20:08 ID:???
完全にCGIの話だったな。
910nobodyさん:03/06/05 20:09 ID:???
では、ノシ
911nobodyさん:03/06/05 20:24 ID:???
(*^-^)ノシ
912nobodyさん:03/06/05 20:31 ID:???
ヽ(゜▽、゜)ノシ
913nobodyさん: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は偽を返してくるのでしょうか?
914nobodyさん:03/06/05 22:11 ID:???
熨斗
915_:03/06/05 22:17 ID:???
916nobodyさん:03/06/06 00:16 ID:???
>>913
XPのバグじゃないの?
ほれ、関係者にメールだメール。
917nobodyさん:03/06/06 05:22 ID:???
>>913
おそらく、readdir() で読み込んでるディレクトリと、-d した時点で参照してるディレクトリ
(カレントディレクトリ)が異なってるせいかと。
-d のときにフルパスでチェックするようにしてみては。
918nobodyさん:03/06/06 16:56 ID:???
#!/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;}  ///←ここは作成途中なのであしからず
};

919918: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出力の重複を避けるにはどうしたらいいですか?
920nobodyさん:03/06/06 20:34 ID:???
>>919
2つにわける。
921nobodyさん:03/06/06 20:43 ID:???
凡例:
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>
とする。
922nobodyさん:03/06/06 20:44 ID:???
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;
923nobodyさん:03/06/06 20:51 ID:???
どうしても1つのファイルにしたいのなら、
method が GET のときは、921 を出力して終了。
method が POST のときは、922 を実行して終了。
になるように振り分ける。

・・・など。
924nobodyさん:03/06/06 21:26 ID:???
なんでこのスレでCGIの質問するんだ?
うざいからCGIのスレ逝けよ
925nobodyさん:03/06/06 21:38 ID:???
CGIでもコーディングの質問なら問題ない。
926nobodyさん:03/06/06 22:17 ID:???
>>918
・まず、ほとんど同じコードを二度も三度も書くのはばかばかしいと思うようになろう。
・まとめられる部分はまとめるようにしよう。
・printとprintの間に他のコードが入っても、一向に問題にならない。
・content-typeは、そのCGIが最初に吐き出す文章であることが重要。二度も吐き出す必要はない。

てかさ。Perlとか云々以前にプログラミングそのものがわかってないような。
927nobodyさん:03/06/06 23:10 ID:???
あのー、
テキストエリアにからのフォームデータ
$bodyを(もちろんReadParseして)

$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
で、CR+LF→LFにならないんでしょうか?
実行するとこの行がエラーになるんですが・・・
928nobodyさん:03/06/06 23:20 ID:???
>>925
「CGIの質問」はスレ違いだろ。何言ってんだ。
あとCGIのコーディングってなんだよ。
929nobodyさん:03/06/06 23:23 ID:???
>>927
「エラーになるんですが・・・」じゃねーよバカ
エラー出てるんなら貼れ&>>1を100回声に出して読め。

$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;

$body =~ s/(.*)\x0D\x0A$/$1\x0A$/g;

$body =~ s/\x0D\x0A$/\x0A$/g;
930nobodyさん:03/06/06 23:24 ID:???

$body =~ s/\x0D\x0A$/\x0A$/;
931nobodyさん:03/06/06 23:27 ID:???
>>928
CGIとしてのPerlの質問であっても、コーディングに関してであれば問題ない。
って言いたかったの。
932nobodyさん:03/06/06 23:30 ID:???
>>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.

933nobodyさん:03/06/06 23:34 ID:???
>>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/;
934nobodyさん:03/06/06 23:38 ID:???
>>933
うーん、できませんねぇ。
Win改行のままです。。。
935nobodyさん:03/06/06 23:41 ID:???
>>932
置換後の文字列に正規表現書いてどうすんだ?
936nobodyさん:03/06/06 23:51 ID:???
>>935
え?これでだめなんでしょうか?
ちなみに>>933の一番下のを試してもだめでした。
937936:03/06/06 23:55 ID:???
ぁ、$body =~ s/\x0D\x0A$/\n/;
これですんなりできたけどこれっていいの?
938nobodyさん:03/06/06 23:55 ID:???
>934,>936
お前報告の仕方悪い。
エラーが出なくなったことをまず報告してから、その上で期待する結果が得られなかったと言いなさい。

で、改行コードを変換して、どこに出力しようとしてるのかな?
まさかSTDOUTに出力して、IEでソース見てたりしないよな?
939nobodyさん:03/06/06 23:57 ID:???
>>937
Win改行かどうかってどうやって調べてんの?
940936:03/06/06 23:59 ID:???
ごめん、普通に考えれば
\x0D\x0A=\r\n
\x0D=\r
\x0A=\n
だね。。。。
マッチさせるときも、置き換え後も、
16進数のほうがいいんでしょうか?

>>938
>で、改行コードを変換して、どこに出力しようとしてるのかな?
>まさかSTDOUTに出力して、IEでソース見てたりしないよな?
ファイルに保存するツールなんです。
改行コードを書き換えてファイルに保存する、というところでひっかかってました
941936: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 = "";}
とやってます。
942nobodyさん:03/06/07 00:00 ID:???
ところで、ちゃんとLFになったかどうかのチェックはどうやってる?

あと「エラーがでます」「だめでした」などの曖昧な表現はやめよう。
「どういうエラーが出るのか」「どのようにだめだったのか」を必ず書くようにね。
943nobodyさん:03/06/07 00:01 ID:???
>>940
> ごめん、普通に考えれば
> \x0D\x0A=\r\n
> \x0D=\r
> \x0A=\n
> だね。。。。
違う。\nはOSによって変わる。
\n = \x0D\x0A DOS,Win
\n = \x0D Mac
\n = \x0A etc.
944936:03/06/07 00:01 ID:???
>>942さん
>>941です。。
945936:03/06/07 00:02 ID:???
>>943
あ、そうなんですか。
では、改行コードの変換は16進数でしたほうがいいんですか??
946nobodyさん:03/06/07 00:06 ID:???
こんなんか?

#!/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)
になったぞ。
947936:03/06/07 00:10 ID:???
>>946
わざわざつくっていただきありがとうございます。でも完成しました。。

ところで、友達も「改行コードはバイナリモードで解決した」
といってましたが、なぜバイナリモードで読むのでしょうか?
私が作ったのはバイナリにしないでも改行コード変換できましたよ?
948nobodyさん:03/06/07 00:11 ID:???
>>947
お前バイナリモードの意味分かってないだろ?
取り敢えず検索する癖をつけろ。
949936: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);

これでできたんですが、、、どうなんでしょうか
950936:03/06/07 00:14 ID:???
>>948
テキストモードって勝手にコードの変換がされるんですよね??
951nobodyさん:03/06/07 01:43 ID:Y8iN/hYF
ふたつのファイルをrequireで呼び出すにはどうすればよいのですか?
require './data/data_1.cgi';
ひとつだけ呼び出すのは↑こんな感じになってました
data_1.cgiとdata_2.cgiのふたつを呼び出したいです
952nobodyさん:03/06/07 01:45 ID:???
>>951
require './data/data_1.cgi';
require './data/data_2.cgi';
>>951の質問はこれにて終了しました。
↓次の方どうぞ
953936:03/06/07 02:27 ID:???
何度もすいませんが
ファイルの内容を
while( <FILE> ){print;}でテキストエリアに渡した場合は、Windows改行になるのでしょうか?
954nobodyさん:03/06/07 02:34 ID:???
処理系依存かな
955936:03/06/07 02:36 ID:???
>>954
処理系依存、といいますと、クライアントのOSに影響するということですか?
956nobodyさん:03/06/07 02:50 ID:???
>>955
そのスクリプトが実行されるOS。
どうような違いがあるかは、>>943を参照
957936: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だと思ったんだけど、意外だ・・・・
958nobodyさん:03/06/07 06:18 ID:???
>>953
そのファイルがどの環境で作られたのかによるんじゃない?
Windows環境で書いたファイルであれば、どこに持っていこうがCRLFのまま。
これをUNIX系環境で1行読み込んだ場合、LFの前のCRは「文字列の一部」として
そのまま読み込まれるだけだと思うんだが。

なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
自動的にLF改行になるとか、そんな感じに勘違いしてない?

それと、あなたの実行環境ってローカルで動かしてるサーバーだよね?
間違ってもレンタルサーバーとかプロバイダスペースじゃないよね?
なんか会話が噛みあってないから。
959nobodyさん:03/06/07 11:48 ID:???
置換処理で困っています。

掲示板で(^-^)などの顔文字があればそれを画像にすりかえるために
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などにしてみると置換されました。
特殊な文字だから置換がうまくいかないのでしょうか?
どうすれば解決できるか教えてください、お願いします。
960936:03/06/07 12:00 ID:???
>>958
>なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
>自動的にLF改行になるとか、そんな感じに勘違いしてない?
へ?ぜんぜん思ってませんよ。。。
961936:03/06/07 12:05 ID:???
>>958

えと、つまり
Windows環境で、テキストエリアに入力した文字をcgiに送って
$body =~ s/\x0D\x0A$/\x0A/;
こうしても、LFにならないってことでしょうか?
962nobodyさん:03/06/07 12:36 ID:???
>>959
顔文字が正規表現のメタ文字として解釈されているんでない?
顔文字のメタ文字を\でエスケープするか、もし面倒ならquotemetaであらかじめ
変換しておくとか。(\Q \Eって使えたかな…どなたか助言求む)
できればソースを書きたいんだけど、いま手元に実行環境がないんで勘弁して。
963nobodyさん:03/06/07 12:51 ID:???
>>961
いい加減うぜぇ。2ちゃんは学校じゃねぇ。
質問等はまとめて話せ。少しは自分で調べて話せ。
>こうしても、LFにならないってことでしょうか?
やってみろバカ。プログラムに実験はつきものだ。
964936: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)";}
こいつで正確に改行コードがえられるのかだけ教えてくれませんか?
965nobodyさん:03/06/07 13:10 ID:???
>>964
それは何も変わらないだろ?チェックしてるだけだ。
もう質問は止めてPerlの超初心者本を読むことをお勧めする。
966nobodyさん:03/06/07 13:12 ID:???
(´-`).。oO(やってみればぁ、、、)
967959:03/06/07 13:45 ID:???
>>962
メタ文字を\でエスケープしたりquotemetaもやってみましたがだめでした。
なんでかなぁ・・・。
968nobodyさん:03/06/07 14:02 ID:mCmiN6Nz
>>965
ぃゃ、チェックできるのかを質問してるのに
チェックしかできないって怒られても……
969965:03/06/07 14:03 ID:???
>>964
すまん。
>改行コードがえられるのかだけ

>改行コードかえられるのかだけ
に見えてた。

末尾の改行に関してはそれでいける。
でも>>966の言うようにやってみれば分かるだろ。
CR+LF,LF,CRなファイルを用意してやってみればいいんだから。
970nobodyさん: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:???
972970:03/06/07 14:27 ID:mCmiN6Nz
追記
さっきの/sは/gの間違いでした。
で、/gなんですけど、試したところ複数行の文字は/gがないとコードが変わりませんでした。
たぶん/gを省いてくれた人はチェック時のことをいってくれてたんですね。
973名無し募集中。。。:03/06/07 14:53 ID:???
chmod(0666,"$logfile");
和鳥でこれが使えないのでデリったら書き込みができなくなった
なんか方法はありまつか?
974nobodyさん:03/06/07 15:11 ID:???
>>963
お前頼むからスレタイよく読んでから書き込んでくれ。
http://up.2chan.net/d/src/1054780479575.jpg
975nobodyさん:03/06/07 15:40 ID:???
>>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になるんでしょうか?
意味が分かりません。
正規表現の$の意味は?
976nobodyさん:03/06/07 17:37 ID:???
改行コードが何物かをもうちょっと勉強してみればわかると思うよ。
UNIXでCRがどういう意味を持ってるかってこと。
977936: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がなくなっているので・・・
978936:03/06/07 17:38 ID:???
&& $bin !=~ /40/
これは無視しちゃってください。
ファイル一覧取得するスクリプトの一部分で、
こいつで、ディレクトリ以外の改行コードの取得ってことです。。
すいません。
979936:03/06/07 17:42 ID:???
本当にもうしわけありません。
CR改行の件ですが、ローカルではできたのにレン鯖ではできなかったんです。
で、ただたんにスクリプトを更新していなかっただけでした。すいません。
980nobodyさん:03/06/07 17:59 ID:???
(´-`).。oO(こんなけ引っ掻き回しておいてそういうオチに持ってくるのかぁ、、、勉強になるなぁ。)
981936:03/06/07 18:17 ID:???
>>980
やっぱりできませんでした。
CRの場合、最後の行を改行しないと認識してくれませんねぇ。。。
982nobodyさん:03/06/07 19:13 ID:???
>>967
どうやってできなかったのかな?うちでは両方できたけど。
%list = (
    '(^-^)', 'kao1.gif',
    '(T-T)', 'kao2.gif',
);
$msg =~ s/\Q$_\E/$list{$_}/g for(keys %list);
983967:03/06/07 19:58 ID:???
>>982
あぁ・・・書き忘れてました。\Qと\Eのは書き方はわからなかったのです。
たぶんquotemetaの書き方も間違っていたんだと思いますけど。

できました。教えていただいてありがとうございました。
984nobodyさん:03/06/07 20:10 ID:???
ディレクトリが存在するかどうか確認する方法ってありますか?
何層も下の場合でも使えるの・・
985nobodyさん:03/06/07 21:10 ID:???
986nobodyさん:03/06/07 22:00 ID:???
>>985
ファイルテスト演算子ってディレクトリに使ってもいいんですか?
987nobodyさん:03/06/07 22:01 ID:???
988nobodyさん:03/06/07 22:05 ID:???
IPやホスト名を2chのIDみたくしたいです。
誰か教えてください。
989nobodyさん:03/06/07 22:06 ID:???
つまり、>>987は「聞く前に試してみろ」と言いたいのだな.。
990nobodyさん:03/06/07 22:07 ID:???
>>988
crypt
991nobodyさん:03/06/07 22:08 ID:???
>>988
くりんぷと
992nobodyさん:03/06/07 22:13 ID:???
>>989
違う。
>>985がファイルテスト演算子って言いたいだけだったら
わざわざGoogleへのリンクを貼らないだろう。

>>986>>985のリンク先を一つも見てないからもう一度貼ったまで。
http://www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%86%E3%82%B9%E3%83%88%E6%BC%94%E7%AE%97%E5%AD%90&ie=UTF-8&oe=UTF-8&hl=ja&lr=lang_ja
の一番上のリンク見るだけで解決する話なのに。まあ>>986は氏ねってこった。
993nobodyさん:03/06/07 22:13 ID:UHTFNtX1
初心者で申し訳ないのですが、Perlモジュールのアンインストールは
どうやればよいのでしょうか。
調べてもこれといったものが見つからなかったため、教えていただき
たい次第です。
994nobodyさん:03/06/07 22:14 ID:???
>>989
・・・あんまり回答になってなかった。
「聞く前に試してみろ」と言いたいのではなく、「聞き返す前に読め」といいたい。
せっかく答え返ってきてるのに、何のために聞き返すのかサパーリ。まあ>>986は氏ねってこった。
995nobodyさん:03/06/07 22:18 ID:???
次スレは?
996nobodyさん:03/06/07 22:19 ID:???
うむ、>>986は氏ねってことには同意だ。
997nobodyさん:03/06/07 22:20 ID:???
>>993
スレ違い
998nobodyさん:03/06/07 22:21 ID:???
そろそろ新スレ立てたほうが良いのでは?
999nobodyさん:03/06/07 22:22 ID:???
Perlは死滅。次スレは要りません。
1000nobodyさん:03/06/07 22:22 ID:???
C1000タケダ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。