Perl 初心者コーナー Part23
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
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
0002nobodyさん
03/05/16 11:18ID:???Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
0003nobodyさん
03/05/16 11:19ID:???Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/test/read.cgi/php/1050369328/l50
[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
0004nobodyさん
03/05/16 11:20ID:???・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/
0005nobodyさん
03/05/16 11:20ID:???・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/
0006nobodyさん
03/05/16 11:29ID:???・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/
0007nobodyさん
03/05/16 11:30ID:???( l _、_
\ \ ( <_,` )
ヽ___ ̄ ̄ ) おちゅかれ。7GET
/ /
0009nobodyさん
03/05/16 13:45ID:???そういう限定は一切無し?
それともperlというと暗にcgiのことで、
web用に使う人しかおらん、という前提だろうか。
0011nobodyさん
03/05/16 13:58ID:???Perlについての質問箱 5箱目
ttp://pc2.2ch.net/test/read.cgi/tech/1053053082/
CGIではないPerlの話なら、ム板のスレがいいと思われ。
0012nobodyさん
03/05/16 14:50ID:???cgi書いたことねえ。
0014nobodyさん
03/05/16 16:21ID:???ム板の方では、cgiはWebProgに逝け、と誘導されてる訳で、
その割に、こっちの方では特にcgi向けのスレであることを謳ってない。
というか、むしろperl全般に見えるしcgiに特化した話を排斥する
傾向さえ見られる。
スレのスタンスがよくわかんない、という話。
0015nobodyさん
03/05/16 16:25ID:???基本的にはCGIでのPerl話題。
WebProg板だからな。
CGIに特化した話を排斥しているように見えるのは、その話題がほぼ必ず
「コーディングの話題じゃない」からだ。
つまり、「CGIとしてPerlを使う時のコーディングの話題」のスレってことだ。
確かにスレタイや>>1を見ただけではわかりにくいかもな。
0016nobodyさん
03/05/16 16:39ID:???ム板のPerlスレは、いつもるびきちやらにwebprog行けって
言われて、前の(前の)スレは、あいつに荒らされでぽしゃった。
だから、CGIじゃないPerlの話題もこっちが主流だった。
こっちじゃ、CGIのスレがあるから、Perl初心者コーナーは、
CGI以外のPerlについて話す場所にしようとみんなでしてた。
前の前のスレの>>1を見れば分かる。
でも、るびきちの荒らしがなくなったので、まあ、CGIでも
CGI以外でもPerlのコーディングに関するものなら、いいんじゃ
ないか。高度なのは、ム板、比較的簡単なのは、こっちで
どうかな。
0017nobodyさん
03/05/16 17:40ID:Jkp+t2ia'sql_arrange' => "顧客絞込み条件の入力",
'select' => "該当顧客の閲覧",
'writemail' => "メールの記入"
);
foreach $value (keys %mode2name){
$HtmlTmp .= qq|$mode2name → |;
}
print $HtmlTmp;
とやると、
「該当顧客の閲覧 → メールの記入 → 顧客絞込み条件の入力 → 」
と表示されます。
これを、%mode2name = で設定した順番、つまり、
「顧客絞込み条件の入力 → 該当顧客の閲覧 → メールの記入」
と表示させるには、
foreachの部分はどう書けばいいのでしょうか?
0019nobodyさん
03/05/16 17:56ID:???foreach $value ('sql_arrange','select','writemail'){
$HtmlTmp .= qq|$mode2name{$value} → |;
}
0020nobodyさん
03/05/16 18:20ID:???ハッシュに入っているキーの量が少ない(メールフォーム程度)なら、
キーに01,02等の通し番号を(キーの頭に)付けておいて、
foreach $key (sort keys %hash)
する手がある。表示もcgiでやるならsprintfして出力するだけだから簡単。
場当たり的なのが欠点。
perl cookbookにはTie::IxHashモジュールを使えとある。
こっちの方がたぶん正道のような気もするが、使ったことないので要調査ということで。
002117
03/05/16 19:01ID:???頭いい!?と思ったが、
ちょっとそれは気持ち悪い。。。
>>20
とりあえず、
>キーに01,02等の通し番号を(キーの頭に)付けておいて
でやってみます
0022nobodyさん
03/05/16 23:42ID:???'sql_arrange' => ["01","顧客絞込み条件の入力"],
'select' => ["02","該当顧客の閲覧"],
'writemail' => ["03","メールの記入"]
);
で、1項目目でソートしたキーを入れるに入れて
foreach ( @hoge ) {
$ref = $mode2name{$_};
$.... .= "$ref->[1]";
}
見たいな感じでいけないかな。実際に動かしてないからちびっと不安
0023nobodyさん
03/05/16 23:43ID:???0024nobodyさん
03/05/17 00:51ID: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];
これでは別々になってしまうし・・・
0026nobodyさん
03/05/17 07:15ID:wMi5ghdiほにゃらら if ほげほげ
ってかきかたはできるみたいですが、
これにelseの意味も加えた1行の書き方ってないですか?
0027nobodyさん
03/05/17 07:20ID:???初心者が見て勉強になるソースってどれでしょうか?
0029nobodyさん
03/05/17 08:08ID:+QQFZ4NNhttp://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
http://members.tripod.co.jp/neatstyle/index.html.html
0030nobodyさん
03/05/17 10:38ID:0rspM7nmhttp://accessplus.jp/staff/in.cgi?id=11141
プニュ ( ゚∀゚)σ)´Д`)
0031nobodyさん
03/05/17 10:55ID:bv1ocBAi0032nobodyさん
03/05/17 14:49ID:???こんなののほかに何かいいのありますかね。
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;
よろしうお願い島。
0033nobodyさん
03/05/17 14:57ID:???開くなら開く。読み込むなら読み込む。
0034nobodyさん
03/05/17 15:03ID:???0035nobodyさん
03/05/17 15:10ID:???つうことは、(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)は、ちょっとばかばかしいしぃ。
0038nobodyさん
03/05/17 15:40ID:???自分でもクソ質問って分かってるけど、なぜか思うように動かないのです。
$pattern[0] = "あああ.30";
($test_1, $test_2) = split("\.", $pattern[0]);
print "$test_1\n";
なぜか代入されない。不思議。
0039nobodyさん
03/05/17 15:45ID:???($test_1, $test_2) = split("\.", $pattern[0]);
↓
($test_1, $test_2) = split (/\./, $pattern[0]);
不思議。
0041nobodyさん
03/05/17 16:16ID:???そういうもんだろ。
不思議。
004238
03/05/17 16:21ID:???($decode_name, $decode_value) = split("=",$decode_pair);
上の二つは正常に作動してるから、
($test_1, $test_2) = split("\.", $pattern[0]);
これも正常に作動すると思ったんだけど…。
しなっかったのよ。
不思議。
0043nobodyさん
03/05/17 16:32ID:???>上の二つは正常に作動してるから、
正常って何だよ。異常だろ。
http://flex.ee.uec.ac.jp/texi/perl/perl_56.html
0044nobodyさん
03/05/17 16:39ID:???0045nobodyさん
03/05/17 16:41ID:???条件は忘れた。
0046nobodyさん
03/05/17 16:42ID:???||=や<<=などの代入演算子について知りたいのでつが、"代入演算子"でぐぐっても=や.=、+=くらいの一般的(といっていいのか疑問でつが)な代入演算子を解説しているサイトしかヒットしません。
代入演算子について詳しく解説してあるサイトをご存知な方はURLを貼り付けてください。
おながいしまつ。
0048nobodyさん
03/05/17 16:51ID:???難しく考えなくていいんでないの?
$a ||= &b;
は
$a = $a || $b;
ってだけでしょ。
仮に、$a=0,$b=1 だったら、
右辺の結果、真になるので、$a=1となるだけ。
0049nobodyさん
03/05/17 16:52ID:???↓
$a ||= $b;
005138
03/05/17 16:56ID:???perlは妙な落とし穴が多いですね…。
実はperl独特の落とし穴(?)に何回もはまってます。
ありがとうございました。
005246
03/05/17 17:43ID:???助かりますた。
0053nobodyさん
03/05/17 17:45ID:???splitの1つ目の引数に渡せるものは、「正規表現」か「文字列」。
文字列が渡されれば、それを正規表現と解釈する。だから、これらはすべて同じ動作。
split /\./
split m/\./
split qr/\./
split "\\."
split '\\.'
split qq/\\./
split q/\\./
005538
03/05/17 18:06ID:???q[\\.]って超不思議なんだけど。
ですが、俺に中では「気にしない」と言う方向で落ちつきました。
ありがとです。
0056nobodyさん
03/05/17 18:23ID:???よく引数で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進数にエンコードするにはどうするにはどうすればいいのですか?
データを送って自動でエンコードされたのを取り出すのはなしってことでお願いします。
0057nobodyさん
03/05/17 18:35ID:???$encode = join('',map{ s/(\W)/'%' . unpack('H2', $1)/eg; } split(//,$data));
コレでどうやろ?
0058nobodyさん
03/05/17 19:07ID:???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;
}
005956
03/05/17 19:38ID:???ダメです。
”あいうえお”が”1111111111”になってしまいます。
>>58さん。
これでうまくいきました。
ありがとうございました。
0060nobodyさん
03/05/17 20:22ID:???書き込めませんでした。皆さん、以下のスクリプト実行してみて。
@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";
}
もっとうまく書けるかな?
0061nobodyさん
03/05/17 20:37ID:???面白かったのに。
0062nobodyさん
03/05/17 21:14ID:???\\ 正直、スマンカッタ!! //
+ + \\ 正直、スマンカッタ!!/+
. ___ . ___ . ___ +
/. ――┤ /. ――┤ . /. ――┤+
./(. = ,= | ./(. = ,= | ./(. = ,= |
+ . |||\┏┓∩|||\ ┏┓∩|||\┏┓/ +
(( (つ ノ (つ 丿 (つ つ ))
ヽ ( ノ ( ヽ ノ ) ) )
(_)し し(_) (__)__)
0063nobodyさん
03/05/17 21:47ID:???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;
0064nobodyさん
03/05/17 22:04ID:0j4/huIM漠然とした質問ですみません。
0067nobodyさん
03/05/17 22:17ID:ma11SCqXhttp://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
0068nobodyさん
03/05/17 22:37ID:UhIqbGm50070nobodyさん
03/05/17 22:43ID:???0071nobodyさん
03/05/17 22:44ID:???$ユニークな番号 = int(rand(900000))+100000;
007271
03/05/17 22:46ID:???と仮定してみる
ナニをもってユニークとするのか聞きたいところだ
0073nobodyさん
03/05/17 22:56ID:???0074nobodyさん
03/05/17 23:04ID:0j4/huIM_はエンコードされないですよね?
0076bloom
03/05/17 23:08ID:w1ZjXwV80077nobodyさん
03/05/17 23:17ID:???そら、発生は一回じゃなくて、最高999999回発生させるんでしょ。
そのそれぞれが、過去に発生させた数字と重複していないことが
保証されている生成方法
って、全検するしかない気もするな
0079nobodyさん
03/05/17 23:51ID:???0080nobodyさん
03/05/17 23:54ID:???0081nobodyさん
03/05/17 23:54ID:???0082nobodyさん
03/05/18 00:06ID:aBq13e5fまず、環境はウィンドウズ98です。
ファイルの読み書き追記モード(open(OUT, "+<file.txt");)で,
読み込みと書き込みを同時に行おうと思ってますが、
truncateが使用不可能なため、
seek(OUT,0,0);
truncate(OUT,0);
print OUT $a;
の手法が使えません。
truncateの変わりになる方法を教えてください。
かなり調べたんですが、わかりませんでした。
0083nobodyさん
03/05/18 00:08ID:???0084nobodyさん
03/05/18 00:10ID:aBq13e5f思ってます。
終点のtell(OUT)以下を削除する方法です。
0085nobodyさん
03/05/18 00:10ID:???@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; #コレを繰り返しとな・・・
008685
03/05/18 00:12ID:???my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $seed[$_];
}
}
0087nobodyさん
03/05/18 00:13ID:???0091nobodyさん
03/05/18 00:22ID:???http://www.rfs.jp/sitebuilder/perl/05/03.html#open
0094nobodyさん
03/05/18 00:29ID:???自作関数で、引数が不正の場合に、
Perlの文法チェックでエラーを出力させたいのですが、
方法がわかりません・・・
どうすれば文法チェック時に引数のチェックができ、エラーを出せますか?
0095nobodyさん
03/05/18 00:37ID:???@dat0 = @dat1 = ();
foreach(0 .. 999999){ $dat0[$_] = $_; }
foreach(0 .. 999999){ $dat1[$_] = splice(@dat0,rand($#dat0),1); }
ではだめ?
009885
03/05/18 01:05ID:???@seed = (0 .. 10);
sub select{#取り出し
my $key = int(rand(scalar(@seed)));
my $num = $seed[$key];
splice(@seed,$key,1);
return($num);
}
$data = &select;
0099nobodyさん
03/05/18 01:09ID:???なぜ、そんな巨大な配列を作るんだ?
コストがかかってしかたないと思うが・・・
普通にfor文でぶん回せば良いと思うのだが・・・
0100nobodyさん
03/05/18 01:28ID:???0101nobodyさん
03/05/18 01:43ID:wPiZL/S/http://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
0102nobodyさん
03/05/18 01:53ID:???my @salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
my $salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$crypt = crypt($str, $salt);
こういうルーチンだと、暗号化文字列内に「_」は絶対含まれ
ないですよね?
0103nobodyさん
03/05/18 01:55ID:Qi8mxUK410kbのファイルをopenしてprintしてcloseするのは
どっちが処理に時間がかかるのでしょうか?
0104nobodyさん
03/05/18 01:59ID:???0105nobodyさん
03/05/18 03:23ID:???どんなルーチンかは関係なくcryptの戻り値に「_」が含まれることはない
そもそも、そのルーチンってsaltをランダムにしてるだけじゃないの
0109nobodyさん
03/05/18 07:34ID: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;
0110nobodyさん
03/05/18 07:40ID:???0111nobodyさん
03/05/18 07:43ID:???0113nobodyさん
03/05/18 08:18ID:???これでどうだ? $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);
0117nobodyさん
03/05/18 13:06ID:???どんな方法がありますか?
0118nobodyさん
03/05/18 13:24ID:???0120nobodyさん
03/05/18 14:23ID:???0121113
03/05/18 15:56ID:???その通りなんだが、splitを無理矢理1行で書きたかったんでああなった。
実行効率を考えたら、ループの外でやったほうがいいね。
添削サンクス
0122nobodyさん
03/05/18 16:06ID:???$count += ($com =~s/test//g);
このような方法しか思いつきません。
もっとスマートなやり方を教えて頂けないでしょうか?
0125nobodyさん
03/05/18 18:07ID:rnV9NZSQ0127nobodyさん
03/05/18 18:21ID:OtatQ8zkhttp://yahooo.s2.x-beat.com/linkvp/linkvp.html
0128nobodyさん
03/05/18 18:33ID:???http://www.din.or.jp/~ohzaki/regex.htm
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
0130nobodyさん
03/05/18 18:49ID:???置き換えを使わずにできるかと思ってました。
$count += ($com =~/test/g); とか・・・
レスして下さってありがとうございます。
0131nobodyさん
03/05/18 19:25ID:???こんな事してるんですがどうやら$URLが長いと途中でちょん切れるようです。
"11223344556677889900" → "11223344556677889"
解決できますか?
0133109
03/05/18 22:15ID:???>111
$data = <IN>; の部分のことでしょうか?
本では$data = $_;となっていますが、これだと全く代入されません。
自分で書き直しました。
マッチしてるかどうか調べる処理の前に余計に読み込んでいるから
交互に検索失敗・成功してしまうのでしょうか?
>113
ありがとうございます。試してみます。
尚、$keycode、$IDともに2桁以上の場合があります。
0135nobodyさん
03/05/18 23:00ID:???0136nobodyさん
03/05/18 23:07ID:???0137131
03/05/18 23:08ID:???の間違いでした、すみません。
$URLの文字数が59ぐらいまでは大丈夫なんですが、68になるとダメです。
0139nobodyさん
03/05/19 01:05ID:UimoOLmz@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ファイルは最初の行以外に半角スペースができるのですが、なぜでしょう?
0140動画直リン
03/05/19 01:08ID:IEVyzYan0142nobodyさん
03/05/19 01:12ID:???>print(FILE "@data\n");
""の中でリストを展開すると、リストの各要素が" "(半角スペース)で区切られて
出力されるから。
print(FILE, @data); のようにすれば大丈夫なはず。
0143_
03/05/19 01:12ID:???http://togoshi.ginza.st/mona/mona05.html
http://www.togoshi.ginza.st/mona/
http://www.togoshi.ginza.st/mona/mona03.html
http://togoshi.ginza.st/mona/mona02.html
http://www.togoshi.ginza.st/mona/monaz08.html
http://togoshi.ginza.st/mona/mona06.html
http://www.togoshi.ginza.st/mona/mona10.html
http://togoshi.ginza.st/mona/mona04.html
http://www.togoshi.ginza.st/mona/mona07.html
http://togoshi.ginza.st/mona/mona01.html
http://www.togoshi.ginza.st/mona/mona09.html
0144nobodyさん
03/05/19 01:13ID:UimoOLmzえ?どういうことでしょうか?
0145142
03/05/19 01:13ID:???0146nobodyさん
03/05/19 01:14ID:UimoOLmzできました。ありがとうございました。
0147nobodyさん
03/05/19 10:32ID:/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;
0148nobodyさん
03/05/19 11:05ID:???>&jcode::convert(*HtmlErrormessage, "sjis");
レキシカル変数では型グロブは使えない
&jcode::convert(\$HtmlErrormessage, "sjis");
0151nobodyさん
03/05/19 11:48ID:???0152nobodyさん
03/05/19 12:18ID:???配布されてるCGIがそう書いてるのを真似してるのかもね。
で、ライブラリの書式が変わったのは理解できても、型グロブのほうは理解できないので
そのまんま。とりあえず動くからいいや、みたいな。
0155nobodyさん
03/05/19 12:26ID:???同じ条件式を何回もいろんなところで使っているのですが、
こういう条件式自体を変数みたいに?1箇所にまとめることって可能なのでしょうか?
0157nobodyさん
03/05/19 12:41ID:???$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
0158nobodyさん
03/05/19 12:59ID:???$hoge = "doredore";
if (&matomere) {print "Ok!\n";}
sub matomere {if ($hoge =~ /ahodoredorebaka/) {return 1;} else {return 0; }}
#if ($hoge =~ /ahodoredorebaka/) {print "OK!\n";}
0159nobodyさん
03/05/19 13:03ID:???日本語氏名 <foo@bar.com>
ってなっていることがありますよね。
ここからメールアドレス部(foo@bar.com)のみを正確に取り出したいのです。
この処理を行ってくれるperlモジュールをご存じの方いませんか?
0160nobodyさん
03/05/19 13:06ID:???$mailaddr=~s/(.+)</$1/;
0161nobodyさん
03/05/19 13:11ID:???$mailaddr=~s/.+<(.+?>/$1/;
0162nobodyさん
03/05/19 14:55ID:???なるべくロングに取得
0164nobodyさん
03/05/19 15:16ID:???our $hoge = "doredore";
if (eval matomere()) {print "Ok!\n";}
sub matomere { return '$hoge =~ /ahodoredorebaka/' }
(気持ち悪い)
>>158は冗長。
sub matomere {$hoge =~ /ahodoredorebaka/}
これでいい。
でも、こういう関数は一部でしか使わないだろうから、ローカル関数化する。
local *matomare = sub { $hoge =~ /ahodoredorebaka/ }
こうしましょう。
0165nobodyさん
03/05/19 15:17ID:???local *matomare = sub { $hoge =~ /ahodoredorebaka/ };
0166nobodyさん
03/05/19 15:26ID:???多分、、質問はそういう意味ではなくて、、むむむ、クロージャーか。
my $expr = sub {
my $hoge = shift;
return $hoge =~ /hogehoge/;
}
print 'TRUE' if $expr->('hogehogehoge');
こうしたいのか?
0167159
03/05/19 15:37ID:???ありがとうございます。でも機能しません。("<"が一つ取れるだけ)
>>161
ありがとうございます。でもシンタックスエラーです。
>>162
ありがとうございます。動きました。
0168nobodyさん
03/05/19 16:34ID:???超遅レスで申し訳ないが。。
その文字がエンコードされて送信されてくるかどうかは
実はクライアント(ブラウザ)に依存する罠・・・
昔携帯向けのサイトを作ったときハマッタ。
i-modeではエンコードされないのにJ-skyではエンコードされて来て
気が付くのに2晩かかったよ。
全てのクエリーストリングをデコードくぐらせるのが吉。。。
0170Perl/CGI
03/05/19 18:04ID:Ob4BWAW/本とかで調べてもあってるはずなのになんでおかしいのでしょうか。
open(INIFILE,"+<$fileini");
close(INIFILE);
ローカルでこの行が入ってるファイルをテストしてみたら、
Unterminated <> operator
というエラーがでてとまってしまうんです。
この行を含まなかったらぜんぜん問題なしなんですけど、この行で全部とまってしまってるんです。
このエラーはいったいどう対処したらいいのか、そしてどう改善すればいいのか教えていただけないでしょうか?
0172nobodyさん
03/05/19 20:06ID:???それはファイルを読み書き両方ができるようにオープンしているようだが、
ファイルハンドルから察するに読み込むだけでいいんではないか?
なら、
open ( IN, $file );
open ( IN, "<$file" );
のどちらかで済む話じゃないか?
まあ、フリーのスクリプトか自作かは知らんが、前後の状況がわからんからこれ以上はいえないが。
0174nobodyさん
03/05/19 20:26ID:???INFILEじゃなくてINIFILEだから書き換えたりもするんじゃない?
0175nobodyさん
03/05/19 20:30ID:???ttp://www.google.com/search?as_q=Perl+Unterminated+%3C%3E+operator+&num=100&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=&as_oq=&as_eq=&lr=lang_ja&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=
その前の文で"の閉じ忘れとかないか?
0176nobodyさん
03/05/19 20:58ID:???$IPAD = $ENV{'REMOTE_ADDR'}
などとして得たアドレスを2進数に変換したいのです、ご指導お願いします。
例えばアクセスした人のアドレスが
202.213.37.74だった場合、
11001010110101010010010101001010
という風に変換させたいのですが、perlでスッキリかくには
どのようにすればいいのでしょうか?
お手すきな方、宜しくご指導お願いします。
0178nobodyさん
03/05/19 21:45ID:???参考に
http://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
0179nobodyさん
03/05/19 21:54ID:???$bits = join('', map { unpack('B*', chr) } split(/\./, $IPAD) );
0180176
03/05/19 22:53ID:???ご指導ありがとうございます。
>>178のページを参考に自分でやって成功したのですが、
>>179さんの方がスッキリしてるので、こちらを使わせていただきます。
助かりました、ありがとうございます。
0181nobodyさん
03/05/20 05:07ID:???データは全てサーバーに保存させています。
で、ちょっと効率の良い処理が思いつかないので質問に来ました。
まず、
●武器などのデータはテキストでデータ保存した方が良いでしょうか?
●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
また、武器によって攻撃力が変わるわけですが、
●起動ごとに攻撃力を算出させた方が良いでしょうか?
●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
俺としては前者のほうが、バグが出にくく、管理もしやすいのですが負荷が多くかかりそうな気がします。
俺は、プログラム経験が浅いのでこの辺の判断がつきません。汗
経験の長い皆様にアドバイスを頂きたくてやってきました。
よろしくお願いします。
0182nobodyさん
03/05/20 05:32ID:???自分で思考錯誤して頑張ります。
0184nobodyさん
03/05/20 06:01ID:???使うと変数の局所化が出来るようなのでつが
局所化するとパフォ-マンス的にはどうなんでそ?
あと、一般的に配付されてるスクリプトで
use strict;
使ってる物を見た事が無いのですが普通は使わない物なんでつか?
0185nobodyさん
03/05/20 06:10ID:???このスレでいいだろ?アルゴリズムの問題なんだから。
CGIだからどーだって事にはならない。GUIだろうとほとんど同じ。
>>184
取り敢えず、厳格な書きかたが出来る。
局所化は、strictとは直接関係ない。
myだと、呼び出されるまで展開されないから軽い。
myはどのパッケージの名前空間にも属さない。
>>181
処理の規模にもよるが、データはテキストのほうが望ましい。
装備している武器などはそのまま保存すると共に、
攻撃力などは武器が変更された時にいっしょに変えてしまえば?
少々めんどうか?この方法は。
まぁ、どんな処理なのか分からんからなんとも言えん。
0186nobodyさん
03/05/20 06:11ID:???> 使うと変数の局所化が出来るようなのでつが
できません。
> 使ってる物を見た事が無いのですが
strictモジュールはコードの検査を行うものなので、リリース時にはコメントアウトするか消す人が多いだろうね。
無 駄 だ か ら
0187nobodyさん
03/05/20 06:38ID:???個人が持つ物じゃなくて全体に存在してるアイテムって言うのか、そうゆうのは記述内で定義するのが正解だよ。
もし、一つ一つ個性のある、複雑な効果のあるアイテムとかなら絶対に記述内で定義する必要がある。
たんに「値段」と「攻撃力」みたいな感じのデータのみだったら、テキストでデータを書き出しても良いかもしれない。
0188nobodyさん
03/05/20 08:52ID:???ネトゲ板のCGIブラウザゲースレの奴か?
>●武器などのデータはテキストでデータ保存した方が良いでしょうか?
>●それとも、perl記述内で武器の効果や、強さ、金額などを直接定義したほうが良いでしょうか?
数による。
10や20なら中に記述した方がいいだろうが、1000や2000ならテキストデータにした方がいい。
数が多い場合は、テキストを分割する事で検索速度を速めよう。
例えば武器なら、1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
と検索させる方が鯖に優しいのはわかるな?
>●起動ごとに攻撃力を算出させた方が良いでしょうか?
>●それとも算出された攻撃力はそのままテキストデータに保存してしまった方が良いでしょうか?
計算の度合いによる。
足し算の1回2回なら計算させた方がいい。
逆に剰余算や平方根を多用するようなら、保存させた方がいいかもしれない。
これらも計算の頻度やその処理の重さによる。
攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
バグが出た時に、データを一時DLしてから再計算してULし直せるように。
そうすればメンテ性も上がる。
つたないながらもCGIゲー経験者として。
0189181
03/05/20 09:52ID:???>>188さん
>ネトゲ板のCGIブラウザゲースレの奴か?
違うと思います。俺はム板とこの板にしか出現しません。
>1000の全武器>とある武器データ、と検索させるより、200の武器データ>とある武器データ、
>と検索させる方が鯖に優しいのはわかるな?
槍なら槍、剣なら剣と、種類ごとにデータを分けてしまえと言う事ですね?
>足し算の1回2回なら計算させた方がいい。
はい、単純な足し算です。
ですから。起動ごとに計算させる事にします。
そのほうがバグや計算ミスもなく簡単に管理出来そうです。
>攻撃力を外部に保存させる場合、ローカルに攻撃力再計算用のスクリプトを作っておくといい。
>バグが出た時に、データを一時DLしてから再計算してULし直せるように。
ちょっと意味が分からなかったのですがこれは公開後、利用者のデータにバグが出た場合、
こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
もう一つ質問なのですが、
>>187さんが細かいデータをテキストで保存するのはキツイとご指摘下さいました。
確かに「アイテム」や「魔法」などは一つ一つ違った働きをして、仕様出来る場所も違います。
武器や防具の場合はけっこう単純なのですが…。
>>188さんなら、これらをどこで定義しますでしょうか?
やはりテキストに書きますか?
ちなみに、終わった話(処理)ですがモンスターデータは全てテキストに書き出しました。
一行一モンスターの形式で書いたのですが、一行の文字数が300文字以上になって超見にくくなってしまいました。
0190nobodyさん
03/05/20 10:06ID:???>違うと思います。俺はム板とこの板にしか出現しません。
違うのか、スマン。
ttp://game3.2ch.net/test/read.cgi/netgame/1031450575/115-
ちょうどここで似たような話題があったので勘違いした。
気を悪くしたなら許してくれ。
>こちら側がデータを手動で直しやすいように。と言う意味でしょうか?
大まかに言えばその通りだな。
ただ、本当に手動で100人以上のデータを修正していたら日が暮れるだろ?
それを自動でやってくれるスクリプトをローカル用に組んでおくと後で楽だよと。
>>>188さんなら、これらをどこで定義しますでしょうか?
>やはりテキストに書きますか?
繰り返しになるが、数による。
1000や2000のデータを内部で定義するとメモリを無駄に消費するからな。
俺ならアイテムや魔法のデータをテキストから読み出して、キャラデータと一緒に保存する。
アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
そうすれば普段は50しか読み出しを行なわずに済む。
1000のアイテムを検索するのは、アイテム購入とか、新規でアイテム入手する時だけになるわけだ。
敵からアイテムを拾う場合は、敵データにアイテムデータも一緒に入れる。
あんたのやり方の場合はそれは向かないかもしれないけどね。
結局、システムごとにやり方なんか違うものだと思うぞ。
毎回必ず1000のアイテムを読み込む必要のあるシステムなら、それこそ内部に記述した方がいい。
0191181
03/05/20 10:40ID:???なるほど!
大変参考になりました。
>アイテムが1000あっても、キャラクターが持つアイテムはおそらく50もないだろう。
まさにその通りです。
そこで思いついたのですがアイテムや魔法のIDや名前などの簡単に部分はテキストで保存し、
効果は以下のように定義しようと思いました。
#アイテム使用時のルーチン
sub item_001{
my ($item) = q['アイテム使用処理'];
eval "$item";
}
非常に大雑把な感じですが、処理はこんなイメージで進めていこうと思います。
大変参考になる話をありがとうございました。
0192nobodyさん
03/05/20 10:41ID:???データベースの方が鯖に優しくはないが安全だよなあ。
0193nobodyさん
03/05/20 10:43ID:???0194181
03/05/20 10:51ID:???個人のデータは個人で使っているので、他者と書き込みがかぶる事はありません。
それと、処理全体には一応実行ロックをかけ、
さらに同一人物は5秒以内の連打アクセスが出来ないようほどこしてあります。
(テスト中はジャマなので解除してますけど)
0195nobodyさん
03/05/20 13:17ID:???0196nobodyさん
03/05/20 14:21ID:???入力したIDがあらかじめ用意されたIDと一致してるかどうかで
表示する画面を分岐させたいのですが
現状は、
IDをテキストファイルに
10000
10001
10002
・
・
という形で入れておいて
ループでIDファイルの一行と入力したIDが一致するか否かで
処理しています
処理が遅いので別の手段をとりたいのですが、
何かいい方法はありませんでしょうか?
IDは8桁のランダムな数字列で、
テストはID5000件と10000件でやりました
0197nobodyさん
03/05/20 14:26ID:???ID"だけ"で良いのならば。
ID名でファイルを作成し、ファイルが存在するか否かで処理。
何万件も処理するならDBを利用すべきでしょう。
0198181
03/05/20 14:27ID:???0199nobodyさん
03/05/20 14:29ID:???>>しかも197さんのが効率良いし。
0200nobodyさん
03/05/20 14:32ID:wO+tQvftPerlによる普通の掲示板でログの先頭行のタイトルだけを
取るにはどういう構文にすればいいんでしょうか?
0203nobodyさん
03/05/20 14:43ID:???まぁいいや。
HTMLの話です。それ。がんばってHTMLしてください。
※これ以上質問を繰り返さない事。板違いです。
0204nobodyさん
03/05/20 14:43ID:???でも5000とかファイルが生成されるのは
何かひっかかるものが…
ちょっとテストしてみてDB使うかどうか考えます
8個ファイル作るというのもシンプルでいいかもしれないですね
これもやってみますです
早いレスどうもです
0206nobodyさん
03/05/20 14:46ID:???先頭行だけ取る時は
<ファイルハンドル>
って感じで取得すると一行だけ取れるよ。
0207198
03/05/20 14:50ID:???ファイル8個って意味分からん数字だった。汗
今日は大ボケ連続です。ここら辺でボケてるの全部俺です。
10個にしよう。10個。
一番左の桁が[0-9]で10個。
桁数とファイル数はいっしょにしたらダメだこりゃ。ごめんなさい。
0208bloom
03/05/20 15:08ID:vZIU7+LM0209nobodyさん
03/05/20 15:23ID:???困ってます。でも、なんもこの関数自体には、問題ない・・・ですよね?
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;
}
0210nobodyさん
03/05/20 16:15ID:???$in{'mailbody'} =~ s/<id>/$tmpid/ig;
だとちゃんと置換されるのに、、
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
だと、
$id[0]の値に置換されてしまいます。
これは、どのように改善すればいいのでしょうか?
まだまだ、変数に対する理解が不十分なのでその辺だとは思うのですが、
調べてもわかりませんでした。
0211nobodyさん
03/05/20 18:34ID:???よくわかりませんが、修飾子にeを加えてみてはいかがでしょう?
(適当な発言です)
ええと、質問にまいりました。
検索しても出てこなかったのですが、指定したサブルーチンが存在するかどうか確かめる方法はありますか?
存在しないルーチンに飛ぶとエラーになってしまうので、存在するかどうか確かめてから飛びたいのです。
(こちらが指定したサブルーチン名は変数のため、目視では解決できません)
0212nobodyさん
03/05/20 18:47ID:???しまいます。処理的には問題なくできてるんですが、気になります。
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);
0213bloom
03/05/20 19:08ID:vZIU7+LM0215Perl/CGI
03/05/20 20:05ID:nlGr4tqOフォームで入力したデータをそのまま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);
}
0216Perl/CGI
03/05/20 20:06ID: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
エラーがでてとまります。
ご指導、指摘お願いします。
解決策も教えてください。
0217nobodyさん
03/05/20 20:07ID:???0219Perl/CGI
03/05/20 20:17ID:nlGr4tqO一応$fileiniのなかは
$access="http://www.……";(URLは省略させていただきました。)
に、最初っからしています。
0220nobodyさん
03/05/20 20:24ID:???httpでファイル指定はできません。
0221Perl/CGI
03/05/20 20:32ID:nlGr4tqOいや、これはリンクです。
リンク先のアドレスです。
0222nobodyさん
03/05/20 20:35ID:???じゃあ、
print $fileini;
としたら何が表示されるんだよ。
0223Perl/CGI
03/05/20 20:57ID:nlGr4tqOCGIで読み出してそのまま使えるようにしてあるので
$access="http://www.……";
というふうにしてます。
0224nobodyさん
03/05/20 21:00ID:???つまりお前さんは
open(INIFILE,"+<$access="http://www.……"; ");
こうなる事を期待してるのか?
俺が聞いてるのは、「$fileiniで指定された先のファイルの中身」ではなくて、
「$fileiniの中身」なんだが日本語わかる?
0225動画直リン
03/05/20 21:08ID:vZIU7+LM0226nobodyさん
03/05/20 21:15ID:ITOFryED今、アクセス解析つかっているんですが、
ログファイルには
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
日時<>リファ<>ホスト<>IP<>エージェント
・
・
・
・
ってなってるんですが、こういう風に複数行ある場合は、読み出して一覧を出力したいんですが・・
具体的に
------------------------------←水平線
アクセス時 : 日時
リファラー : リファ
ホスト名 : ホスト
IPアドレス : IP
ユーザーエージェント : エージェント
------------------------------
アクセス時 : 日時
リファラー : リファ
ホスト名 : ホスト
IPアドレス : IP
ユーザーエージェント : エージェント
------------------------------
みたいにしたいんですが・・・・
一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
何かいい方法ないでしょうか?
0227nobodyさん
03/05/20 21:19ID:???> 一行なら<>で区切ってスライスできるそうなんですが、複数行となるとサッパリです。。
> 何かいい方法ないでしょうか?
一行ずつ処理すればよいのではないかい?
真相は分からんが。
0228nobodyさん
03/05/20 21:21ID:ITOFryED一行ずつ処理ですか・・・
えと、読み込んでforeachにまわすとか?ですか?
すんません、リファレンス1冊買って勉強します。。
ネットでは情報が少ないですよね
0230nobodyさん
03/05/20 21:54ID:OOsiMZA+$idcrypt = substr(crypt($idnum * $idnum, substr($date, 8, 2)), -8);
って2ch互換ID?
とテストしてみる
0231nobodyさん
03/05/20 22:05ID:???0232nobodyさん
03/05/20 22:26ID:???複数行って意味が分からないが、普通に
my $format = <<'EOM';
------------------------------
アクセス時 : %s
リファラー : %s
ホスト名 : %s
IPアドレス : %s
ユーザーエージェント : %s
EOM
while (<LOG>) {
print sprintf($format, split /<>/);
}
とかじゃ駄目なの?
0233210
03/05/20 22:47ID:???手元の本みたら、
変数はスカラ変数と配列変数しか使えませんとかいてありますた。
ということは、一番スマートなやりかたは、>>210とするしかないのでしょうか?
0234139
03/05/20 23:14ID:iNE6jQJj@data = <FILE>;
で、ファイル読み込む(txtやcgiソース)
そして、編集できるように、
テキストエリアに出力
print "<textarea>@data</textarea>\n";
↑けっこう略
すると、@dataが""で囲まれている?ので、2行目以降の先頭に空白ができます。
この場合はどうすればいいですか?
0235nobodyさん
03/05/20 23:26ID:???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
0236nobodyさん
03/05/20 23:32ID:???open(FILE, $name);
print "<textarea>";
while ( <FILE> ) {
print;
}
print "</textarea>";
0237139
03/05/21 00:00ID:DxtaiKT1おぉ。。できました。ありがとうございます
0238nobodyさん
03/05/21 00:04ID:???0239nobodyさん
03/05/21 00:04ID:???普通に
print "<textarea>", @data, "</textarea>\n";
または
$" = '';
print "<textarea>@data</textarea>\n";
特殊変数 $" の値を変更することで、ダブルクォート文字列内で
配列を展開するときのセパレーター(要素間に挟み込まれる文字
デフォルトは半角スペース)を好きな文字に変更できる。
覚えておいて損はないよ。
0240_
03/05/21 00:05ID:???http://togoshi.ginza.st/2ch/2ch05.html
http://www.togoshi.ginza.st/2ch/
http://www.togoshi.ginza.st/2ch/2ch03.html
http://togoshi.ginza.st/2ch/2ch02.html
http://www.togoshi.ginza.st/2ch/2ch08.html
http://togoshi.ginza.st/2ch/2ch06.html
http://www.togoshi.ginza.st/2ch/2ch10.html
http://togoshi.ginza.st/2ch/2ch04.html
http://www.togoshi.ginza.st/2ch/2ch07.html
http://togoshi.ginza.st/2ch/2ch01.html
http://www.togoshi.ginza.st/2ch/2ch09.html
0242139
03/05/21 01:10ID:DxtaiKT1それためになります。
ありがとうございます
0243nobodyさん
03/05/21 01:12ID:???ご存じの方がいましたら教えていただきたいのですが。
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に対してどう初期化を
行えば良いのか、解決策を探すことができませんでした。
この問題の解決方法をどなかたご教授下さい。
0244nobodyさん
03/05/21 01:14ID:???10 : if ($::ENV{'REQUEST_METHOD'} eq "POST") {
52 : if ($::form{'key'} eq '')
こうしてみたらどうよ?
0245243
03/05/21 01:16ID:???警告文には他にも以下のものがありました。
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 と関数が指摘されているようですが、
これらの関数を使用する前に初期化が必要なんでしょうか?
0247nobodyさん
03/05/21 01:18ID:???> open(MAIL,"| $MyPathSendmail -t");
を、
open(MAIL,">&STDOUT");
にしてひとまず標準出力に吐き出して確認してみたら?
あと「sendmail -t」を調べてみる。
0251243
03/05/21 01:33ID:???この状態だけでも警告文は同じく出ました。
よろしくお願いします。
>>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'};
}
続く
0252243
03/05/21 01:34ID:???続き
(@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);
}
0253nobodyさん
03/05/21 01:46ID:???気にたった点。
>(%form) = &get_form('sjis');
(%form)の()を外した方がよさそう。
>local($charset) = @_;
特別な意味がない限りmyを使う事を推奨されてたと思う。
myの方が早いし。
>return (%FORM);
これも()を外した方がよさそう。
・・・力になれなかったかも・・・
スマソ
0254nobodyさん
03/05/21 01:48ID:???0255nobodyさん
03/05/21 01:52ID:???結論から言えば、何も問題ない。
-w を付けて尚かつ一切の警告を受けたくないということなら
疲れるだけだから止めた方がいいよ。
ちなみに -w をつけると
・一度しか使われない識別子
・値をセットせずに参照されるスカラー変数
・サブルーチンの再定義
・未定義のファイルハンドルの参照
・読み出し専用でオープンしたファイルハンドルへの書き込み
・数値以外を数値として扱った場合
・配列をスカラーとして扱った場合
・深さが100以上のサブルーチンの再帰呼び出し
・その他いろいろ
に該当する時、警告されます。
変数を初期化なしで使うなんてperlでは当たり前のことでも
イチャモンつけて欲しいなら別だけど、普通はデバッグ時に
意図しないで上記のことをしていないか診断したいときにだけ使います。
0256243
03/05/21 01:55ID:???ご指摘ありがとうございます。
なるほど、これから気を付けて行きたいと思います。
こちらの環境はRedhat8.0/Perl5.8なのですが、
perlのバージョンは同じようですし。うむぅ。
実行出来ない訳ではないので、黙殺しても良い部分だとは思うのですが。
どうもありがとうございました。
0257nobodyさん
03/05/21 01:56ID:???その警告の行以外に原因があるようだな
$charsetにlocalをつけておきながら$form_dataや@key_valueを
そのまま使っているし、全体を見ないとなんとも言えないな
0258243
03/05/21 02:05ID:???な、なるほど(汗
perlを始めたばかりで、初めのうちから正しい書き方を
身につけようとか思っていたのですが、どうやらそれが
良いことばかりでは無いようですね。
素直に黙殺します。
これからは-wはデバッグ時のみ実行する事にします。
ご指摘いただきました方々、色々とありがとうございました。
>>257
おっしゃる通りです。
警告文が該当している箇所を急いで抜き出したものでしたので。
変数とかの扱いをちゃんと書いて、最終的にもう一度確認して行きたいと思います。
0259nobodyさん
03/05/21 02:08ID:???0260243
03/05/21 02:24ID:???抜き出したスクリプトでも(勿論、元スクリプトでも)
&get_form('sjis');
とサブルーチンに値を渡しているので、平気だと思います。
実際に元の方の出力はsjisになってましたし。
0263nobodyさん
03/05/21 05:21ID:???use warnings (-w)は別にいつも付けてる必要はないけど、
use strictでコードする癖をつけないと後で泣くよ。
0264nobodyさん
03/05/21 07:17ID:???0265nobodyさん
03/05/21 09:11ID:???ポピュラーな方法だぞ?
コーディングする、の方が言葉として変。
0266nobodyさん
03/05/21 09:38ID:???灰皿する。
机する。
本する。
ま、どーでもいいけど。
0271nobodyさん
03/05/21 11:21ID:???perlスレはもうやめたのか。
0272nobodyさん
03/05/21 11:29ID:???0273nobodyさん
03/05/21 12:47ID:???0274nobodyさん
03/05/21 15:39ID:???>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>だと、
>$id[0]の値に置換されてしまいます。
正規表現では[ ]は意味を持ってしまうのでエスケープしないと
$in{'mailbody'} =~ s/<id>/$id\[$i\]/ig;
0276nobodyさん
03/05/21 16:50ID:???0277Perl/CGI
03/05/21 17:01ID:XtYsWXu+すいません、そういうことでしたか。
$fileiniが指定してるのは
初期設定ファイルのことで、admin.iniの形式にしてます。
んでそのファイルの中身は以前書いたものになってます。
レス遅くなってすいません。
0278動画直リン
03/05/21 17:08ID:JZ9K0e/X0279ど初心者
03/05/21 17:08ID:???私は すぐわかるPerl => 初めてのPerl以降詰まってます。
0280nobodyさん
03/05/21 17:46ID:???名前は忘れたけど、地球儀みたいな絵が書いてあるPerl/CGI入門書から入った。
すげー分かりやすく、それだけで、簡単な掲示板が作れるようになった。
↓
「CGIのための 実践入門Perl」
黄色い鍵の絵が書いてある本。
これも、かなり分かりやすい本だった。
俺のバイブル。
↓
「新Perlの国へようこそ」
サルが温泉つかってる絵がかかれてる。
上の2冊読んでたら、理解できるはず。
書いてる事は、ちょっと難しいが、リファレンスやらオブジェクトやら勉強できる。
↓
「ラクダ本」
全部なんて読んでない(w
この関数の詳しい動きが知りたい!
そんな時に開く本として置いてある。
最強の本だけど、いきなりすべてを知ろうとして読むと、
挫折するっぽい。
と、現在中級者のちょっと上レベルの俺が言いたい事は、
「Perlで作るCGI入門 基礎編」 この本は、読みにくく俺にとっては無駄遣いしたとしか思えない
・・・と。
0282210=(269)
03/05/21 17:58ID:???>>$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
>>だと、
>>$id[0]の値に置換されてしまいます。
>正規表現では[ ]は意味を持ってしまうのでエスケープしないと
やっても、結果同じなんですけど・・・・
0283nobodyさん
03/05/21 17:59ID:zxc8lPDx地味でへたれっぽいけどすごくちゃんとした内容。
ラクダよりも、ちょっとしたリファレンスとしては便利。
0285ど初心者
03/05/21 18:10ID:???0286nobodyさん
03/05/21 18:31ID:???>>283のはすごく良い。
頭で覚えるより>>283のを一冊脇に置いて、
実際に簡単なスクリプト書いてみるのが一番覚えやすい。
こうしたいけどどうしたら良いんだろう?とか
「疑問→解決」が一番吸収しやすいしね。
0287nobodyさん
03/05/21 18:52ID:???「Effective Perl」
いい本だ
0288nobodyさん
03/05/21 19:21ID:???【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
0289ど初心者
03/05/21 20:57ID:???ありがとう御座います。凄く参考になりました。
これをきっかけにパールマスター(パールをマスターした人)を目指してみます。
有難う御座いました。
0290nobodyさん
03/05/21 20:59ID:???ひたすら既存のスクリプト改造で育ったかな。
本はポケットPerlリファレンス買った。
0293nobodyさん
03/05/21 21:09ID:???画面遷移図をUMLのステートチャート図で書いてるのって変ですかね?
0294nobodyさん
03/05/21 21:12ID:???俺はとほほさんとこのをプリントアウトして使ってる。
ちょっと調べたい時とかは、らくだ本みたいに大きくもないし便利。
0296295
03/05/21 21:56ID:???0297nobodyさん
03/05/21 21:58ID:???0299nobodyさん
03/05/21 23:03ID:???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);
}
0300nobodyさん
03/05/21 23:04ID:???sub encode {
my($name)=shift;
&endecode($name,hex(0x20));
}
sub decode {
my($name)=shift;
&endecode($name,-hex(0x20));
}
0301nobodyさん
03/05/21 23:20ID:???飛ぶときと飛ばないときがある。なんで?そんなことってあるの?
調べたところ一部のサーバーではLocation禁止というところも
あるみたいだが、うちは飛ぶ。
でも飛ばないときもある…
0302nobodyさん
03/05/21 23:26ID:???PerlというよりCGIの質問だな。
ブラウザごとに飛ぶ飛ばないを調査して、どういう条件で飛ばなくなるかを
自分なりに調査した方がいいと思うぞ。
あとは出力されているヘッダがどうなってるかを調べてみるとか。
どちらにせよスレ違いだから、調査の上で適切なスレへ行きな。
0303nobodyさん
03/05/21 23:30ID:???調査はした。で、同じ条件・同じ方法で飛ばしてみようとしても
飛ぶときと飛ばないときがある…ますますわからない。
ありがとん。
0305山崎渉
03/05/22 01:55ID:???0306210=233=269
03/05/22 05:04ID:???それでOKていうのは、
$tmpid = $id[$i];
$in{'mailbody'} =~ s/<id>/$tmpid/ig;
でOKってことですか?
というか、それしか、やりようがないということなのでしょうか?
なんかキモイスクリプトだなーと思ったもので。
0307nobodyさん
03/05/22 06:23ID:???人に聞くより自分でアレコレ試した方が早いことも多いよ?
270じゃないが、
$in{'mailbody'} =~ s/<id>/$id[$i]/ig;
で、文法的にも何も問題ない。
置換前に
print "\$i=$i \$id[\$i]=$id[$i]\n";
と一行書いて、変数に何が入ってるか確認。
0308nobodyさん
03/05/22 10:15ID:???新種の山崎登場?
とりあえずage
0309210
03/05/22 10:43ID:???それやってみたら、ちゃんと出力されてるんですよね・・・
なのに、変換すると、以下の文章(メールですが)で、$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";
}
0310nobodyさん
03/05/22 11:37ID:???$i以外を使ってみろ!といってみるテスト。
for (0 .. $#email) { # など・・・
それでもだめならPerlのバージョンさらし+環境さらし。
0311310
03/05/22 11:40ID:???そりなら/igs;
0312307
03/05/22 12:40ID:???ひとつの $in{'mailbody'} に対して、@mail 要素数だけ置換繰り返すの?
置換した結果を置換して、それをまた置換した結果を置換…以下ループ(´Д`;)
まず間違いなくその辺に問題があるんじゃない?
>311
行頭や行末を使ったマッチングじゃないので /s は関係ないぽい。
0313nobodyさん
03/05/22 13:26ID:???CGI部分は端折って試したけど、普通に動作したよ。Shift_JISでだけど。
ちょっと見た感じ、print のとこで encodeにもdecodeにも同じ $n 渡してるけど、
decodeには encodeした文字を渡さないと意味ないんじゃない?
ただ両方表示してるだけというなら片方は化けて当然だよね。
それと、普通そういうのはCGIでテストしないで、まずコンソールでテストするよ。
たとえ最終的にCGIにしても。。問題が切り分けられないからね。
0314nobodyさん
03/05/22 20:02ID:???0316nobodyさん
03/05/22 20:58ID:???出た
0317nobodyさん
03/05/22 21:10ID:???あとちょっとで6になりそうなのに・・・
0318nobodyさん
03/05/22 21:23ID:???プロバが放置してるんだもんよ。
0319nobodyさん
03/05/22 21:49ID:???>>318を補足するならば、
・鯖管理者に技術がない
・鯖管理者に暇がない
・バージョンアップして、今動いているものに不具合が出ることを警戒している
などの理由によって放置されている。
0320nobodyさん
03/05/22 21:51ID:???0321nobodyさん
03/05/23 00:22ID:???結果と一緒に出力させたいんですが、
%ENVにも含まれてないそうで取得の仕方に困っています。
知ってる人がいたら教えて下さい。
0322nobodyさん
03/05/23 00:27ID:???0324nobodyさん
03/05/23 14:42ID:82gPpiu/open(INTXT, "http://aaa.co.jp/readme.txt");
みたいにreadme.txtファイルを開いて表示したいのですがうまくいきません
0325nobodyさん
03/05/23 14:46ID:???LWPで検索。
0326nobodyさん
03/05/23 14:47ID:???知らなかったら検索してください。
0328北村貴母緒
03/05/23 15:16ID: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
0330nobodyさん
03/05/23 16:21ID:???調べる以下のコードって、もっとスマートにかけませんか?
(あるいはそういう関数ってないでしょうか?)
$city = "tokyo";
foreach $value (@ArrayCity){
if ($value eq $value){
$Flag = 1;
last;
}
}
0332nobodyさん
03/05/23 16:49ID:???if(grep(/$city/,@ArrayCity)){ $Flag = 1; }
0333nobodyさん
03/05/23 17:29ID:???(わかりやすいようにチャンネルとテレビ局名を例にしてます)
@channel = (6,1,8,4,10)
@tvname = ('tbs','nhk','cx','ntv','asahi');
っていう配列があって、
これを、
@channelの要素の小さい順に、@tvnameの要素をソートすることって
どうすればできるのでしょう?
要は、
@new_tvname = ('nhk','ntv','tbs','cx','asahi');
を取得したいのですが。
0334nobodyさん
03/05/23 17:32ID:XGb65p6nキーをソートしたらいいのに・・・
0336333
03/05/23 19:55ID:???スパゲッティ状態で、連想配列に変換しようとしても、うまくいかず。。。
0338nobodyさん
03/05/23 20:39ID:???my @no = sort {$channel[$a] <=> $channel[$b]} 0 .. $#channel;
my @new_tvname = @tvname[@no];
0340nobodyさん
03/05/23 21:22ID:???こういうのはじめてみた。勉強になった。
0342nobodyさん
03/05/23 22:15ID:???@tv_table{@channel} = @tvname;
@new_tvname = map $tv_table{$_}, sort {$a <=> $b} keys %tv_table;
0343nobodyさん
03/05/23 23:01ID:???やりたい事は、メインのスクリプトからパッケージのサブルーチンへ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";
0344343
03/05/23 23:02ID:???#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で宣言しておかないとダメなのでしょうか?
0346345
03/05/24 00:02ID:???配列スライスは例えば($second, $third) = @array[2,3]; とかできるっす。
0347345
03/05/24 00:07ID:???0348nobodyさん
03/05/24 00:10ID:f0Btk8DHっていう列を格納しているCSVファイル(DBではないのです(泣))があるのですが、
それに対して、
「select * from orgmaster where flagplan=1 ordeby planid countryid」
した結果をはき出したいと思ってますが、とんとわかりません。
どのようにすればいいのでしょうか?
なお、DBD::CSV は使えない環境です・・・
0349nobodyさん
03/05/24 02:21ID:???# 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__
0350nobodyさん
03/05/24 02:40ID:???>>343-344
Perl4?
Perl5ならリファレンスでいけると思うけど。
後、use varsは使わない方がいいと思う
0351nobodyさん
03/05/24 02:42ID:???0352nobodyさん
03/05/24 05:09ID:???0353343
03/05/24 08:00ID:???御指南ありがとうございます。
せっかくいただいたのですが、今は試せる時間が無いので今日の夜にでも自分トコで使ってみます。
外部にサブルーチン持たせる時はそういう使い方でしたか…
あの長ったらしい分がここまで短くなるとは、奥が深いです。
>>350
失礼しました。
環境はPerl5.008です。リファレンスというキーワードで勉強してみようと思います。
use varsは色んなperlの解説サイトで、strict宣言するときに…
みたいな事がかかれていたのですが、使わない方向で頑張ってみます。
0354nobodyさん
03/05/24 17:48ID:CEfAWsDp$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が呼び出された回数は記録できるんですが、私はダウンロードされた数が知りたいんです。
どうすればいいですか?ダウンロードが完了したらカウントアップってのをしたいんですが・・・
0355nobodyさん
03/05/24 18:03ID:???例:
$value1 = 'http://www.yahoo.co.jp';
$value2 = 'Copyright (C) 2003 Yahoo Japan Corporation. All Rights Reserved. ';
この場合、$value1 と $value2 には大文字小文字の違いはありますが、yahooの文字列が両方ともに存在します。
このように、$value1 と $value2 を比較して、なかに同じ文字列が存在する場合に真とすることって可能なのでしょうか?
例ではyahooが同じ文字列ですが、実際は何が同じ文字列になるのかわからないこととします。
0356nobodyさん
03/05/24 18:17ID:???Location:
で飛ばさない方法というのは如何でしょうか?
>>355
可能です。
と、答えると逆ギレされるのだろうか?
この世の中ってば、ほんと怖いです。
ま、「1文字一致」っていうのもあるから許されますよね?ね?ね?
0357nobodyさん
03/05/24 18:18ID:LfXTm2oZ0358354
03/05/24 18:20ID:CEfAWsDpロケーションで飛ばさない、、といいますと??
ほかに方法がありますか?あればぜひご教授ください。
0360354
03/05/24 18:32ID:CEfAWsDpファイルの中身をcgiに記述する、、、ということでしょうか?
ぜんぜんわかりません、ごめんなさい。
もう少しわかりやすくお願いできますか?
0361nobodyさん
03/05/24 18:36ID:???どちらにせよ、「DLを試みた回数」はわかっても、「DLを完了した回数」はわからないよ?
途中で回線切断されたら終わりだし。
0362354
03/05/24 18:41ID:CEfAWsDpそうですか。。。
途中で切断でもいいので、「保存」を押して転送が開始された時点でのカウントでもいいのですが・・・
0364354
03/05/24 18:44ID:CEfAWsDpわかりました。探してみます
0365354
03/05/24 18:56ID:vyZFmtfU、、これであきらめます。
0366nobodyさん
03/05/24 18:56ID:???CGI使わずに、鯖のアクセスログとか見た方が鯖に優しいぞ。
0367nobodyさん
03/05/24 19:16ID:4X2MnE2OITスクールを開催しています。
スクール形式は1dayパックで3時間だけです。
授業料金は安く、即、実践へ活用できます!
http://homepage3.nifty.com/it3s/index.htm
0369355
03/05/24 20:11ID:???> 可能です。
そうですか。。。
漏れにはその方法がわからないけど、こんな風なのはどうか評価してください。
連続する5文字が両方にあったら真とするということに勝手にします。
で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
次に2文字目から6文字目までの5文字を配列に入れる。
以下繰り返し。
最後に@value1、@value2の比較。
駄目でしょうか?
2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
0370nobodyさん
03/05/24 21:11ID:???頼むから本一冊買って勉強してくれ。
http://www.google.co.jp/search?num=100&hl=ja&q=Perl+%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81&lr=lang_ja
0371nobodyさん
03/05/24 22:21ID:???ちょっと俺が間違ってた。
CGIで吐くんじゃなくて別のポートを見張るサーバを別に立てて、そこへ向けてLocationで飛ばす。
で、送出できたバイト数を数えればダウンロードできたかどうか分かる。
簡易HTTPサーバ作るってこと。
0372356
03/05/24 22:27ID:???> で、$value1、$value2とも最初の5文字を@value1、@value2に入れる。
あのぉ、、、(汗)
> 駄目でしょうか?
さすがに「しゃーねーなぁ、、、それでいこか。」とは口が裂けても云えませんm(_ _)m
> 2バイト文字があったら、、、ダメミタイダナァァァァァアアアアアアアアアアああああああ!!!!!
さんざん既出だとは思うが、文字コードを云々・・・
「検索アルゴリズム」
いっぺんこれでググってみると新しい道が見つかるかもよ。道は険しいけれども。
(「木」「ハフマン」「辞書」とか出てくるかもしれんが@「圧縮」も似たようなもん)
0373nobodyさん
03/05/24 22:46ID:???if ($value1.$value2 =~ m/(.+).*\1/i) {
my $word = $1;
if ($value1 =~ /$word/i && $value2 =~ /$word/i) {
print $word,"\n";
}
}
こういうのはいかが?
0374nobodyさん
03/05/24 22:47ID:???0376nobodyさん
03/05/24 22:49ID:???あなたが、何を文字列として定義するか(重要)で
難しさは極端に変わりますが、簡単な \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; # 無かった
}
0377343
03/05/25 00:49ID:???お礼が遅くなり、申し訳ございません。
無事にサンプルスクリプトを動かす事が出来、それを踏まえて自分のスクリプトでやりたい事が実現できました。ありがとうございます。
しかし、上記のサンプルコードでプラス変数を追加し、文字列変換の def 部分をその変数で置き換えた場合にエラーが出てしまいました。
変数を表す場合は、@{$_[3]}ではダメだとまでは判別できるのですが、実際の表記の仕方が見当もつかない状況です(連想配列の場合もそうなんですが)
そこで、答えそのものではなくても、strict使うのであればここを読め、の様なサイトはないでしょうか?
>>4のサイトを全て回りましたが、普通に*で渡すようにとの解説ばかりでした。
0378349
03/05/25 01:32ID:???use strict 以前の話なのですよ。343さんがハマってる部分は。
むしろ use strict は全然関係無し。
まず * が何を表していて、何故 \ が出てきたか、@{ } は何を
しているのか、どうしてこのコードで引数に渡した配列そのもの
の値を置換する事ができるのか。そういう点を全部読み解き、
理解しましたか?
あと、エラーが出た場合はどんなエラーが出たのか言って
くれないと、何が悪いのかサッパリ見当付かないですよ。
0380343
03/05/25 02:15ID:???ご指摘ありがとうございました。
ご指摘いただいている箇所の理解が全然足りないようです。
先ほどから検索をかけて、
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
あたりが見つかりましたので、そこを熟読して、あと手元に青ラクダ本がありますので、
シンボリックリファレンス項目あたりも熟読してから再度チャレンジしてみようと思います。
それと質問をする側として必要な情報の提示を怠り、申し訳ありませんでした。
自分の理解を深めてから再度頑張ってみます。
>>379
お勧めサイトありがとうございます。
色々と載っていて、とても役に立ちそうです。
0381nobodyさん
03/05/25 13:54ID: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
0382nobodyさん
03/05/25 15:17ID:???困ったことに同一環境で正常に動作しました。
テスト方法は、上記のスクリプトの先頭に、
print "Content-type: text/html\n\n";
$year = "2003"; $month="5"; print "$year $month\n";
を追加して、$monthを変更しつつ数回実行。
0383381
03/05/25 15:37ID:sMN/Ic1b試していただき、ありがとうございます。
上記の時間は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のディレクトリが作成できるのに
なぜスクリプトからだとできないのだろう・・・
0384nobodyさん
03/05/25 16:33ID:???die使わなければいいだけでしょ。
エラー処理じゃなく分岐したいだけでしょ?
ファイルテスト演算子の-eでディレクトリがあるかどうか判別したら?
0385nobodyさん
03/05/25 16:42ID:???以下のURLにある、商品名とメールアドレスを入力してボタンを押すと、検索結果を入力した
メアド宛てに送信するというシステムがあるのですが。
該当ページURL
ttp://www.hakuraiya.way.cc/quote.html(海外の薬を個人輸入代行する業者のページです)
で、ソースを見ると
http://www.hakuraiya.way.cc/cgi-local/order/quotemail.cgi
こういうCGIに入力データが送られ、検索処理後にメール送信しているようなのですが、これは
どういう風に動いているんでしょう?
入力されたデータを処理し、予め用意した商品リストと照合・検索して、結果をメール送信する
わけなので、最低でも処理用CGIスクリプトと商品データファイルが必要なところまでは理解
出来るのですが、仕組みがイマイチわかりません。
スクリプト名等で検索しましたが全くHITしないし、こういうシステムは商用&有償なのは想像が
つきます。私自身はこれで商売をしようという気持ちはなく、自分のCGIの勉強の教材にしたいと
考えているので、以上のシステムに心当たりがある方、または「こういう風にスクリプトを組んで
いるんじゃないか?」という風に教えてくださる方、どうかご助力ください。
よろしくお願いします。
0386nobodyさん
03/05/25 16:48ID:???>入力されたデータを処理し、予め用意した商品リストと照合・検索して、結果をメール送信する
仕組みは自分で答えを言っちゃってるじゃん
検索スクリプトの結果をブラウザに返す替りにメール本文にするって
そんなに難しく考えることじゃないと思うけど
こんなCGI探してますスレッド ver.9
http://pc2.2ch.net/test/read.cgi/php/1051456859/l50
ここのリンク集を探せばあるかも、あるいはないかも
0388nobodyさん
03/05/25 17:29ID:???アルゴリズムに関する質問はスレ違いじゃないみたいよ。
最終的にはコーディングを目標にしてるみたいだからいいじゃん。
>>385
リンク元は見てないけど、結果を表示しつつsendmailでメールを送ればよろしい。
難しいことじゃないよ。
0389nobodyさん
03/05/25 17:30ID:LMu0ezCc}
こういうif文を書くと、1番目と2番目の(.+)はそれぞれ$1、$2と
なるのでしょうか。
それとも両方とも$1となるのでしょうか。
すみませんが教えていただければ幸いです。
0390nobodyさん
03/05/25 17:37ID:???なぜ試さない?
0392nobodyさん
03/05/25 18:04ID:???>>384の言うとおり、dieを使うとその時点でスクリプトが終っちゃう。
手元のリファレンスによると、孫ディレクトリは子ディレクトリが無いと作れないみたい。
どうしてもやりたい場合は、File::Pathモジュール使うとよい、とあった。
0393nobodyさん
03/05/25 18:35ID:???そこに試す環境がなかったので、質問させていただきました。
友達に聞かれて答えられなかったので。
会社にに戻って試してみましたので、すみませんでした。
おっしゃるとおりです。
ちなみに。>>391は偽者ですので。
この書き込みも、会社から書き込めないことから、友達の家
より代理書き込みしてもらってるので、IDでわかるかと思います。
0394385
03/05/25 18:48ID:???レスどうもありがとうございます。
>>386
>検索スクリプトの結果をブラウザに返す替りにメール本文にする
ああ、なるほど!そうすればいいのか。仰るとおり、難しく考えすぎていました。
>>388
こちらも、ヒントありがとうございます。上に書いたとおり、難しく考えすぎていたので
胸のつかえが取れたような気分です。助かりました。
お二方のレスを参考に、検索+sendmailのスクリプトを探して、組み込み改造など
頑張ってみたいと思います。本当に、どうもありがとうございましたm(_ _)m
0396nobodyさん
03/05/25 23:52ID:???そして使わなくなったものを undef していないから
メモリを大量に使ってしまうのですか?
0398nobodyさん
03/05/26 00:24ID:6A9UvBAu<INPUT TYPE=FILE NAME=file>
のファイル本体部分を取り出すのに
$buf =~ /(\r\n)$1(.+)\1-{10,}/;
$date = $2;
と書いてバッチシいくでしょうか?
$buf =~ /Content-.+(\r\n)$1(.+)\1-{10,}/;
上はどうでしょう?
ご意見おながいします。
0399398
03/05/26 00:27ID:???誤 \1
正 $1
です。
0401398
03/05/26 00:39ID:???ググってきます。
0403398
03/05/26 01:27ID:???http://pc2.2ch.net/test/read.cgi/php/1024795138/383
で質問したんですが誰もいないみたいなので
こちらで誰か教えてください。
おながいします。
0404398
03/05/26 01:43ID:???use CGI;
$query = new CGI;
と書いたときモジュールが使えなかったらエラーになりますか?
それとも
if($query){}
と、できますか? どうなんでしょう?
0406nobodyさん
03/05/26 03:15ID:???俺も相当アフォだな、、、逝ってこよう。
0408380
03/05/26 04:00ID:tTZ2AIlQchompを実行させても\r\nを改行と見なしてくれないのですが、
読み取られファイルをEUCにするのとchompの代わりに↓
$data =~ s/\r\n//g;
$data =~ s/\r//g;
$data =~ s/\n//g;
を使う。という方法以外で一般的な方法というのは無いのでしょうか?
0409380じゃないです
03/05/26 04:07ID:???名前入力してしまいましたが380は間違えです。
0410_
03/05/26 04:16ID:???0412nobodyさん
03/05/26 05:19ID:???$data =~ tr/\x0d\x0a//d;
が高速。
0413nobodyさん
03/05/26 06:37ID:qholo4T7ことを考えてるのですがこれって実現可能ですか。
リストで表示させる項目を一つの変数の中にまとめて
"a","b","c"と書いても実行するとリストは"a","b","c"と
繋がって表示されてしまい1項目しかでなかったものでして。
ある人は10個項目でててある人は5項目でてるような
ことがしたいのです。
0415nobodyさん
03/05/26 10:06ID:???言ってる意味がよーわからんので推測でだが、出来る。
ユーザごとに指定した数を指定しておいて、配列をその数だけ
回すなりなんなりでいいんじゃん?
0417nobodyさん
03/05/26 10:20ID:???>>414
添付ファイルはどこに誰が保存しているのか?
そのファイル名はメール内でのファイル名だと思うのだが
>>419
$?
0419nobodyさん
03/05/26 10:36ID:???未だにPerl4の鯖だってあるんだよ。
0420nobodyさん
03/05/26 11:01ID:X5HT6fof$orgid = $line{'orgid'};
$countryid = $line{'orgname_ja'};
$orgname = $line{'orgname'};
っていうのを、後ろの3行をベタにこういう風↑に書かないで、
foreach $value (@orgmaster) {
★ここが不明★ = $line{$value};
}
というようにまわしたいのですが、
★ここが不明★の部分がわかりません。どうすればいいのでしょうか?
0421bloom
03/05/26 11:08ID:gUjk1KcM0424nobodyさん
03/05/26 12:52ID:???$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]
みたいに表示さすにはどうすればいいのでしょうか?
0426nobodyさん
03/05/26 14:22ID:???0427426
03/05/26 14:23ID:???手元のリファレンスには何にもかいてなかったもんで
0428nobodyさん
03/05/26 15:09ID:ave5j164http://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);
0430nobodyさん
03/05/26 15:49ID:???http://flex.ee.uec.ac.jp/texi/perl/perl_54.html
0431424
03/05/26 17:42ID:???たぶん、おっしゃってるのは、そのページの一番最後の
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なんて書式の意味も、書いてないし。。。
この書式で探したのですが、わかりませんでした。。。
どういうことなのでしょうか?
0432356
03/05/26 20:54ID:???> print sort @george, 'to', @harry; の意味がわかりません。
結果からして、
print sort((@george,'to',@harry));
なんぢゃないかなと逝ってみる震度6弱。
0433nobodyさん
03/05/26 21:08ID:haPyfOxB$n_pass = "$in{'password'}";
# パスワード
$pass = '0123';
if($pass eq $n_pass)
こうするとできるのに、
# パスワード
$pass = '0123';
if($pass eq $in{'password'}")
こうすると、すべてパスワードが違うとでます。フォームから渡せてないんでしょうか?
0434nobodyさん
03/05/26 21:09ID:haPyfOxB↓
if($pass eq $in{'password'})
です。
0435動画直リン
03/05/26 21:10ID:gUjk1KcM0436431
03/05/26 21:21ID:XWjbOab7あー。。。了解すますた。
0438nobodyさん
03/05/26 22:32ID:haPyfOxBえ?&ReadParseって、cgi-libのライブラリのでしょ?
$in{'password'}
こうやったらライブラリいらないんじゃないんですか?
どっちにしてもライブラリはいるんですか?
0439nobodyさん
03/05/26 22:43ID:???なんかねぼけたこと言ってる奴だな……
PerlはCGI専門言語じゃない。
ブラウザのフォームから送られたデータを取得するには、
それ相応のステップをふまなければならない。
なにもしなければ、%inは空のままだ。
当たり前だ。何もしなかったんだから。
顔洗って出直してきなさい。
0440nobodyさん
03/05/26 22:48ID:haPyfOxBそんな・・・
方法を教えてください。お願いします
0441440
03/05/26 22:51ID:haPyfOxB要はPOSTの場合
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
で読み取って、splitできりきざんでやればいいんですね。
0442nobodyさん
03/05/26 22:55ID:???0443440
03/05/26 23:02ID:haPyfOxBそれでもいいんですけど、あんまりライブラリを使うのが好きじゃないんですよ・・・
全部で10行くらいだから中にいれてもいいかな〜って・・
0444440
03/05/26 23:04ID:haPyfOxBcgiを使う側の場合、
・cgiソースは簡潔がいいからライブラリ使う。
・ソースが多少多くてもいいからライブラリはできるだけさける。
どっちがいいんですかね?
0445_
03/05/26 23:09ID:???0446bloom
03/05/26 23:10ID:gUjk1KcM0447nobodyさん
03/05/26 23:24ID:???0449440
03/05/26 23:33ID:haPyfOxBそうですね。レスサンクス。
realParseだけなんで中に書きます
0450nobodyさん
03/05/26 23:36ID:x8s60k6pその際、じっくりと頭の中でシステムを描きなさい
そうすればおのずと答えは出てきます
0451nobodyさん
03/05/27 00:16ID:???マジレスするなら……
俺は開発速度を優先するべき状況にいるので、
ライブラリはとことん利用する立場だ。
Perlの場合はモジュールが便利だ。CPANを見るべし。
ライブラリを使えば、ソース自体を短くすることができ、
短いソースは同時にバグの入る確率が少なくなることを意味する。
副次的にバグの絶対数を下げる効果も期待できる。
(ライブラリにバグが入ってたらどうしようもないが、
自分よりも能力のある人間(作者)を信じて突き進むのみだ)
ま、好きにしろい。
0452nobodyさん
03/05/27 00:18ID:LZ3W66wZいると思う。
自分でフォームデコード書くならいらないけど。
0453452
03/05/27 00:22ID:LCoN4Nuw漏れは勉強がてら、
ライブラリに頼らず自分でコード書く。
0454424
03/05/27 00:56ID:tldcRAHy$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])
という意味の配列を表したつもりなのですが・・・
0455動画直リン
03/05/27 01:10ID:77ADrmTJ0456nobodyさん
03/05/27 01:10ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
0457454
03/05/27 01:28ID:tldcRAHyあー、それですねー。実は前に読んでちんぷんかんぷんで、
そのままにしてました。。。
しかし、今読んでもちんぷんかんぷん。。。
(わからない用語ばかりで、用語を調べるとよけいにわからなくなる(泣))
もしよかったら、恐縮がですが、
($ORG{'adanaid'}[1], $ORG{'adanaid'}[2], $ORG{'adanaid'}[3], $ORG{'adanaid'}[4], $ORG{'adanaid'}[5])
を配列として表す方法を教えていただけませんjか?
そしたら、演繹的に勉強していきますので・・・。
0458nobodyさん
03/05/27 01:49ID:???データ形式を見直したほうがいいのでは……
それと、$ORG{}[0]の要素が未定義じゃマズいでしょ。それもソートの対象になるんだから。
0459454
03/05/27 01:59ID:tldcRAHyあ、ほんとですね。。。ありがとうございます。
0460nobodyさん
03/05/27 02:25ID:???こういうのは実際に最小限のコードをどんどん書いて実際に
走らせながら理解していくのが一番早いし身につくんだが…。
@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" ← @{} で配列としてデリファレンス
これでもう分かるよな?
0461457
03/05/27 11:13ID:OknXPD/2リファレンスについて、随分わかってきました。
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に変えればいいかと思ったのですが・・・
0462_
03/05/27 11:24ID:???0464nobodyさん
03/05/27 12:10ID:???まず「コンパイルエラー」みたいな曖昧なエラー名はやめよう。
必ず表示されたエラーメッセージを正確に書くこと。
そのソース、実行してみたけど syntax error at hoge.pl line 7, near "})" とか、
あまりに初歩的なミスをやってる。foreach の使い方もヘン。
データの管理法も、あまりソートとかに向いてない形式だから変えたほうがいいと
個人的には思う。
漏れも試行錯誤してみたが、データを一度結合してからソートして、ループ内で
また分割するという非効率な方法しか思いつかなかった。
0465461
03/05/27 13:03ID:???KCatch.pmを使っていたのですが、
コンパイルエラーとしかいってくれなかったので、そういうもんだと思ってました。。。
すみません。
別のものに変えてみようかしら
0466nobodyさん
03/05/27 13:09ID:???kcatchってそういうもんなの?
CGI::Carpを使ってみては。(使い方はぐぐってね)
もっとも、コマンドラインで実行させるのが一番手っ取り早いんだけど。
0467nobodyさん
03/05/27 13:14ID:???0468nobodyさん
03/05/27 13:16ID:???googleで検索して
http://www.google.co.jp/
0469465
03/05/27 13:20ID:???use CGI::Carp qw(fatalsToBrowser);
したら、
「Software error:
Execution of test.cgi aborted due to compilation errors.
For help, please send mail(以下略)」と・・・
なんでだろう
0470nobodyさん
03/05/27 13:33ID:???0471465
03/05/27 13:51ID:???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>|;
}
0472nobodyさん
03/05/27 14:02ID:???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しか出なかったの?
っていうか、あなたの実行環境ってどんなん?
0473463
03/05/27 14:22ID:???・・・汚ねぇソース・・・
$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,
};
つづく
0474463
03/05/27 14:22ID:???"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);
こんな実行結果がお望みですか。
タブは見やすいように全角スペース
0475nobodyさん
03/05/27 14:22ID:Z3njAYJb@{$ORG{'adanaid'}) いっこ括弧閉じが足り無くない?
0477_
03/05/27 14:33ID:???0478nobodyさん
03/05/27 17:02ID:Ahi5sL61Jcodeモジュールの使えないサーバーで
Unicode(UTF-8) -> Shift JISの変換を行いたいのですが
どうすればよいでしょうか?
0482名前はまだ無い
03/05/27 19:39ID:0dveLtbZopen(a,">b");
close(a);
なんかで出来ましたよね。
空フォルダを作りたい場合はどのようにすれば良いのでしょうか?
上の">b"を">c/b"などにしても作ることが出来ませんでした。
どなたかお答えを願います。
0483nobodyさん
03/05/27 19:42ID:???0484名前はまだ無い
03/05/27 20:03ID:???0485469
03/05/27 20:33ID:CEAVaVCK2つのサーバで試したんですけど、syntax error at とかいってくれないですねー。
両方ともFreeBSDなんですけど、関係ないですよねー・・・
0486471
03/05/27 20:35ID:???なるほどーーーです。
変数の一元目にソートするものを持ってくるわけですね。
アルゴリズム考えるのに、foreachのところばかりにとらわれてました。
もっと全体的視点からアルゴリズムを考えないとだめですね。
ありがとうございます。コード参考にさせていただきます。
0487動画直リン
03/05/27 21:10ID:77ADrmTJ0488nobodyさん
03/05/27 22:20ID:???ちょっと呆れた。
鯖で実験すんなよ。
他人の物で無限ループとかのひどいバグがあるかも知れないプログラムを走らせようとするな。
そういうのは、ローカルでしっかりチェックしてから鯖にあげるもんだ。
まずローカルにPerlをインストールすること。(WinならActivePerl)
スクリプトのバグがあるかどうかのチェックは、
1.MS-DOSプロンプトを開き、
2.スクリプトのあるディレクトリまで移動し、
3."perl スクリプト名"と入力する。
CGIを実行しようとすると、うまく行けばHTMLが吐き出されるはずだし、
バグがあればエラーメッセージが出て止まる。
自分の尻拭いは自分でできるようになろう。
0489nobodyさん
03/05/27 23:22ID:???$num = sprintf("%X", 116777215);
のようにして16進数に直そうとすると、全て\xFFFFFFになってしまいます。
どうしたらいいでしょうか?
0490nobodyさん
03/05/28 00:45ID:d/eWTjVeのようになっている配列に対して、anにマッチする要素の
インデックス番号(上の例なら 1, 2, 3 ・・・)を得たいのですが
ループを回さずに綺麗にできる方法はないでしょうか?
0491nobodyさん
03/05/28 00:55ID:???my $count;
my %temp = map { $_, $count ++ } @array;
@result = @temp{grep { /an/ } @array};
こんな感じかなー。インクリメントのあたりが怪しいけど。
0492nobodyさん
03/05/28 01:07ID:???難しく考え過ぎ。
@array = qw( apple orange banana angle tv home );
@result = grep $array[$_] =~ /an/, 0..$#array;
0493nobodyさん
03/05/28 01:30ID:???$number = 16777215(\xFFFFFF)以上の文字;
$num = sprintf(qq{%04X%04X},int($number/0x10000),$number%0x10000);
みたいな。
0494490
03/05/28 01:43ID:???ひたすらgrepかmapを眺めていて、どちらかでできそうだと
思っていたのですが、全く思いつきませんでした。
まだまだ修行不足でした。ありがとうございました。
0495nobodyさん
03/05/28 03:57ID:???それを解説してるページってあります? ぐぐっても見つかんなかった。
0496nobodyさん
03/05/28 03:58ID:???if($name eq "ほげ"){
if($value =~ tr/;<>*|`/&$!#{}:;'"$//){
$error[n] = "エラーだぴょん";
$errorh = "1";
}
}
カタカナなんかもエラーの対象になってしまうのであります。
なんでなの?
0499nobodyさん
03/05/28 04:26ID:???だけ抜き出したいんですけどうまく抜き出せません。他にもゴミ
がついてきます。
#!/usr/bin/perl
while(<STDIN>){
if(/\b[a-z|0-9]{32}\b/){
print;
}
}
どうしたらいいですか?
0501nobodyさん
03/05/28 04:48ID:???したいんですけど無理ですかね。。?もちろん、
空白か行頭、行末にはさまれてはいます。
0503nobodyさん
03/05/28 05:32ID:???おらおらおらおら無駄無駄無駄無駄 by じょうたろう
vizelj f6c08af464e2db2d05988c121db29156
こんな感じです。ハッシュ値ってのは最後の英数字の
羅列です。アルファベットの小文字または数字で構成
されていて長さは32文字固定です。
0505nobodyさん
03/05/28 07:58ID:???if(/\b([0-9a-z]{32})\b/){
print $1;
}
0506nobodyさん
03/05/28 13:22ID:???close(FA);
のように、新規ファイルを作成すると
パーミッションが 0644 になってしまうので
chmod(0777,"file");
のように0777に変えてやってるんですが、うまくいきません。(パーミッション変更出来ない)
サーバによっては上手く行くので、原因はサーバ側の設定でしょうか?
もしそうであれば管理者に相談しようと思うのですが、
それ以外で解決策ありますでしょうか?
やりたい事としては
・新規ファイル、ディレクトリを作成→パーミッションを777にしたい
です。
0508nobodyさん
03/05/28 13:52ID:???現状標準入力から受け取って、ファイルとテキストを切り分けて、ファイルのサイズを取得して
サイズが大きいと蹴ってるのですが、
これだとサーバーに送信された後の処理なので、送信される前になんらか手を打てないしょうか?
0509nobodyさん
03/05/28 13:55ID:???鯖によっては777を禁止してるとこもあるかもしれないな。
755にも変更できないのか?
0510nobodyさん
03/05/28 13:58ID:???うろ覚えで悪いが、送信時にいけなかったっけか?
<input type=hidden name=MAX_FILE_SIZE value="500000">
たしかこんな感じで。
valueに最大ファイルサイズを入れればいいと思う。
ただ、うろ覚えなので確認は自分で。
0512nobodyさん
03/05/28 14:15ID:???umaskとか。
0514nobodyさん
03/05/28 15:06ID:???そうか、PHPだけか…すまんかった。
じゃあちょっと手抜きだが、これでは駄目?
if($ENV{CONTENT_LENGTH} < $max_filesize) {
ファイルがでかかった時の処理
exit;
}
これだとpostされたデータ全体になるので、厳密な画像サイズだけでは無いけど
まあ、大体で制限できるかと。
0515514
03/05/28 15:09ID:???×if($ENV{CONTENT_LENGTH} < $max_filesize) {
○if($ENV{CONTENT_LENGTH} > $max_filesize) {
0516513
03/05/28 15:22ID:???その処理にしようかとも迷ったんですが
同じcgiで画像の添付数やテキストの入力量にかなりバラつきがあるので
やめました
もうちっと試行錯誤してみます。
0517nobodyさん
03/05/28 16:15ID:???print $text;
ってすると qr の仕様らしくて、$text の中に特殊な意味を持つ文字列が入るんですが、
これを取り除く、または取り除いたデータを参照できる方法はないですか?
二重 foreach の中で正規表現は効率悪い、というのをラクダ本で見たので
やってみたのですが、$text そのものを表示して使いたいため
これがネックで困ってます…。
ラクダ本、何か宇宙語のようで読むのが大変ですw
0518山崎渉
03/05/28 17:03ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0519nobodyさん
03/05/28 18:02ID:???0522nobodyさん
03/05/28 19:24ID:uwixhF+z改行を取り除きたいのですが、
どのようにすればいいのでしょうか?
改行を取り除くのは
$body =~ s/\n//g;
これでできるのですが、
$bodyの中の1行目から3行目までだけの
改行を取り除きたいと思っています。
0523nobodyさん
03/05/28 19:46ID:???@bodys = split (/\n/, $body);
chomp ($body[0], $body[1], $body[2]);
いくら初心者のためのスレだと言っても、
最低基礎くらい覚えてこい!
0524523
03/05/28 19:51ID:???@head = splice (@bodys, 0, 3);
$body = join ("\n", @bodys);
スマン、俺も、ちゃんと勉強しておく。。。
0525nobodyさん
03/05/28 20:15ID:+jnsOx/qはぁ?じゃマジ初心者はどこいったらいいのよ?
お前スレタイ読んで出直してこいや(w
0526525
03/05/28 20:16ID:???0527nobodyさん
03/05/28 20:29ID:uwixhF+zありがとう。
でも配列使えないんですよ。
ポインタみたいな物使ってるので。
$body_item->{'body'}
これの中身の最初の\nから3つ目の\nまで消したいんです。
0528nobodyさん
03/05/28 20:31ID:uwixhF+z0529_
03/05/28 20:32ID:???0530nobodyさん
03/05/28 20:37ID:???for($i=0; $i<3; $i++){
$body_item->{'body'}[$i] =~ s/\n//g;
}
0532nobodyさん
03/05/28 20:44ID:uwixhF+z>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.
というエラーが出ます。
0533nobodyさん
03/05/28 20:46ID:???198行目がなんなのかもわからんのに
0534nobodyさん
03/05/28 20:49ID:uwixhF+zuse 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
このようなエラーが出ます。
0535nobodyさん
03/05/28 20:49ID:???0536nobodyさん
03/05/28 20:54ID:uwixhF+z0538nobodyさん
03/05/28 20:58ID:C2cSB0SK↓
http://www.dvd-yuis.com/index2.html
0539nobodyさん
03/05/28 20:58ID:uwixhF+z全然おちょくってないです。
本当に困ってるんですよ。
0540nobodyさん
03/05/28 21:00ID:uwixhF+z0541nobodyさん
03/05/28 21:01ID:uwixhF+z0543動画直リン
03/05/28 21:10ID:52+C0e9R0544nobodyさん
03/05/28 21:12ID:uwixhF+zありがとう
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
こういうエラーが出ます。
0546nobodyさん
03/05/28 21:15ID:???0547nobodyさん
03/05/28 21:15ID:???カンマ区切りじゃなくて、半角スペース区切りだろ
0549nobodyさん
03/05/28 21:18ID:uwixhF+z半角スペースでも試しましたが駄目でした。
0550nobodyさん
03/05/28 21:20ID:???@{$body_item->{'body'}} = split (/\n/, @{$body_item->{'body'}});
@head = splice (@{$body_item->{'body'}}, 0, 3);
$body_item->{'body'} = join ("\n", @{$body_item->{'body'}});
いっぱい間違ってないかい?
0551nobodyさん
03/05/28 21:20ID:???0552550
03/05/28 21:22ID:???$body_item->{'body'} = join ("\n", @{$body_item->{'body'}});
↓
@{$body_item->{'body'} = join ("\n", @{$body_item->{'body}});
変更。
0553nobodyさん
03/05/28 21:22ID:uwixhF+zありがとう
これだと
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)"
0558nobodyさん
03/05/28 21:26ID:uwixhF+zそれだと
Bad name after body' at user_lub/xxxx/xxx.pm line 209.
というエラーが出ます。
0559550
03/05/28 21:27ID:???いや、厳密には配列に入ってるんだよ。
それが、リファレンスで入ってるんで、ちょっと扱いがわかってないっぽい。
要領は同じなんだけどね〜・・・
って、雑談ぽくなってきたので、これにて。
0561nobodyさん
03/05/28 21:28ID:uwixhF+zこうすると
'@body_item->{'body'}' is not a valid variable name under strict vars at user_lub/xxxx/xxx.pm line 196
このようなエラーが出ます。
0563nobodyさん
03/05/28 21:30ID:uwixhF+zそれは出来ないんですよ。ソースが膨大でDatabase使ってますから。
0564nobodyさん
03/05/28 21:31ID:???掲示板で教えるのは限界がある。
・・・とにかく、@body_item->{'body'}ってのを、@{$body_item->{'body'}} へ、ちゃんと変更する。
全部。
0566nobodyさん
03/05/28 21:38ID:uwixhF+zpakage使ってますから横の繋がりもあるんですよ。
0567nobodyさん
03/05/28 21:39ID:???それでもいいから。
エラーは、そのモジュール局部的な物と見てる。
それとも、晒せないソースなのか?
今のペースだと、スレ1つ消化するくらい説明のやり取りが必要になるぞ。
0568nobodyさん
03/05/28 21:40ID:???だったら、196行目だけ晒せばいいだろ!
0570nobodyさん
03/05/28 21:41ID:uwixhF+z分かりました。
もうちょっとやって駄目ならそこの部分のソースを2chアップローダに
上げます。
0572nobodyさん
03/05/28 21:43ID:uwixhF+z196行目は
my $body;
です。
0574nobodyさん
03/05/28 21:55ID:???0576nobodyさん
03/05/28 22:02ID:???$text = 'abc';
$regex = qr/$text/;
これでいいだろ?
んで、表示する時は$text使えばいいんじゃねーか。
0577nobodyさん
03/05/28 22:04ID:???0578nobodyさん
03/05/28 22:09ID:uwixhF+z完璧です。
それで完璧に出来ました。
ありがとうございます。
0579nobodyさん
03/05/28 22:16ID:uwixhF+zどこでそのような方法を勉強したのでしょうか?
perlのリファレンス見てもそのような表現方法は載ってなかったので
どうやって勉強したのか気になります。
0581nobodyさん
03/05/28 22:23ID:uwixhF+zそうですか。
人のソースで勉強したのですか。
人の書いたソースでも、あの表現方法を理解するのは
私には難解です。
まだまだ勉強が足りないですね。
0582nobodyさん
03/05/28 22:27ID:uwixhF+zちなみにこれについて教えていただきたいのですが、
$1$2$3というのは変数だと思いますが、strict内で変数宣言しなくても
エラーが出ませんでした。どうしてなのでしょうか?
普通は my $1;などと変数宣言しないといけないはずですが。
0583nobodyさん
03/05/28 22:37ID:???http://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=Perl+%E7%89%B9%E6%AE%8A%E5%A4%89%E6%95%B0+%241&lr=lang_ja
0584nobodyさん
03/05/28 22:42ID:???0585nobodyさん
03/05/28 22:44ID:???0586nobodyさん
03/05/28 22:47ID:uwixhF+z特殊変数だったのですね。
$n
最後に一致した正規表現内の()グループに相当する部分文字列が設定されるのですね。
正規表現を勉強しないといけませんね。
0587nobodyさん
03/05/28 22:58ID:uwixhF+z0588nobodyさん
03/05/28 23:14ID:???これもゆとり教育の弊害か。
0589nobodyさん
03/05/28 23:20ID:???0590nobodyさん
03/05/28 23:41ID:???こんな香具師、いつもならスルーなのに今日はどうした?
0591nobodyさん
03/05/28 23:53ID:???$body =~ s/\n//;
$body =~ s/\n//;
完璧だ!
0592nobodyさん
03/05/29 00:08ID:NXYitVzp構うなよバカを
0593nobodyさん
03/05/29 00:23ID:QV3HKWcehttp://homepage3.nifty.com/coco-nut/
ここ(σ ̄ω ̄)σ神がいます
http://jbbs.shitaraba.com/computer/2364/
0594nobodyさん
03/05/29 00:58ID:???0596nobodyさん
03/05/29 10:45ID:m7OaXWdv0597nobodyさん
03/05/29 10:56ID:OM7vlSMS2,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ファイルからもってきた値に変えたい
]
);
あと、リファレンスについて、猿でもわかる解説ってないでしょうか・・・?
0598bloom
03/05/29 11:10ID:AQrs4zcG0599nobodyさん
03/05/29 11:51ID:???0600nobodyさん
03/05/29 11:54ID:???なぜ、ラクダ本を薦めるのかがわからん。
たしかに最強の本だが、ラクダ本で理解するのは難しいだろ。
ある程度分かってからなら、さらに深く理解できると思うけど。
お勧めは、「新Perlの国へようこそ」
俺は、これでリファレンス&オブジェクトを勉強した。
0601nobodyさん
03/05/29 12:00ID:e3PaTXyE十分と思われ。
まあ漏れもラクダ本は好きじゃないけど、これくらい買う気にならないと
どうせやっても頓挫するよ、くらいの目安にはなると思う。
ちなみに漏れは「初めてのPerl」みたいなタイトルの本買って勉強しますた。
0602_
03/05/29 12:01ID:???0603nobodyさん
03/05/29 12:18ID:???入門もリファレンスもネット上で足りるよな。
それでも理解不能な超初心者向けの本というと何だろう。
もはやPerl以前のところから説明してそうだけど。
0604597
03/05/29 12:34ID:???おれが一番読んでいるのは、その「新Perlの国へようこそ」です・・・
やばいのかな、おれって
いや、リファレンス以外はらいたい、その本で理解できたつもりなんですけどね
0605nobodyさん
03/05/29 14:19ID:???0606nobodyさん
03/05/29 14:42ID:???0607nobodyさん
03/05/29 14:59ID:hW1BfWjcを使ってダウンロードさせるプログラムがあって、
そいつをNetScape7でダウンロードさせると、ファイル名のケツに.cgiがつくんです。
対処方法はありますか?
0608nobodyさん
03/05/29 15:10ID:f7DLEcKaそれともパール?
どうなのYOー
0609nobodyさん
03/05/29 15:17ID:???まぁ、俺は駱駝本は欲しいなと思ってはいるけど、
入門段階で本を買ったら覚えれるという発想も安直だと思うのだが如何だろう?
0610nobodyさん
03/05/29 15:41ID:???0611nobodyさん
03/05/29 15:49ID:???0612nobodyさん
03/05/29 15:51ID:5xhJzi5fいちおうNet::SSLeayというモジュールが必要ということで
ppm install Nea::SSLeay としてやってみたもののうまくできません。
どうすればよいでしょうか?
perl初心者ですが申し訳ありません。
0613nobodyさん
03/05/29 17:15ID:???0614nobodyさん
03/05/29 17:48ID:???らくだ本を読めば理解できる人が全てというわけでは無いんだから、少し配慮しよう。
0615nobodyさん
03/05/29 17:50ID:???質問の内容がアホすぎる奴が多い。
いかにも「とりあえず聞いてます」みたいな奴。
ちったあ調べて来い! ってんだ。
0617nobodyさん
03/05/29 22:00ID:???考えるとあんま安くないな...。
あ、簡単なperlの本は読んだんですけど必要ないですかね?
掲示板とか作るところでつまずいたんで買おうと思ってるんですけど。
0618nobodyさん
03/05/29 22:03ID:???あ、スレ違いでした。すいません。
0619nobodyさん
03/05/29 23:22ID:RP1Tv8fKよければ教えて下さい。検索に出なかったもので、、
0620nobodyさん
03/05/30 00:11ID:???http://www.google.com/search?num=50&hl=ja&ie=Shift_JIS&q=Socket+perl&lr=lang_ja
ちゃんと調べたのか・・・。
検索したら、山ほど引っかかるが?
これ、全部読んでもダメなら本探しに行くがよろし。
0621sample
03/05/30 02:10ID:nd3Sm/eFmy @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>
0622nobodyさん
03/05/30 02:15ID:???http://www.atmarkit.co.jp/fpc/slotsocket/indexpage/
0623597
03/05/30 02:28ID:???なぜ、
14-16行目は
$template->param(
LIST => \@list
);
10行目は
push @list, $%list;なのでしょうか?
つまり、どうして、push @list, \%list でないのでしょうか?
0625_
03/05/30 02:42ID:???0627直リン
03/05/30 03:10ID:KvuUHxNV0628nobodyさん
03/05/30 03:11ID:k5B8Isn5(key=aaa&key=bbbのように)
同じキーの値が複数ある場合、何で分割されているのでしょうか?
CGI.pmは同じキーの場合、配列にして戻ってくるらしいのですが、
見たところ配列でもないし、何で分けられているのかさっぱり分かりません・・。
0630nobodyさん
03/05/30 03:22ID:/oIAPWL0普通にconnect関数を使えばいいのでしょうか?
調べてみましたがどこにも書いてなかったのでお願いします。
0631nobodyさん
03/05/30 11:03ID:MqvbgP4I$hoge[0]じゃないといけないのに、@hoge[0]でもOKだったんですけどなぜですかね
0632直リン
03/05/30 11:10ID:KvuUHxNV0633nobodyさん
03/05/30 11:25ID:wqqbPD7W$salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2); #aska.cgiのある一行です
関数的な意味ではなく文法的な意味が。&&や||がどの部分にかかっているかとかがいまいちわかりません。
分解したり()つけたりどなたか分かりやすく説明していただけないでしょうか。
0634nobodyさん
03/05/30 11:39ID:???$salt = (($logpw =~ /^\$1\$(.*)\$/) && $1) || substr($logpw, 0, 2);
パターンマッチが成功したら→ $salt = $1
失敗したら → $salt = substr($logpw, 0, 2)
違ってたらすまん
0635nobodyさん
03/05/30 11:44ID:???それはね〜。
スライスと言ってね〜
$はスカラー変数として評価されて、
@は配列として評価されるんだよ〜。
たとえばね〜。
配列の要素0と3と6をコピーしたいとするよね〜。
@hoge = ($hage[0], $hoge[3], $hoge[6]);
↑これだと、ちょっと面倒だよね〜。
@hoge = @hage[0, 3, 6];
↑これだと、すっきりして見えるよね。
スライスって便利だね〜。
マジ、本読もうね〜。
0636635
03/05/30 11:45ID:???ここの所、ちょっと変数名間違っちゃったけど、
言いたいこと分かってくれるよね〜?
0637nobodyさん
03/05/30 11:48ID:???>どこかのホームページでUDPもconnectできると書いてあるんですが・・・
へー。どこかのホームページにそんな事書いてたのか〜。
>調べてみましたがどこにも書いてなかったのでお願いします。
へー。どこにも書いてなかったのか〜。
・・・( ´_ゝ`)ヘー
0638nobodyさん
03/05/30 11:55ID:???それで合ってるっぽ。
$salt = ($logpw =~ /^\$1\$(.*)\$/ ? $1 : substr($logpw, 0, 2) );
こう書いた方が、まだ分かりやすい・・・
0640630
03/05/30 14:51ID:qOosOO5S失礼しました。
どこかのホームページではなく、とあるホームページです。
自分なりにconnect関数について調べたのですが、udpを使用しての使い方は載ってませんでしたので…。
0641nobodyさん
03/05/30 14:58ID:???いや、そういう意味じゃなく、
その「どこかのホームページ」に書いてたなら、
その「どこかのホームページ」内に、説明がなかったのかね?って意味。
ちょっと、ひねくった言い方してみた。
0643630
03/05/30 15:11ID:uU/3TkKVudpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。
当方の見落としですかね?
0644630
03/05/30 15:12ID:qOosOO5S>>642
>>642のサイトです。
udpでconnectとか書いてあるんですけど、どこにそれが書いてあるのやら…。
当方の見落としですかね?
0645630
03/05/30 15:13ID:gys3ZHK80646nobodyさん
03/05/30 15:58ID: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:こういう場合、どこを修正すれば良いのでしょうか。パーミッションが悪いのか、パスが悪いのか、それともアップロードの仕方が悪いのか、もっと他に原因があるのでしょうか。
よろしくお願いします。
0647nobodyさん
03/05/30 16:47ID:???ローカルってWin?
ローカルで動くならperlの文法は合ってるんだろうね。
どっかで初歩的なミスしてると思うよ。
ま、スレ違いなので、
http://pc2.2ch.net/test/read.cgi/php/1048686475/l50
↑こちらへどうぞ。
0648nobodyさん
03/05/30 18:30ID:axvQjxfE0650nobodyさん
03/05/30 19:09ID:???モノが足らない。他に3つぐらい必要
>>628
CGI::Applicationは内部でCGI.pmを使ってるから処理は同じ。
>>643
UDPでconnectってのは単に宛先を省略できるようになるだけ。
実際にコネクトしてるわけじゃない。
0651nobodyさん
03/05/30 19:36ID:???0652_
03/05/30 19:41ID:???0653nobodyさん
03/05/30 20:14ID:???連想配列Aと連想配列Bがある場合、AにBをコピーさせたいのですが、
コピーする際にキーの重複を避ける為にBのキーに固定文字を追加して
移動させるにはどのように書けば良いのか教えて下さい。
配列の場合にはそのままpushで簡単だったのですが…
0655nobodyさん
03/05/30 22:04ID:v3ScOAWpを
%b = (1_b => "a",2_b => "b")
ってことじゃねーの?
0656nobodyさん
03/05/30 22:45ID:???0657653
03/05/30 23:01ID:???すみません。
>>655の解釈の通りです。
連想配列の解説を読みあさって、自分でも作ってみました。
while (($key, $value) = each(%B)) {
$A{"b_$key"} = $value;
}}
一応、期待通りに動いてはくれているのですが、
もう少しスッキリ書けないものかと思いまして。
これが最善の用法ですかね?
0658nobodyさん
03/05/30 23:11ID:v3ScOAWp<!--#exec cgi="./acslog.cgi" -->でアクセスされたときと、
http://aaa.net/acslog.cgiでアクセスされたときを分岐したいのですが、
無理ですか?
0659658
03/05/30 23:13ID:v3ScOAWp適当ですのでお気にしないでください。
0660nobodyさん
03/05/30 23:38ID:TYAZIilihttp://homepage3.nifty.com/coco-nut/
http://www.k-514.com/
0661nobodyさん
03/05/30 23:52ID:???それでできるなら、それでいいんじゃない?
俺なら・・・
while (($key, $value) = each(%B)) {
$key .= '_b';
$A{$key} = $value;
}
こうするけどね。
>>658
あのさ・・・
本当に教えてほしいなら、ちゃんと質問しようよ・・・
何を質問したいのか?って所から考えちゃったよ・・・
HTMLに埋め込んでるSSIで呼び出されたCGIファイルの実行結果と、
CGIファイル直接アクセスされた時の実行結果を変えたいって事でしょ?
SSIで呼び出す時は、GETで情報埋め込んでおいたらどう?
0662nobodyさん
03/05/30 23:56ID:???@A{ map "b_$_", keys %B } = values %B;
>>658-659
その質問は CGI 関係のスレへ振ってくれ。
あとコレ読んで。
http://www.goto.info.kanagawa-u.ac.jp/~horiyuki/rfc/rfc2606j.txt
0663653
03/05/31 01:29ID:???なるほど、そっちの方が後で読んだ時にわかりやすいですね。
ありがとうございます。
>>622
すごい。
そこまで端折れるものだったとは。
状況によって、>>661さんと>>662さんの構文を使い分けていきたいと思います。
ありがとうございました。
0664658
03/05/31 01:30ID:6mtQ8nNeSSIでacslog.cgi?aaa
とかしても意味ないんじゃないですか?
?つけても、execで実行すると.cgiで実行した結果になるんですが・・・・
0665nobodyさん
03/05/31 02:13ID:???0666nobodyさん
03/05/31 02:55ID:???・・・ヘ?
GETで値送って、その値見て処理を変えるんだよ?
直接CGIにアクセスされても、GETで値送らない限り処理変えられると思うが・・・?
とりあえず、>>665の言う通りスレ違いだから、これ以上はCGI質問板へ。
0667Name_Not_Found
03/05/31 05:21ID:yCzSry8LJavascriptでのsetTimeoutやsetIntervalでの1000msの長さに
違いが出るということはあるのでしょうか?
サーバはinfoseekで試したのですが1分30秒の間に
10カウント近くtimeの方が早く、時計を見ていた結果、
Javascriptのほうが正しいっぽいのです。
何か情報をお持ちの方、お答えをお願い致します。
0668nobodyさん
03/05/31 05:36ID:???違いが出たのなら、記述ミスを疑うべき。
0669nobodyさん
03/05/31 05:37ID:???それはPerlの問題ではない。
インターネット経由でCGIを実行するんだから、数秒のタイムラグはあって当然。
同じスクリプトをローカルで実行させてみ?
0670nobodyさん
03/05/31 09:54ID: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"が出力されてしまうところが理解できないのです。
置換文字列内のハッシュの添字は変数展開されないのでしょうか?
どなたかご教示ください。
0671nobodyさん
03/05/31 10:02ID:???s/($1)/$h{$1}/;
0672直リン
03/05/31 11:10ID:1EAhrEiJ0674nobodyさん
03/05/31 15:03ID:???>>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/ と等価
0675nobodyさん
03/05/31 16:21ID:???いつか、ちゃんと勉強しなおそうとは思うけど。
0676670
03/05/31 17:14ID:fOVZj1BA良く分かりました。どうも有り難うございます。
ハッシュの添字は変数展開されないのかしら、と思ったのは、勉強中の
「初めてのPerl」という本に次の記述があったからです。
(以下引用)
@fred = ('hello','dolly');
$y = 2;
$x = "This is $fred[$y-1]'s place"; # "This is dolly's place"になる
インデックスの式はーあたかも文字列の外部に置かれているかのようにー
普通に評価されていることに注意しましょう。まず最初にインデックスの
式に対して変数展開が行なわれるわけではないのです。
(引用終り)
この部分、何を言っているのかさっぱり分からない(変数展開してると思う)
のですが、配列のインデクスに対して変数展開が行なわれないのなら、
ハッシュの添字に対しても同じことかな、と思ってしまったのです。
変数展開する/しないで頭の中ゴチャゴチャです。
0678nobodyさん
03/05/31 18:10ID:???> インデックスの式に対して変数展開が行なわれるわけではない
"$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] を見る事に
なってしまう。
0679nobodyさん
03/05/31 18:11ID:???0680nobodyさん
03/05/31 18:32ID:???↑このスラッシュの前後で、
$1の中身が"abc"→undef となるのか。勉強になった。
0681nobodyさん
03/05/31 19:42ID:???ボタンをクリックして処理を始めるというのがいまいちわかりません。
投稿 ボタンをクリックすると、 投稿処理が始まりますよね?
どのようにしていその処理に移ればいいのでしょうか?
厨な質問でスマソ・・・
0682nobodyさん
03/05/31 21:02ID:???0683nobodyさん
03/05/31 21:16ID:???どうもCGIを作りたいみたいだから、先に
スレタイを読んで理解すること、HTMLを理解することを薦める。
HTMLを理解しないとどうせCGIからHTMLを吐けないからね。
<form action="hoge.cgi">
0684nobodyさん
03/05/31 21:16ID:???×Perlについて興味を持ち始めたんですが、
○CGIについて興味を持ち始めたんですが、
×厨な質問でスマソ・・・
○スレ違いな質問でスマソ・・・
0685nobodyさん
03/05/31 21:20ID:FYLpMA2Jスレ違いだけど教えてやる。
投稿をクリックするとform actionで指定されたcgiを呼び出す。
で、呼び出されたcgi側でフォームで指定されたメソッドにしたがって処理。
0686nobodyさん
03/05/31 21:26ID:???このスレの方が大抵いつも上にあるから?
0687_
03/05/31 21:30ID:???0688nobodyさん
03/05/31 21:39ID:Ecff4K+l0689nobodyさん
03/05/31 21:49ID:???0690nobodyさん
03/05/31 22:00ID:qGkh6pMiアッタマイイ(・∀・)!!
0691nobodyさん
03/05/31 22:18ID:ZijosZeyxmailでメール送信する場合って、
open(MAIL, "| /usr/sbin/xmail/sendmail -t");
で送れるんですか?
0692nobodyさん
03/05/31 22:23ID:???詳しく説明してる様なサイトってないでせうか?
0695nobodyさん
03/05/31 22:41ID:???> my $filesize = -s $filename;
my $filesize = (-s $filename);
スマソ
0696693
03/05/31 22:42ID:???0697nobodyさん
03/05/31 22:58ID:m6zPJsPy0699nobodyさん
03/05/31 23:11ID:???マルチうざいです。
しかも、向こうで答えようとしている人がいるのに何でマルチするのですか?
なぜ、わざわざスレ違い、いや板違いであるこのスレで質問するのですか?
そして、textareaのスクロールバーなのか、
ウィンドウのスクロールバーなのかくらいハッキリさせろ。
cf. http://pc2.2ch.net/test/read.cgi/hp/1053619342/226 だよね?(´Д⊂ク
0700nobodyさん
03/05/31 23:15ID:ZijosZey板違いの何がいけないんですか?
0703612
03/05/31 23:31ID:3Wm6q7+jいちおうNet::SSLeayというモジュールが必要ということで
ppm install Nea::SSLeay としてやってみたもののうまくできません。
どうすればよいでしょうか?
perl初心者ですが申し訳ありません。
650さんにものが足りないといわれましたが、なにが足りないのでしょうか?
0704nobodyさん
03/05/31 23:33ID:ZijosZeyマンコ
0705nobodyさん
03/05/31 23:33ID:???>>700
何の板なのか、そしてここは何のスレかを腹筋しながら50回音読してください。
# 向こうで答えが出ているのにわざわざマルチするなんて最低だよq(^-^)
0706nobodyさん
03/05/31 23:45ID:???1 スタートメニューからperl package managerを起動する
2 search sslする
3 Crypt-SSLeayが見つからなければ
repoでリポジトリを確認し、repo 2とかやって切り替える。2に戻る。
4 install (3で見つけた番号)
だったと思う。俺はもう既にインストール済みだから手順を確認できない。
0707nobodyさん
03/06/01 00:16ID:???初心者だから仕方ないでしょう。
誰でも最初は初心者に決まってるじゃないですか。
質問には全部答えてあげればいいじゃないですか。ガキじゃないんだから。
そしてスレの内容をめちゃくちゃにして誰もが不利益を被るようにすればいいじゃないですか。
0709nobodyさん
03/06/01 00:27ID:???初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
初心者だから仕方ないでしょう。
0710nobodyさん
03/06/01 00:47ID:DeFU3cB4Win32モジュールってどこにあります?
なかなか見つからないんですが・・・
0711nobodyさん
03/06/01 01:03ID:???1.本気で自分は絶対に間違ってなく、他の全てが間違っていると考えている。
->本物。なので処置なし。放置。
2.薄々自分のやったことに後ろめたさを感じているが、認めたくない。
->厨房。頭が冷えるまで放置。と言うか物の道理がわかるまでネットにつなげるな。
3.ネタ
->放置
おお、実態がどれであろうと放置以外に選択肢がない。
0712nobodyさん
03/06/01 01:06ID:???ウィンドウズにActivePerlを入れてるなら、
スタート->検索->ファイルやフォルダで検索を開き、Win32で検索。
……Perlとかんけーねえ!?
0713動画直リン
03/06/01 01:10ID:FDrVWEME0714nobodyさん
03/06/01 01:36ID:DeFU3cB4ごめん。はじめっからはいってるんだね。
すんませんでした。
0715707
03/06/01 02:34ID:???やっと目が覚めました。
初心者だからって、それに甘えてルールを破る事って
いけないことですよね。。。
自分が甘ったれだって、気がつきました。
もう少し、勉強してきます。
ありがとうございました。
0717本当の本物707
03/06/01 03:08ID:5qKTyD6i僕が、変な質問の仕方したばかりに、
偽者が現れて、荒れてきてます。。。
>>716は、偽者です!
僕は、今ちゃんとまじめに勉強してます。
今後も、もしかしたら僕の偽者が現れるかもしれませんが、
どうか、放置してください。
本当の本当に、ご迷惑をおかけしました。。。。
IDも晒しておきます。
0718直リン
03/06/01 03:10ID:FDrVWEME0721nobodyさん
03/06/01 03:40ID:???んだから、板違い/スレ違いが来たら叩くだけだC〜
その結果スレが荒れたって困らないC〜
荒れて困るほど人が多い板じゃないC〜
0722nobodyさん
03/06/01 03:54ID:???荒れると、困るというか嫌だが、何か?
俺以外でも、そう思うヤツはいてると思うが、何か?
荒れて良いなんて思った事なんて、一度もない。
Perl使ってCGI組んでる俺は、PerlだろうがPHPだろうが、
WebProg板全体のレベルアップを願う一人だ。
0723nobodyさん
03/06/01 04:36ID:???あまりに下らない流れを発見した。
0724nobodyさん
03/06/01 04:36ID:???0725670=676
03/06/01 05:30ID:6WOnkruh有り難うございます。
$y = 2;を、$x = "$y";で展開すると、$xは2(数値)ではなく、"2"(文字列)
になるということですね。
言われてみれば当り前のことですが、これがはっきり認識できていません
でした。
0727nobodyさん
03/06/01 12:47ID:???0728nobodyさん
03/06/02 02:35ID:???unlessやらuntil使わずに、ifとwhileに!を組み合わせて使う。
ナンデダロ(・∀・)
0730nobodyさん
03/06/02 08:32ID:???ご紹介してもらえませぬか?
0731nobodyさん
03/06/02 08:38ID:???こういう所でいいのかな?
ttp://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
0732nobodyさん
03/06/02 12:25ID:s70dOIFMDBのように外部キーなどを使って管理しています。
(なお、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>";
}
(つづく・・・)
0733732
03/06/02 12:25ID:???ここで、質問です。上記のものを変更して、
★国名も表示させるには、どうすればいいのでしょうか?
(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)
0734732
03/06/02 12:28ID:???教えていただければ幸いです
0735nobodyさん
03/06/02 12:37ID:???わからん・・・
何を聞きたいのかが分からん・・・
手順だけを教えてくれって・・・
処理のアルゴリズムは、プログラマーが考える事であって・・・
処理方法は、何十種類も、何百種類もある。
ところで・・・お前は、ソートの動きを理解してない、いつぞやのヤツでは?
0736732
03/06/02 12:43ID:???あー、そうなんですね・・・。言われてみれば確かに。
定石でもあればと思ったのですが・・・
>ソートの動きを理解してない、いつぞやのヤツでは?
どうなんでしょう。
ソートで質問したことはあるけど、最終的には理解したつもり。。。なんですが・・・
0738732
03/06/02 14:00ID:???正直、質問したときは、どっから手をつけていいか???な状態でしたが、
ついさっきひらめきまして、方法はこんなかんじです。
なんか、想像してたよりかずっと楽にできたので拍子抜けなんですが、
どうなんでしょう?まだ冗長な部分とかありますでしょか?
▼国マスタを開いて、下のように国ごとの名称と順番を取得しておく
$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>";
}
0739nobodyさん
03/06/02 14:33ID:???いや・・・
それでできたなら、それでいいんじゃない?
一言言わせて貰えば・・・
なぜ、二つのリファレンスで管理してるのか・・・
一つで管理してれば、そんな処理せずソートできるのに。
・・・と、この辺は、そちらの都合でそうしてるんだろうし。
これ以上、何も言う事はないかな。
何作ってるか知らんが、適度にがんがれ。
0740名無しさん@お腹いっぱい。
03/06/02 15:39ID:vewE58z20741nobodyさん
03/06/02 15:52ID:NLUHomb+グロブかディレクトリハンドルを使う。
この二つはファイル名とドットファイルの扱いが違う点に注意。
0742名無しさん@お腹いっぱい。
03/06/02 16:19ID:vewE58z20743名無しさん@お腹いっぱい。
03/06/02 19:18ID:vewE58z2検索ではなかなか出てこなくて・・・
0744nobodyさん
03/06/02 19:20ID:???横幅や縦幅を取得するにはどうすればいいのでしょうか?
0745nobodyさん
03/06/02 19:26ID:???mkdirを使う。
ちなみに「フォルダ」じゃ見つかりにくいと思われ。「ディレクトリ」で探そう。
>>744
Perlと無関係。
0747名無しさん@お腹いっぱい。
03/06/02 19:46ID:vewE58z2ありがとーう。
mkdir($Dir, 0777);としても755になっちまいましたが。
作ったディレクトリの中にファイルを作ったり出来たんで上手くいきました。
0748nobodyさん
03/06/02 19:56ID:???で、ページを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を使っている全てのかしょで、
同様の現象が起きています。
いったい、どこを疑えばいいのでしょうか?
0750nobodyさん
03/06/02 20:51ID:???0751nobodyさん
03/06/02 21:09ID:8SqwvWBe0752動画直リン
03/06/02 21:10ID:mGHfwiJV0753預言者
03/06/02 21:33ID:???0755748
03/06/02 22:27ID:???いや、
print "Content-Type: text/html\n\n"; は、すでにこの時点で、
書いてます。(ずっと前の方で)
ただ、sjisとは書いていませんでしたが。
でも、ページ全体が化けるばけでなく、
ページの1部分(パラメータYOU_ARE_HERE 以外の部分)が化けるんですよね。
(で、IEでエンコードをEUCにすると、逆にパラメータYOU_ARE_HEREの部分だけが化ける)
だから、sjisと書いてないこととは別だとは思うのですが・・・
(ただ、今は、開発してた環境(ていうか会社)ではないので、試せてはいないのですが)
それに、今まではsjisと書いてなくても化けてなかったし・・・
0756nobodyさん
03/06/02 22:32ID:???0758nobodyさん
03/06/02 22:51ID:???>>757を補足。
Image::Size モジュールとか、
GDモジュールとか、
Image::Magickモジュールとか、その辺をググれ。
上から順番に簡単。
0759nobodyさん
03/06/02 22:55ID:???念のためにコンテントヘッダーと、<meta>の両方を使って文字コードをsjisにしてみる。
それでもなおわからないのであれば、
1.エディタを疑う。(勝手にEUCにして保存してないか)
2.鯖の設定を疑う。
もう一度確認してみたまい。
7度探してって言うだろ?
0760nobodyさん
03/06/02 23:04ID:9tPqBm3m日本語の部分が文字化けしてることがあるんですが
どうやれば文字化けしないで済みますか?
編集したくてもできなくて困っています。
0761直リン
03/06/02 23:10ID:mGHfwiJV0762nobodyさん
03/06/02 23:10ID:???スレ違い。
EUC-JPなどSHIFT_JIS以外の文字コードにも対応している
テキストエディタ使いなさい。
http://www.vector.co.jp/
0763nobodyさん
03/06/02 23:21ID:9tPqBm3mそこからエディタをDLしたら文字化けが直りました。
ありがとうございました。
0764名無しさん@お腹いっぱい。
03/06/03 01:02ID:0MDIlf0dmkdirによって作成したディレクトリとそれ以下のファイルがFTPアップローダ側からの
削除が出来なくなってしまいました。
tripodで色々と試していたときにもディレクトリが削除できなくなってしまったことがあるのですが、
(FTP側から)何かPERLスクリプトに問題でもあるのでしょうか?
誰か情報お持ちの方教えてください。
0765動画直リン
03/06/03 01:10ID:HzexL3AB0766764
03/06/03 01:20ID:0MDIlf0d報告としてはmkdirのあとに更にchmodをすることで解決するようです。
0768nobodyさん
03/06/03 02:09ID:6112bZiohttp://homepage3.nifty.com/coco-nut/
そしてあぷろだはここ
http://www.k-514.com/imgbbs1/imgboard.cgi
0769748
03/06/03 11:54ID:???(ちなみに秀丸)
一応、もう1回、SJISで明示的に保存したら、うまくいきました。
と、同時に、別のかしょ(テンプレートファイルもまったく別<いじってない)
が、このあと全てなおってました。。。
意味不明です。。。まぁ、なおったからいいんですが・・・
0770nobodyさん
03/06/03 12:09ID:1E21CA310771nobodyさん
03/06/03 13:26ID:8vlIkX7m文字数が偶数個であることは保証されています。
s/(..)/$1 /gで一旦変換後split, hexするのは思いつきましたが、もっとカコイイ書き方はありますか?
0772nobodyさん
03/06/03 13:29ID:???http://www.i-say.net/cgi/tips_listview.php3
0774nobodyさん
03/06/03 14:22ID:???MS-DOS や windows のファイル共有で使う UNC 名(?)を
open や opendir で使うにはどの様な書式でファイル名を
渡せばいいのでしょうか?
$name = '\\\\share_name\\dir\\';
opendir( DIR, $name );
とか、やっても駄目でした。
0776nobodyさん
03/06/03 15:41ID:???無限ループ内でm個になるまでpopするくらしか思いつかない。。
0779776
03/06/03 15:50ID:???ありがとうございます。
splice、すっかり忘れてた。恥かしい限りです。
0780771
03/06/03 17:11ID:???unpack('a2' x (length($str) / 2) , $str);
0781nobodyさん
03/06/03 19:59ID:???というエラーが出てしまいます。
もちろんjcodeはいじってませんし、なお、jcode.plは最新版です
この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか?
どこを直せばいいかまったくわからず・・・
0782nobodyさん
03/06/03 20:07ID:???まず辞書をひく。
0783nobodyさん
03/06/03 20:34ID:PcOC09toえとアクセスしたらIPとそのアクセスした日にち・時間をログに保存するスクリプト教えてください。
お願いします!!ちなみにこれは荒らし対策です
0784781
03/06/03 20:37ID:???エラーが出なくなりました。
>>782 いや、英語はわかるんですけどねー・・・
結局原因がわからなかったものの、解決してしまいました(なんか歯切れが悪いですが)
0785nobodyさん
03/06/03 20:48ID:???スレ違いだがね。
http://www.google.com/search?as_q=%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88&hl=ja&ie=UTF-8&oe=UTF-8&c2coff=1&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%AD%E3%82%B0%E8%A7%A3%E6%9E%90
0786nobodyさん
03/06/03 20:53ID:EuO1wjCe行末に時間記述のあるテキスト xxx.txt を
時間順に修正、上書きすることってできるでしょうか?
xxx.txt
------------------
.... 01-jan-2002
.... 02-jan-2001
.... 01-jan-2001
------------------
↓
------------------
.... 01-jan-2001
.... 02-jan-2001
.... 01-jan-2002
0787nobodyさん
03/06/03 21:10ID:9Ku6+BeZというエラーが出てしまいます。
もちろんjcodeはいじってませんし、なお、jcode.plは最新版です
この場合のデバッグって、どういう姿勢というか考え方で行なえばいいのでしょうか?
どこを直せばいいかまったくわからず・・・
0788nobodyさん
03/06/03 21:28ID:???おまえは本物のアレか?
「読んだけどよくわかりませんでした」
jcode内部にfなんてルーチンねえよボケって意味だろうが。
可能性としては、
1.おまえのjcodeの扱いが変。
マニュアル読みつつ、jcode呼び出してるところを全部チェックする。
2.jcodeのバグ。
製作者に報告。
ま、1を5000回くらいやってから2だと結論するようにな。
0789nobodyさん
03/06/03 21:33ID:???0790nobodyさん
03/06/03 21:48ID:???やり方次第で。
とりあえず思いついたのは、
1.一行取り出して、
2.末尾の時間をコピーし、
3.それをepoch秒に変換し、
4.この秒をキーにしてハッシュに行全体を代入する。
これをファイルが尽きるまで繰り返す。
5.ハッシュからキーを全て取り出し、
6.数値として扱ってソートする。
7.ソート後の順番で値を全部ファイルに出力すれば、完成。
実際のコーディングで難しいのは、3のあたりかもなー。
Dateなんたらモジュール使えば楽にできそうな気もする。
力技で20030603214900みたいな形式に変換しても用は足せるだろうが。
0791786
03/06/03 22:38ID:EuO1wjCeレスありがとうございます。
う〜ん、なんか初心者の私には難しそうですね。
さくっとあきらめようかしら。
0792nobodyさん
03/06/03 22:44ID:I9aep0OWhttp://www1.free-city.net/home/s-rf9/page006.html
0793直リン
03/06/03 23:10ID:HzexL3AB0794nobodyさん
03/06/03 23:15ID:???0796nobodyさん
03/06/03 23:22ID:???ソースを晒してみろ。
バグが出てる部分だけでもいいし、
全部を、どこかのアプローダーに上げてもいいし。
少し、見てやるから。
0797791
03/06/03 23:23ID:???0798796&797
03/06/03 23:24ID:???誤爆2回ですた。
0799nobodyさん
03/06/03 23:52ID:???ちょっと書いてみた。年号・月名(文字変換)・日の順番に並べてからソート。
同じ日のデータが複数行があるとだめぽ。そのときは、改作しる。
%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";
}
0800nobodyさん
03/06/04 02:44ID:???大分類の数字(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";
}
としても
0801800
03/06/04 02:44ID:???HASH(0xbc864)
...
02
HASH(0xcd5c4)
...
03
HASH(0xcd6cc)
...
と、よくわからないものが返ってきてしまいます…
%kind01 = ( "エンピツ" => 100, "消しゴム" => 80 );
としておいて
$i = '01';
while(($name,$price) = each(%kind$i)){ print "$name $price<BR>\n"; }
としてもエラーになってしまいます。
どのようにするのがベターなのでしょうか…
0803800
03/06/04 03:50ID:???ありがとうございます。今モーレツに感動してます(;´Д⊂ヽ
ぐぐって一発目に出てきたページをみて組み直しました。
$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|;
}
たったこれだけで出来るとは・・・すげー(;´Д⊂ヽ
0804800
03/06/04 04:00ID:???考えたやつエライ(;´Д⊂ヽ
興奮が収まらない・・・
0805786
03/06/04 10:33ID:nmL3emss>>799
レス、ありがとうございます。
やっぱり始めたばかりの私には
まだ荷が重いみたい(〃▽〃;)
勉強して出直してきまーす。
0806nobodyさん
03/06/04 10:42ID:???if ($flag) とやるみたいに、
論理値 $HOME[$myhomeid]->{flag} に対して、
if (!$HOME[$myhomeid]->{flag})
としたいのですが、
できない模様です。
どのように表現すればいいのでしょうか?
if ($HOME[$myhomeid]->{flag} == TRUE)
とするしかないですか?
0808nobodyさん
03/06/04 10:53ID:???せっかく作ってやったんだからやってみろよ。
>>799の@mon=...の行は不要だった。消してね。
それとよく見たら、昇順ソートしたいのね。
それなら、{$a <=> $b;}ってとこ、{$b <=> $a;}にすればできるよ。
0811nobodyさん
03/06/04 11:09ID:???ああ・・・なるほど。
それじゃ、俺も同じく・・・
文字列を評価して偽の判定を期待してるに3000カノッサとスパーひとしくん人形を20個。
0812直リン
03/06/04 11:10ID:qArPuVJp0813nobodyさん
03/06/04 13:06ID:tEfKxFs60814nobodyさん
03/06/04 13:15ID:???スレ違い
Perl書くのにどんなエディタ使ってる?
http://pc2.2ch.net/test/read.cgi/php/1014357485/
使いやすいエディタって何よ?
http://pc2.2ch.net/test/read.cgi/php/991372719/
0815_
03/06/04 14:11ID:???0816nobodyさん
03/06/04 15:14ID:???http://pc2.2ch.net/test/read.cgi/php/1049514428/301
これに
> 1、goto文なんか使うな!
って書いてある。
漏れも誰かかにそう言われてずっとそれを守っているのだが、
(つーか、使いたい状況になったことはないが)
何で「使うな」のかと今自分に問いただしても答えが出せない。
ぐぐってみても、C言語でgoto文使う香具師は云々はヒット汁が、
perlでは見当たらない。
だれぞ漏れにgoto文使うなの意味を教えれ!
0818nobodyさん
03/06/04 15:48ID:???昔のN88BASIC(構造なんて考えずに何でもあり言語)のころからの諺。
スパゲティになるから。
0820nobodyさん
03/06/04 15:55ID:QLc9Kvie$cgi->is__error and (独自の終了処理);
とすることができるのですが、HTML::Templateのように
自動的にSTDERRに書き込んで終了してしまう物は
どのように自分のスクリプト側でエラーを捕捉することが
できるのでしょうか。
どうかよろしくお願い致します。
0821nobodyさん
03/06/04 16:37ID:yPvJTG3Fttp://www.google.com/search?hl=ja&ie=Shift_JIS&c2coff=1&q=KCatch&lr=lang_ja
つかってますか
0822nobodyさん
03/06/04 16:52ID:gwvKQAZHhttp://yahooo.s2.x-beat.com/linkvp/linkvp.html
0824動画直リン
03/06/04 17:10ID:qArPuVJp0825動画直リン
03/06/04 17:10ID:qArPuVJp0826_
03/06/04 17:23ID:???0828nobodyさん
03/06/04 18:25ID:???0829nobodyさん
03/06/04 19:38ID:???1の方法で@fileに格納していくということを考えて書いてみたのですが、
正常な値が得られず、2の方法なら正常に得ることができました。
この2つは全く同じ動作と予想していたのですが、1と2では
なにが違うのでしょうか?
1、
@file = map { [ split( /\t/, chomp ) ] } ( <FILE> );
2、
while( <FILE> )
{
chomp;
my @array = split( /\t );
push( @file, \@array );
}
0830nobodyさん
03/06/04 19:52ID:???chompの動作を誤解してる。
chompは引数の末尾に改行があったらそれを削除するが、
同時に削除した改行文字の数を返り値として戻す。
その数字をsplitに渡してるだけなので、望んだような結果にはならないだろう。
0831829
03/06/04 20:32ID:???きちんと理解しないまま今まで使用していました。
以下の様に変更したところ正常にどうさするようになりました。
@file = map { chomp; [ split( /\t/ ) ] } ( <FILE> );
0832室長
03/06/04 22:12ID:???是非ヒントをいただければ幸いであります、、、、
ソース
#!/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;
0833室長
03/06/04 22:15ID:???厨なのは分かってますが、どなたかぜひご教授ねがいますです。。。。。
0834nobodyさん
03/06/04 22:22ID:???あのさ・・・
<b>で停止するって事は、
それ以降で問題が起きてるって事でしょ?
&gethost か、&getip ってルーチンに問題があるんでしょ。
そこを晒しなよ。
それと、ヒアドキュメント使った方がいいぞ。
0835nobodyさん
03/06/04 22:28ID:???お邪魔シマスタ、、、、
0836室長
03/06/04 22:28ID:???0837nobodyさん
03/06/04 22:36ID:???#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print $ENV{'REMOTE_ADDR'};
0838834
03/06/04 22:41ID:???おおぉ?
俺、そんな強い口調っぽい書き込みだった・・・?
俺が分かる範囲で付き合ってあげるから・・・・
逃げるこたぁないだろぉ〜
0840nobodyさん
03/06/04 22:46ID:???つか、>>837が一撃で回答を出してるがな。
>>832 は、どっかのソースをパクってきたんじゃないのか?
んで、そのソースでsub getipとかが宣言されてたんだけど、
そこまではコピらなかったとか。
0841室長
03/06/04 22:50ID:???なんか漏れみたいなザコキャラ相手に申し訳ないです。。。
すみませんが後学のために、一つだけ教えていただければ幸いであります。。。
>>837さんのprint $ENV{'REMOTE_ADDR'}; という部分は何をしているのか教えていただけませんか?、、、
おいらの本の環境変数サンプルにもリモートホストの表示部分には
$host = $ENV{'REMOTE_HOST'};
と書いてあり、IPアドレスの部分は
$trueip = &getip;
と書いてありました。。。
やっぱり$ENVって重要だったのでしょうか、、、、
お手数おかけしますが、是非お願いいたします。。。
>>839さん
全部です。。。。。
0842室長
03/06/04 22:53ID:???パクってきました。。。
見ると最後の方にIPアドレスの判断部分として、
sub getip {
if(〜〜〜
っていうのがあったです
必要だったんですか。。。。
厨房でほんと恥ずかしいです。。。ごめんなさいです。。。
0843834
03/06/04 23:20ID:???たしかに。
でも、>>832のソースでのバグ取りの質問でしょ。
>>841-842
おっかしな事言うヤツだな・・・
環境変数って言葉を知ってて、なぜ%ENVを知らない・・・?
%ENVが環境変数その物なんだが・・・
とにかく、まったく分かってない状態だな。
変に触って、レンタルサーバとかに上げるなよ・・・。
迷惑になるから。
最低、簡単な掲示板くらい作れるようになれ。
話はそれから。
0844室長
03/06/04 23:23ID:???そうだったですか。。。。
もっと勉強してから出直してきますです。
皆さん本当にありがとうございました。感謝です
お邪魔しましたです。。。
0846nobodyさん
03/06/04 23:49ID:???0847nobodyさん
03/06/04 23:55ID: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のときには「\」が必要で、
最後の行では\が不要なのでしょうか・・・?
要不要の違いはどこで判断するのでしょうか?
0848nobodyさん
03/06/04 23:55ID:???0849834
03/06/05 00:00ID:???う〜ん?敷居高い?
俺が初めてPerlで作ったCGIって掲示板だったが・・・
本見ながら、必至で作った。
出来上がった掲示板は・・・
返信機能も、Cookieの機能も、改ページ機能も、
何の機能もない、ただ書き込んだ内容がズラズラ表示される掲示板だった・・・
掲示板と言うか、ゲストブックかな?
そこから、いろんな本買ったり、人のスクリプト読んだりで勉強したけど・・・
掲示板が基本だと思うけどね〜。俺は。
0850834
03/06/05 00:05ID:???> $list{sta_kanji} = "春日部"; #駅名を漢字で
ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
\が必要な時と、必要じゃ無い時は・・・
出力してみろ。
print \$list[0]->{sta_kanji};
print $list[0]->{sta_kanji};
二つの違いを見てみれば分かる。
0851nobodyさん
03/06/05 00:08ID:???まずは他人の掲示板の改造から入るのがいいんじゃないか?
まぁ、大前提としてHTMLをわかってないといけないが。
あ、そうそう。
掲示板の改造とかなら改造スレで質問してね。
0852nobodyさん
03/06/05 00:11ID:???0853nobodyさん
03/06/05 00:15ID:???0854834
03/06/05 00:25ID:O0RMOoYPで、
SCALAR(0x80d55c8)
と出ましたが、わかりません(泣)
スカラー値ということでしょうが、
一体どこのスカラーを差しているのでしょうか?(変な日本語かな)
あと、0x80d55c8っていうのは、なんなんでしょうか?
ググろうかとも思いましたが、そもそもググる単語がわからず。。。
0855847
03/06/05 00:29ID:???あと、
>>850 さん
>> $list{sta_kanji} = "春日部"; #駅名を漢字で
>ここは、$list[0]->{sta_kanji} = "春日部"; の間違いか?
いえ、間違いというか、その直後にpush (@list, \%list);してるので。
(@listと%listがややこしかったですね、すいません)
0856nobodyさん
03/06/05 00:29ID:???掲示板って、作ったあとそのまま使えるし、プログラム的にも簡単な部類だし
おそらく世の中にあるCGIでは最も数が多いだろうから、参考にするコードも多い。
Perlを覚える教材としては一番ふさわしいと思う。
そういう俺も、最初は掲示板の改造→自作→その他のCGI、という流れで覚えた。
>>854
それは変数の内容があるアドレス。そこにスカラー値が入ってる。
ぐぐるなら「デリファレンス」。
(本来はリファレンスなんだけど、それだと無関係なほうがいっぱい引っかかるんで)
0857nobodyさん
03/06/05 00:34ID:???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";
を比べて見やがれ。
0858834
03/06/05 00:41ID:???そっか、みんな改造から入ったのか〜。
プログラム入門がPerlだった俺は、死ぬ思いだった・・・
ちなみに、CGIの基本は掲示板だと俺も思う。
Perl/CGIができるヤツに、掲示板作らせたら一発でレベルが分かる。
>>855
見落とししてた・・・。スマン
ちなみに、答えは>>856が答えてる通りで、
メモリ内の、スカラー値が格納されてる番地を表す。
Cのポインター相当。
0859nobodyさん
03/06/05 00:47ID:???習性が身についてたのね。minibbs見たときはぶっ飛んだよ。
0860nobodyさん
03/06/05 01:34ID:???同意
>>851
改造の方が難しくないか?(改造ってHTMLいじるとかそんなんじゃないよね?)
それに1から順を追って作った方が理解できると思う。
0861nobodyさん
03/06/05 01:41ID:???改造ったって、BBSの入力項目一つ増やすだけだって立派な改造でしょ。
それなら簡単だし、変数とかにも触れて、案外入門としてはいいかもとか思ってる。
tu-ka,俺がそうだった。
1から順を追って作ろうとすると挫ける性格なんだよ。
大体、そういうやり方で覚えられる奴はこんなところで質問しない。
0862nobodyさん
03/06/05 01:44ID:???0863nobodyさん
03/06/05 02:24ID:???>BBSの入力項目一つ増やすだけ
って言ってもCGIの入力・処理・出力を全てやらなきゃいけないから辛いと思うんだがなあ。
1から作る方だと、まず出力、次に入力したやつを出力、最後に入力した奴を処理して出力
と段階を追っていけるから理解が早いのではないかと。
改造の方だと一応改造に成功しても、結局中でどういう処理がされているかが分からないし。
俺はプログラマの講師をやっていた頃があって、その経験からこういう結論になってる。
CGIに関しては数回に渡って100人ぐらいに教えたけど、改造させるより1から作らせる方が飲み込み早かったよ。
まぁ個人差があるから全員がそうというわけではなかったから、このように意見が分かれるんだろうな。
0864nobodyさん
03/06/05 02:33ID:???んー、jcode::convertの内部の動きを見てないので想像だけど、
内部的にデリファレンスされた値を受け取って処理できないんじゃないかな。
jcode::convertに特有の仕様だと思うなぁ。
リファレンスについては、
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_toc.html#TOC86
ここを読むといいかも。(結構難しいけどね)
オライリージャパンから出てる「プログラミングPerl」が手元にあるなら
ひたすら「リファレンスとネストされたデータ構造」の章を読む。
ぐぐるときは「ハードリファレンス」「シンボリックリファレンス」なんて
キーワードを使ってみるといいかも。
0865nobodyさん
03/06/05 02:38ID:???俺は逆に、「人の作ったものの改造」が苦手だ。
(悪い例かもしれないけど)某K○NTのBBSスクリプトとか
拾ってきて、さていじろうと思っても、
どこがどこの処理をしてるのかサパーリわからん。
今にして思えば、変数のスコープがぐちゃぐちゃしてたから
わかりにくかったんだろうけどね。
掲示板で勉強していくなら、「この掲示板と同じものを自分で作ろう」
っていうのが一番いいと思うな。
改ページとか、どうやるんだろうって処理は既存のものを参考にして、
あとは自分の手で書いたほうが結局は理解が早い。
あと、モジュール使うと非常に勉強になるね。
使い方をマスターするために必要な知識がたくさんあるから
結果としてそういうものも身に付いていく。
0866nobodyさん
03/06/05 02:48ID:???基礎(%ENV,QUERY_STRING,PATH_INFO,type="file",etc.)を身に付けるためにも。
結局は外部モジュール使うようになる(し、そうすべきだ)けど、
この辺の遠回りは無駄にはならないと思うし。
>>865は分かってるだろうけど一応。
0867nobodyさん
03/06/05 02:52ID:???プログラマ板のデスマーチ大作フラッシュを見て泣いてくれ。
スレに関係ないのでsage
0868nobodyさん
03/06/05 02:57ID:ECImrkCL全く同感。
俺も最初は他人の物に手加える方が楽かと思ってたが、
あるキッカケで丸ごと自作のを書いたら、そっちの方が
楽だったし、何よりも頭に入った。
おかげで、他人のスクリプト見ても理解する能力も格段に進歩したし。
他人のもんいじるって言うのは、工数自体は少ないから
楽に感じるかもしれないけど、実はあまり足しにならないし、
いつまでたっても初心者になり続ける罠。
0869868
03/06/05 03:00ID:ECImrkCL方が全然疲れるし難しいと思うよ。まーそりゃ予めいじられるのを
前提としたフラグとかある部分に関してはそんなことないけど。
それに単機能の掲示板作るのって全く難易度高くも何ともないと思うんだけど。
それすら酷って言う奴は…
初心者と認められるにはワンライナー限定っすか?
0870_
03/06/05 03:03ID:???0871nobodyさん
03/06/05 03:04ID:???がしかし、クラスやらインスタンス、淫ヘリ箪笥・・・ちーっとも理解できていません(つД`)
movem.l d0-d7/a0-a6,-(sp)
の頃が懐かしい、、、
0872直リン
03/06/05 03:10ID:C/yWLjzO0873nobodyさん
03/06/05 03:10ID:???あぁ、わかります。
フォーム内容のデコードとか画像アップロードする際の
--------- ←こんなのの除去とか、
「プログラミング言語」とは直接関係の無いことかもしれないけど、
知ってると知ってないじゃ全然違うし知ってなきゃいけないことだし。
俺が初めて買った「Perl/CGI入門」系の本も、
ccgi-lib.plとjcode.plを使えと書いてあったけど、
アレを読んでも何が行われているのかは全くわからないな。
「動けばいい、内部構造など知らん」ってのは
プログラマの立場としてはあんまり良くない態度だわなぁ。
0874nobodyさん
03/06/05 07:30ID:UTEewkkCベクターなどで探してもコマンドラインを使って操作するようなアプリしかなかったのですが、
誰でも操作できるようにコマンドラインを使わないで
クライアントアプリを簡単に作る方法はないのでしょうか?
0875nobodyさん
03/06/05 07:52ID:l4KCIFT80876_
03/06/05 09:06ID:???0877動画直リン
03/06/05 09:10ID:C/yWLjzO0879_
03/06/05 12:06ID:???0881_
03/06/05 14:10ID:???0882nobodyさん
03/06/05 15:51ID:62PtIZ8T希望の暗号化文字を引っ張り出すような関数は
誰か作ってないのでしょうか?
0884nobodyさん
03/06/05 16:23ID:uDBKSvvR0885nobodyさん
03/06/05 18:36ID:???そもそも、アルゴリズムは公開されてるんだし…
そもそも、概出だし…
0886nobodyさん
03/06/05 19:03ID:y1a1B1oZ0888nobodyさん
03/06/05 19:21ID:???<input type="text" name="comment" size="30"> //←メッセージ(たんなる例です)
<input type="submit" name="submit" value="送信する">
これで、admin.cgiにデータ送って、
readparseして、
そして、パスワード認証を済まして、実際にログファイルに記述、というCGIをつくりたいのですが、
html→データに書き込み。すると大丈夫なんですが
html→パス認証→データに書き込み。だと
↑ここでフォームのデータが送られないんですが、どうすればいいでしょうか?
0889nobodyさん
03/06/05 19:25ID:???0890nobodyさん
03/06/05 19:34ID:???perlのことはPerlスレじゃないの?
0891nobodyさん
03/06/05 19:37ID:???0892nobodyさん
03/06/05 19:37ID:???そもそも>888はたまたまPerlを使ってるのかもしれないが、その質問自体は、
Perlに限られた話じゃないから、CGIスレ向けということ。
0893nobodyさん
03/06/05 19:37ID:???0894nobodyさん
03/06/05 19:40ID:???いかんだろう。
アルゴリズムまで許容するとなれば、>>888のような質問もアリでは。
0895nobodyさん
03/06/05 19:44ID:Dbz7wb1chttp://endou.kir.jp/betu/linkvp/linkvp.html
http://angelers.free-city.net/page003.html
0896nobodyさん
03/06/05 19:46ID:???えぇと、ソースといわれると、300行以上ありまして、
ファイルの作成、編集などのツールです。(ログファイルにというのは、簡単なたとえのつもりです。
要するにフォームのデータをパスワード画面を通して(1回余分な部分を通過して)送るにはどうすれば?ということが聞きたかったんです。)
できあがってるんですが、それにパスワードをつけないと危ないので、つけようとおもっているんです。
とりあえず、新規作成の時のhtmlのソースと、
作成のときのcgiのところをさらしますね。
パスワードとかはまったく手をつけてないじょうたいです。
0897nobodyさん
03/06/05 19:47ID:???<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>
0898nobodyさん
03/06/05 19:48ID:???888を見ただけじゃ、readparseって文字見て
恐らくPerlかな、としか分からないだろ。
Rubyかもしれないじゃないか。
ところで、パス認証って、CGIの中でやるやつか?
それともサーバ自体の機能かな?
0900nobodyさん
03/06/05 19:50ID:???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";
}}}
0901nobodyさん
03/06/05 19:55ID:???&uwagai_fileは上書き時のメッセージです。
&uwagaki_fileには、open(FILE >$nameなども入っていて、上書きしし、「上書きしました」というメッセージを出す、サブルーチンです。
>>899
えぇと、htmlは省略してしまいましたが、
ファイル、ディレクトリのラジオボタン
新規作成、削除、編集、コピー、属性変更のラジオボタンがり、すべてできるようになっています。
(cgiでhtmlを出力していますが・・)
ですので、submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
0903nobodyさん
03/06/05 19:57ID:???なんでsubmitボタンを押してから入力させたいの?
一緒に入力させればいいのに・・・・
ちなみに最初の画面で入力したものをパスワード入力画面では隠しフィールドにでもすればOK
Perlとなんの関係もないね・・・
0904nobodyさん
03/06/05 20:00ID:???> submitボタンを押した後に、パスワードの入力をもとめる、ってことがしたいのです。。。
一度クライアントにフォームデータを全部hiddenで返して、再度passとともにcgiに送るしかないのでは?
0905nobodyさん
03/06/05 20:01ID:???これって、入力画面では、>>897のが送られた場合、
&ReadParse(*in);
$name = "$in{'name'}";
$body = "$in{'body'}";
<input type="hidden" name="name" value="$name">
ってことでしょうか?
0906nobodyさん
03/06/05 20:01ID:???0907nobodyさん
03/06/05 20:02ID:???やっぱりhiddenで送るしかないんですね。。。
>>903さんのおっしゃるとおりパスワードを一緒に入力させればいい話でしたね。。。
0908nobodyさん
03/06/05 20:03ID:???俺フォームメールでこれやって挫折したような覚えがあります。。
ここの住人の方が言ってくれるからにはできるんでしょう。
がんばってみます。。。
でも、一緒に入力するほうが、使用する側としても気分がいいですよね・
0909nobodyさん
03/06/05 20:08ID:???0910nobodyさん
03/06/05 20:09ID:???0911nobodyさん
03/06/05 20:24ID:???0912nobodyさん
03/06/05 20:31ID:???0913nobodyさん
03/06/05 22:10ID:mI0dWPG1aとbという名前のティレクトリを子に持つディレクトリ内で
@dir = grep { -d } readdir( DIR );
とすると . と .. が入り
@dir = readdir( DIR );
とすると . と .. と a と b が入り、ディレクトリである a や b に
大して偽を返してしまうのですがなぜ a や bで-dは偽を返してくるのでしょうか?
0914nobodyさん
03/06/05 22:11ID:???0915_
03/06/05 22:17ID:???0917nobodyさん
03/06/06 05:22ID:???おそらく、readdir() で読み込んでるディレクトリと、-d した時点で参照してるディレクトリ
(カレントディレクトリ)が異なってるせいかと。
-d のときにフルパスでチェックするようにしてみては。
0918nobodyさん
03/06/06 16:56ID:???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;} ///←ここは作成途中なのであしからず
};
0919918
03/06/06 17:00ID:???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出力の重複を避けるにはどうしたらいいですか?
0921nobodyさん
03/06/06 20:43ID:???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>
とする。
0922nobodyさん
03/06/06 20:44ID:???#!/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;
0923nobodyさん
03/06/06 20:51ID:???method が GET のときは、921 を出力して終了。
method が POST のときは、922 を実行して終了。
になるように振り分ける。
・・・など。
0924nobodyさん
03/06/06 21:26ID:???うざいからCGIのスレ逝けよ
0925nobodyさん
03/06/06 21:38ID:???0926nobodyさん
03/06/06 22:17ID:???・まず、ほとんど同じコードを二度も三度も書くのはばかばかしいと思うようになろう。
・まとめられる部分はまとめるようにしよう。
・printとprintの間に他のコードが入っても、一向に問題にならない。
・content-typeは、そのCGIが最初に吐き出す文章であることが重要。二度も吐き出す必要はない。
てかさ。Perlとか云々以前にプログラミングそのものがわかってないような。
0927nobodyさん
03/06/06 23:10ID:???テキストエリアにからのフォームデータ
$bodyを(もちろんReadParseして)
$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
で、CR+LF→LFにならないんでしょうか?
実行するとこの行がエラーになるんですが・・・
0929nobodyさん
03/06/06 23:23ID:???「エラーになるんですが・・・」じゃねーよバカ
エラー出てるんなら貼れ&>>1を100回声に出して読め。
$body =~ s/(.*)\x0D\x0A$/(.*)\x0A$/g;
↓
$body =~ s/(.*)\x0D\x0A$/$1\x0A$/g;
↓
$body =~ s/\x0D\x0A$/\x0A$/g;
0930nobodyさん
03/06/06 23:24ID:???$body =~ s/\x0D\x0A$/\x0A$/;
0932nobodyさん
03/06/06 23:30ID:???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.
0933nobodyさん
03/06/06 23:34ID:???了解
>>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/;
0937936
03/06/06 23:55ID:???これですんなりできたけどこれっていいの?
0938nobodyさん
03/06/06 23:55ID:???お前報告の仕方悪い。
エラーが出なくなったことをまず報告してから、その上で期待する結果が得られなかったと言いなさい。
で、改行コードを変換して、どこに出力しようとしてるのかな?
まさかSTDOUTに出力して、IEでソース見てたりしないよな?
0940936
03/06/06 23:59ID:???\x0D\x0A=\r\n
\x0D=\r
\x0A=\n
だね。。。。
マッチさせるときも、置き換え後も、
16進数のほうがいいんでしょうか?
>>938
>で、改行コードを変換して、どこに出力しようとしてるのかな?
>まさかSTDOUTに出力して、IEでソース見てたりしないよな?
ファイルに保存するツールなんです。
改行コードを書き換えてファイルに保存する、というところでひっかかってました
0941936
03/06/07 00:00ID:???ファイルの行頭を抜き取って
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
else{$code = "";}
とやってます。
0942nobodyさん
03/06/07 00:00ID:???あと「エラーがでます」「だめでした」などの曖昧な表現はやめよう。
「どういうエラーが出るのか」「どのようにだめだったのか」を必ず書くようにね。
0943nobodyさん
03/06/07 00:01ID:???> ごめん、普通に考えれば
> \x0D\x0A=\r\n
> \x0D=\r
> \x0A=\n
> だね。。。。
違う。\nはOSによって変わる。
\n = \x0D\x0A DOS,Win
\n = \x0D Mac
\n = \x0A etc.
0946nobodyさん
03/06/07 00:06ID:???#!/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)
になったぞ。
0947936
03/06/07 00:10ID:???わざわざつくっていただきありがとうございます。でも完成しました。。
ところで、友達も「改行コードはバイナリモードで解決した」
といってましたが、なぜバイナリモードで読むのでしょうか?
私が作ったのはバイナリにしないでも改行コード変換できましたよ?
0949936
03/06/07 00:12ID:???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);
これでできたんですが、、、どうなんでしょうか
0951nobodyさん
03/06/07 01:43ID:Y8iN/hYFrequire './data/data_1.cgi';
ひとつだけ呼び出すのは↑こんな感じになってました
data_1.cgiとdata_2.cgiのふたつを呼び出したいです
0952nobodyさん
03/06/07 01:45ID:???require './data/data_1.cgi';
require './data/data_2.cgi';
>>951の質問はこれにて終了しました。
↓次の方どうぞ
0953936
03/06/07 02:27ID:???ファイルの内容を
while( <FILE> ){print;}でテキストエリアに渡した場合は、Windows改行になるのでしょうか?
0954nobodyさん
03/06/07 02:34ID:???0957936
03/06/07 02:54ID:???そうですか。。。
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だと思ったんだけど、意外だ・・・・
0958nobodyさん
03/06/07 06:18ID:???そのファイルがどの環境で作られたのかによるんじゃない?
Windows環境で書いたファイルであれば、どこに持っていこうがCRLFのまま。
これをUNIX系環境で1行読み込んだ場合、LFの前のCRは「文字列の一部」として
そのまま読み込まれるだけだと思うんだが。
なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
自動的にLF改行になるとか、そんな感じに勘違いしてない?
それと、あなたの実行環境ってローカルで動かしてるサーバーだよね?
間違ってもレンタルサーバーとかプロバイダスペースじゃないよね?
なんか会話が噛みあってないから。
0959nobodyさん
03/06/07 11:48ID:???掲示板で(^-^)などの顔文字があればそれを画像にすりかえるために
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などにしてみると置換されました。
特殊な文字だから置換がうまくいかないのでしょうか?
どうすれば解決できるか教えてください、お願いします。
0960936
03/06/07 12:00ID:???>なんか、読み込んだ時点で自動的に変換されるとか、1行書き込むとUNIX環境では
>自動的にLF改行になるとか、そんな感じに勘違いしてない?
へ?ぜんぜん思ってませんよ。。。
0961936
03/06/07 12:05ID:???えと、つまり
Windows環境で、テキストエリアに入力した文字をcgiに送って
$body =~ s/\x0D\x0A$/\x0A/;
こうしても、LFにならないってことでしょうか?
0962nobodyさん
03/06/07 12:36ID:???顔文字が正規表現のメタ文字として解釈されているんでない?
顔文字のメタ文字を\でエスケープするか、もし面倒ならquotemetaであらかじめ
変換しておくとか。(\Q \Eって使えたかな…どなたか助言求む)
できればソースを書きたいんだけど、いま手元に実行環境がないんで勘弁して。
0963nobodyさん
03/06/07 12:51ID:???いい加減うぜぇ。2ちゃんは学校じゃねぇ。
質問等はまとめて話せ。少しは自分で調べて話せ。
>こうしても、LFにならないってことでしょうか?
やってみろバカ。プログラムに実験はつきものだ。
0964936
03/06/07 13:05ID:???やってみました。
if($file =~ /(.*)\x0D\x0A$/){$code = "CR+LF (Win)";}
elsif($file =~ /(.*)\x0A$/){$code = "LF (UNIX)";}
elsif($file =~ /(.*)\x0D$/){$code = "CR (Mac)";}
こいつで正確に改行コードがえられるのかだけ教えてくれませんか?
0966nobodyさん
03/06/07 13:12ID:???0968nobodyさん
03/06/07 14:02ID:mCmiN6Nzぃゃ、チェックできるのかを質問してるのに
チェックしかできないって怒られても……
0969965
03/06/07 14:03ID:???すまん。
>改行コードがえられるのかだけ
が
>改行コードかえられるのかだけ
に見えてた。
末尾の改行に関してはそれでいける。
でも>>966の言うようにやってみれば分かるだろ。
CR+LF,LF,CRなファイルを用意してやってみればいいんだから。
0970nobodyさん
03/06/07 14:21ID:mCmiN6Nzif($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になるんでしょうか?
0971_
03/06/07 14:21ID:???0972970
03/06/07 14:27ID:mCmiN6Nzさっきの/sは/gの間違いでした。
で、/gなんですけど、試したところ複数行の文字は/gがないとコードが変わりませんでした。
たぶん/gを省いてくれた人はチェック時のことをいってくれてたんですね。
0973名無し募集中。。。
03/06/07 14:53ID:???和鳥でこれが使えないのでデリったら書き込みができなくなった
なんか方法はありまつか?
0974nobodyさん
03/06/07 15:11ID:???お前頼むからスレタイよく読んでから書き込んでくれ。
http://up.2chan.net/d/src/1054780479575.jpg
0975nobodyさん
03/06/07 15:40ID:???>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になるんでしょうか?
意味が分かりません。
正規表現の$の意味は?
0976nobodyさん
03/06/07 17:37ID:???UNIXでCRがどういう意味を持ってるかってこと。
0977936
03/06/07 17:37ID:???>>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がなくなっているので・・・
0978936
03/06/07 17:38ID:???これは無視しちゃってください。
ファイル一覧取得するスクリプトの一部分で、
こいつで、ディレクトリ以外の改行コードの取得ってことです。。
すいません。
0979936
03/06/07 17:42ID:???CR改行の件ですが、ローカルではできたのにレン鯖ではできなかったんです。
で、ただたんにスクリプトを更新していなかっただけでした。すいません。
0980nobodyさん
03/06/07 17:59ID:???0982nobodyさん
03/06/07 19:13ID:???どうやってできなかったのかな?うちでは両方できたけど。
%list = (
'(^-^)', 'kao1.gif',
'(T-T)', 'kao2.gif',
);
$msg =~ s/\Q$_\E/$list{$_}/g for(keys %list);
0983967
03/06/07 19:58ID:???あぁ・・・書き忘れてました。\Qと\Eのは書き方はわからなかったのです。
たぶんquotemetaの書き方も間違っていたんだと思いますけど。
できました。教えていただいてありがとうございました。
0984nobodyさん
03/06/07 20:10ID:???何層も下の場合でも使えるの・・
0985nobodyさん
03/06/07 21:10ID:???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
0987nobodyさん
03/06/07 22:01ID:???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
0988nobodyさん
03/06/07 22:05ID:???誰か教えてください。
0992nobodyさん
03/06/07 22:13ID:???違う。
>>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は氏ねってこった。
0993nobodyさん
03/06/07 22:13ID:UHTFNtX1どうやればよいのでしょうか。
調べてもこれといったものが見つからなかったため、教えていただき
たい次第です。
0994nobodyさん
03/06/07 22:14ID:???・・・あんまり回答になってなかった。
「聞く前に試してみろ」と言いたいのではなく、「聞き返す前に読め」といいたい。
せっかく答え返ってきてるのに、何のために聞き返すのかサパーリ。まあ>>986は氏ねってこった。
0995nobodyさん
03/06/07 22:18ID:???0998nobodyさん
03/06/07 22:21ID:???0999nobodyさん
03/06/07 22:22ID:???1000nobodyさん
03/06/07 22:22ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。