Perl 初心者コーナー Part23
■ このスレッドは過去ログ倉庫に格納されています
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
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に記述する、、、ということでしょうか?
ぜんぜんわかりません、ごめんなさい。
もう少しわかりやすくお願いできますか?
■ このスレッドは過去ログ倉庫に格納されています