Perl コーディング初心者質問コーナー Part36
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0002nobodyさん
04/07/14 13:24ID:???【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc2.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ)
http://pc2.2ch.net/test/read.cgi/php/1076831972/
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1078568723/
【Perl】ファイルロック(排他処理)について語ろう
http://pc2.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc2.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc2.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc2.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
0003nobodyさん
04/07/14 13:24ID:???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
0004nobodyさん
04/07/14 13:25ID:???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/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/ (前スレ)
0005nobodyさん
04/07/14 13:25ID:???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
[総合]
・http://www.excite.co.jp/world/ # 英文のページ多いから一応
・Perl Com: http://www.perl.com/
・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/
0006nobodyさん
04/07/14 13:26ID:???[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/
[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/
[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
0007nobodyさん
04/07/14 13:26ID:???コーディング 【coding】
プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
0008nobodyさん
04/07/14 14:05ID:???0009nobodyさん
04/07/14 14:17ID:q0q7Chkluse CGI;を使うか、
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});で自分でデータを分解するか
だと思いますが、それぞれのメリットとデメリットを教えてください。
0010nobodyさん
04/07/14 14:28ID:???0011nobodyさん
04/07/14 14:45ID:???0012nobodyさん
04/07/14 23:00ID:fRIUupctEZwebの一部の機種で「キャッシュ」が起きてしまいます。
methodはGETにしています。
postだと回避できるのですが、都合によりgetは使えません。
ちなみに
<meta http-equiv="Cache-Control" content="no-cache">
は効きませんでした。
お願いします。
0017nobodyさん
04/07/15 01:27ID:???全くどういうものなのか分かりません。取り敢えず分かりやすく説明しているサイトなど御座いませんでしょうか?
どういうものかが見当付かないため調べる方法も思いつきません。
ググったら「ライブラリー」とか言うのが出てきたんですけど意味がわかんないです。
リファレンスサイトとかありましたらお教えくださいませんでしょうか?
宜しくお願いいたします。
0021nobodyさん
04/07/15 14:16ID:???不正のある行数を配列に格納する部分まではできるのですが、それの表示方法で質問です。
@err_lineの中身が("1","3","5")だとした場合、「1,3,5行目の書式が不正です」と表示するエラー画面を出したいのですが、
foreach(@err_line){
print $_ , ",";
}
print "行目の書式が不正です"
とすると、「1,3,5,行目の〜」となり、配列の最後の文字を出力した後にも","(カンマ)が出力されてしまいます。
何か良い書き方はないでしょうか。
0025nobodyさん
04/07/15 14:51ID:???0027nobodyさん
04/07/15 14:58ID:???なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。
mod_perl なら Apache::* モジュールでなんかそういうのがあるかも。
0028nobodyさん
04/07/15 16:43ID:???なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。
KENT なら CGIでなんかそういうのがあるかも。
0029nobodyさん
04/07/15 18:20ID:???まじめに考えてみると難しいな
単純に頭に DocumentRoot をつけるだけなら楽だが
mod_rewrite とか使われた日には目も当てられない
mod_perl の環境に限定だが、サブリクエストを使って
$filename = Apache->request->lookup_uri($uri)->filename;
とかやれば、ほとんどの場合は変換できるんじゃないかと思う
Reverse Proxy だったりした場合には何が起きるか保証できないが
0030nobodyさん
04/07/15 18:50ID:???PerlってASPやJavaみたいにアプリケーションサーバ込みで考える開発環境じゃないんだよね。
だから関数で実現するんじゃなくって、別のソリューションを見つけるべきだね。
003125
04/07/15 18:54ID:???コピペして保存させていただきます!
0032nobodyさん
04/07/15 23:15ID:???以下のようなコードを書きました。
$total = (split(/,/,$a) * 3)+(split(/,/,$b) * 2)+(split(/,/,$c) * 1);
で、perl -cw すると以下のような警告が出てしまいます。
Use of implicit split to @_ is deprecated at test.pl line xx
どうすればこの警告が出ないようになるのでしょうか?
0033nobodyさん
04/07/15 23:25ID:???0034nobodyさん
04/07/15 23:36ID:???@a = split(/,/, $a);
@b = split(/,/, $b);
@c = split(/,/, $c);
$total = (@a * 3) + (@b * 2) + (@c * 1);
# クドいな(汗)。
明示的に配列に突っ込んだりすると出なくなる仕組み。
0035nobodyさん
04/07/15 23:45ID:???>>33
> scalar(split(/,/,$x))
これをやってみましたが、同じエラーが出ました...
やっぱり地道に
>>32
のようにするしかないのですかね。
0037nobodyさん
04/07/15 23:56ID:???splitの結果何が返って来るのかね?んー?
003834
04/07/16 00:05ID:???最近、perl.exeを入れてみたところ。
C:\Documents and Settings\hoge>perl -cw %home%\test2.pl
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
C:\home\hoge\test2.pl syntax OK
# 元コードの、split() が @_ に implicit に代入されてるとこが line 5。
こんな感じです。>>37
0039≠37
04/07/16 03:30ID:???> splitの結果何が返って来るのかね?んー?
は試してみた?
>要素の「数」でポイントを出したくて
ということなら、
my $a = ("fred","wilma","barney");
my $b = ("hoge","hogehoge");
my $c = ("2","6","8","9");
print split/,/,$a;
print split/,/,$b;
print split/,/,$c;
my @a = ("fred","wilma","barney");
my @b = ("hoge","hogehoge");
my @c = ("2","6","8","9");
print split/,/,@a;
print split/,/,@b;
print split/,/,@c;
上の二つ比べてみ。
0040nobodyさん
04/07/16 03:53ID:???問題を読み違えているぞ。
$a = 'fred,wilma,barney';
$aa = split(/,/, $a);
print $aa;
splitをスカラで受けた場合に
「Use of implicit split to @_ is deprecated」警告が出るという話。
0041nobodyさん
04/07/16 04:08ID:???>splitの結果何が返って来るのかね?んー?
もしかしてsplitをスカラで受けた結果何が返ってくるか知らないのかね?んー?
004234 != 32
04/07/16 04:35ID:???質問者さんの「$a,$b,$cの中でカンマに区切られている要素の数」を、
my $a = "fred,wilma,barney"; # これを「カンマに区切られている要素」と呼んでるのかな、と。
my $b = "hoge,hogehoge";
my $c = "2,6,8,9";
print scalar(split(/,/,$a));
print scalar(split(/,/,$b));
print scalar(split(/,/,$c));
こういうのを想定して>>34を書きました。>>22を書いたのも自分なので、その記憶もあり。
>>39は、
ex1. 'barneyhogehoge9' # 最終の要素。手前のsplitがなくても、同じ結果に。
ex2. '324' # 要素の「数」。
という出力になりました。
あっ、>>37さんの「splitの結果何が返って来るのかね?」は、
>>32だと $total = 1 * 3 + 1 * 2 + 1 * 1 で固定やぞ、ということなんでしょうか?>>39さん
質問者じゃないのに、何を混乱してるんだろう(泣)。
004334
04/07/16 04:40ID:???元質を見て想定してたのは>>40さんと同じ。
>>37さん、>>39さんのお話の意図がつかめなくて
マゴマゴしてしまいました(汗)。
004534
04/07/16 05:07ID:???ありがとうございます。元々、>>40さん、>>44さんと同じように考えてたはずが、
>>39を見て「俺、何かとんでもない勘違いしてたんだろうか?」と不安になってました。
# 慌てて書いたので>>42のコードだと…同じ警告を吐くような。
とりあえず、頭冷やします。
0046nobodyさん
04/07/16 08:41ID:???警告メッセージは、@_ への暗黙な代入を警告しているだけだから
警告が特に問題ないとわかっている場合は、
オプションを切ってもいいんじゃない?
{ no warnings;
$count = split(/,/,$a) * 3 + split(/,/,$b) * 2 + split(/,/,$c);
}
no warningを使う場合は、必ずブロックで局所化する事と、
警告オプションを切ったブロックないで
組み込み関数以外の他のサブルーチンの使用に注意する。
明示的に配列に代入する でも回避できるみたい。
3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
0047nobodyさん
04/07/16 09:12ID:???my $b = 'hoge,fuga'; # 2 * 2
my $c = '1,2,3,4,5,6,7'; # 1 * 7
my $total = (1 + $a =~ tr/,//) * 3
+ (1 + $b =~ tr/,//) * 2
+ (1 + $c =~ tr/,//)
; # 20
0051nobodyさん
04/07/16 13:52ID:???こういう事を言いたいのかな?
#--- test1.p ---
my @str = ('1,,,,', ',,,,1', ',,1,,', '');
print 0 + @{[split /,/]} for @str; # 1530
print "\n";
print 1 + tr/,// for @str; # 5551
print "\n";
print 0 + (length && 1 + tr/,//) for @str; # 5550
#--- test2.p ---
use Benchmark;
our @str = ('foo,bar,baz', 'hoge,fuga,' x 5, ',,,,1', ',,1,,', '1,,,,', '');
timethese(-5, {
split => sub { my $n = @{[split /,/]} for @str },
tr => sub { my $n = 1 + tr/,// for @str },
length => sub { my $n = length && 1 + tr/,// for @str },
});
005232
04/07/16 15:17ID:???みなさんありがとうございます。勉強になりました。
>>46 さんの
> 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
>>47 さんの
my $total = (1 + $a =~ tr/,//) * 3
+ (1 + $b =~ tr/,//) * 2
+ (1 + $c =~ tr/,//)
; # 20
あたりが良さそうですね。ちょっと今から試してみます。
>>47 は、コード読んでもなんでそうなるのかよくわからない...
0053nobodyさん
04/07/16 16:35ID:???http://flex.ee.uec.ac.jp/texi/perl/perl_103.html
005532
04/07/16 17:04ID:???> 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
これやってみましたが、同じエラーがでました。???
これからtrの方を試してみます。
0057nobodyさん
04/07/16 19:49ID:???0058nobodyさん
04/07/16 19:56ID:wqtiPvAW0059nobodyさん
04/07/16 20:04ID:???フォローthx you, なるほど @{[split/,/,$a]} でもいいのか。
詳細を書くと、
'' を要素数0とカウントするか空文字1要素とカウントするか、という事ですが
他にも 'a,b,c' と 'a,b,c,' の様な場合、数え方で結果がかわってきます。
shiftでは末尾の空要素はなくなるが、tr, lengthの方法だとカウントされる。
一見同じ様に見えても、細部で微妙に仕様が変わってくるので注意しようってとです。
use strict;
use warnings;
my $a = '';
my $b = 'a,b,c';
my $c = '1,2,3,4,5,6,';
sub count_item_1($) { return int @{[split/,/,$_[0]]} }
sub count_item_2($) { return int 1 + $_[0] =~ tr/,// }
sub count_item_3($) { return int length $_[0] && 1 + $_[0] =~ tr/,// }
sub count(&) {
my($func) = @_;
printf("%d %d %d\n", $func->($a), $func->($b), $func->($c));
}
count(\&count_item_1); # 0 3 6
count(\&count_item_2); # 1 3 7
count(\&count_item_3); # 0 3 7
>>56
自分の環境(perl 5.6.1, perl 5.8.2 build for linux)ではこの方法で警告消えたのだけど、どうしてだろ。
0060nobodyさん
04/07/17 12:40ID:???あったはずなんだけどご存知ないでしょうか??
0061名無しさん
04/07/17 14:06ID:BYFAIbz8他のセッションに影響しないように注意するけど、Perlはそういう心配しなくていいの?
0063名無しさん
04/07/17 14:44ID:BYFAIbz80064nobodyさん
04/07/17 14:57ID:???利用するフレームワーク (CGI、mod_perl、FastCGI、
SpeedyCGI、PerlScript etc. etc.) に依る。
0065名無しさん
04/07/17 15:43ID:BYFAIbz80066nobodyさん
04/07/17 19:32ID:???セッションサービスの仕様はそのクラスによる。
つーか、Perlには標準でセッション関数はない。だから、自分で書くなり、そういうモジュールを探してくる。
0067nobodyさん
04/07/17 20:54ID:ihUsGdG4と入力されたデータを受け取って
$a="aaa";
$b="bbb";
という二つのデータに分けたいんだけど
$id(入力されたデータ)=~s/$1\/$2/$1$2/i;
$a="$1";
$b="$2";
とやってもうまく行かない
悪い点があったら教えて下さい
0072nobodyさん
04/07/18 05:14ID:???1〜1000の各数字が、5・6・7・8・9の5種のうちのどれかを所持しております。
所持するものの違いにより
1〜1000の数字をそれぞれ5つの配列に、分けるにはどうすればいいのでしょうか?
ずーーーーっと考えてるんですが、限界なので質問させてください。
0073nobodyさん
04/07/18 05:58ID:???0075nobodyさん
04/07/18 07:57ID:???ここがよくわからん
0076nobodyさん
04/07/18 08:34ID:???0077nobodyさん
04/07/18 09:59ID:???data[1〜1000] にそれぞれ5〜9の値が入っていて、
その値に応じて新しい配列(5個)を生成したい、
ってことだと思う。
>>74のいうようにpushとifでできるやぁね
0078nobodyさん
04/07/18 11:04ID:???0079nobodyさん
04/07/18 12:02ID:???効率なんて考えていないので添削キボンヌm(_ _)m
# 5,6,7,8,9 の数字が 1000 個入っている配列(リスト)
# 仮に rand を使って生成。
my @Source_array = map { ((5..9)[int rand 5]) } 1 .. 1000;
# を、それぞれ値 (5 〜 9) によって選別したい。
# でも 5 つも配列を作るのは、のちのちややこしくなるので、ここは 1 つの配列に格納して、
# それぞれを呼び出しやすくする。(リストリファレンスが 5 つ入っているハシュにする)
my %Dist_hash;
push @{$Dist_hash{$Source_array[$_]}}, $_ foreach 0 .. $#Source_array;
# 呼び出し方。
# 値が 7 の @Source_array の添え字を表示する。
my $value = 7; # 範囲は 5 から 9 の間で指定しる。
printf qq|\$Source_array[%s]\n|, join(', ', @{$Dist_hash{$value}});
# 実際に @Source_array の値を表示してみる。
printf qq|\$Source_array[%d] = %d\n|, $_, $Source_array[$_] foreach (@{$Dist_hash{$value}});
008072
04/07/18 14:14ID:???意図してたのはまさに77氏の言うとおりです。
79さんどうも!思ってたことができました。こんなの自分で考え付けるようになりたい。
ありがとうございました。
0081nobodyさん
04/07/18 22:22ID:LXS4mDIw@bb = qw[1 2 3];
$cc = "cc";
&hoge($aa,@bb,$cc);
sub hoge($,@,$){
my $aa = shift;
my @bb = shift;
my $cc = shift;
print "$aa \n";
print "$_\n" foreach(@bb);
print "$cc\n";
}
関数に変数と配列を渡し、関数側でそれぞれ上記のように
スカラ変数と配列を区別させて認識させたいのですが
どのようにすれば良いのでしょうか?
よろしくお願いします。
0082nobodyさん
04/07/18 22:25ID:???リファレンス使え。
0083nobodyさん
04/07/18 22:29ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Pass_by_Reference
008481
04/07/18 22:30ID:???もし使わずに実現できる方法があれば教えてほしいです。
0085nobodyさん
04/07/18 22:34ID:???動かしたいと考えています。perlを使ったCGIで
ルートユーザかしか使えないコマンドを
入力する方法はないでしょうか?
今、自分が作っているCGIの前に人が作った
認証を通す必要があり、ユーザは自分が指定した
一般ユーザでログインしているという形になります。
通常のコマンドであればシングルコーティションで
囲えばよいことがわかっているのですが、当たり前
ながら一般ユーザではroot専用のコマンドは
入力できません。
方法がありましたら、教えてください
0086nobodyさん
04/07/18 22:51ID:???0087nobodyさん
04/07/18 22:55ID:???配列が一番後ろなら出来る。
が、リファレンスを使った方が問題が起こりにくい。
リファレンスを使わずにやるなら、複雑な方法になるか、問題の起こりやすい方法になるかどっちかだ。
0088黒死犬 ◆EgxBlf8nvc
04/07/18 23:00ID:???Perl5.8以上なら
sub hogging($\[@]$) {
my $top = shift;
my @middle = @{+shift};
my $bottom = shift;
print("top = [$top]");
print("middle = [@{[join(',',@middle)]}]");
print("bottom = [$bottom]");
}
my @unko = (A..Z);
test("Test Start", @unko, "Test End");
これで出来ますよ
0089黒死犬 ◆EgxBlf8nvc
04/07/18 23:02ID:???s/test/hogging/;
0090nobodyさん
04/07/18 23:51ID:???プロトタイプ宣言は 5.002 から利用可能だが。
sub test($\@$) {
my $top = shift;
my @middle = @{+shift};
my $bottom = shift;
...
0091nobodyさん
04/07/19 00:02ID:???hoge($aa,@bb,$cc,@dd) みたく配列が二つ以上ある場合でもできたりします?
0092nobodyさん
04/07/19 00:08ID:???確認ぐらい人に聞かなくてもできるでしょ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Prototypes
0094黒死犬 ◆EgxBlf8nvc
04/07/19 13:14ID:???そうなんですか
自分が情報を得ているところでは、[Perl5.8の新機能]となっていた為、誤解をしてしまった様です
ご指摘有難うございます
0095nobodyさん
04/07/19 16:08ID:???0096nobodyさん
04/07/19 21:58ID:54seOava上手く書き込めません。
同じ行に表示されるようにしたいんですが、次の行に改行されてしまいます。
上手く、一つのセルに改行したデータを入れたいんですが、どうすればよいでしょうか?
コードは、下のようなのを使っているのですが・・・・
根本的に間違ってたりするんでしょうか?
$aaa = '123';
$bbb = '456';
@ccc = '789',
'0123';
open(LOGFILE,">>log.csv");
$LOG = "$aaa,$bbb,@ccc";
print LOGFILE $LOG;
close LOGFILE;
0097nobodyさん
04/07/19 22:13ID:???Excelで表示する時の話?セルっつーのが何のことやら。
特定のアプリでの表示の話なら、
逆にそのアプリで改行して保存したものを覗いてみれば分かると思われ。
0098nobodyさん
04/07/19 22:27ID:54seOavaExcelで開いた場合です。説明不足ですみません。
メモ帳で開くと、改行のコードの問題みたいです。
改行コードの変換は
$ccc =~ s/\n/\r/g;
で良いんでしょうか?
0099nobodyさん
04/07/19 22:32ID:OSilZxWFperlコーディングには関係ないが
CSV形式では普通セル内に改行やカンマがあるときは「"」で囲うよ。
で「"」内では「"」を「""」で表現する
それからエクセルではセル内の改行は\r\nではなくて\n
0100nobodyさん
04/07/19 23:24ID:54seOavaエクセル内の改行は\nなんでしょうか?
とすると、
$ccc =~ s/?/\n/g;
「?」の部分には何を入れればよいのでしょう?
上記のように、s/\n/\r/g; として書き込んだファイルを
メモ帳で開くと、見た目はUNIX改行コードっぽくなっているのですが、
エクセルで開くと、セル内改行が出来ていないようです・・・
0101nobodyさん
04/07/19 23:56ID:???1 │3 │4
2 │ │
─┼─┼─
5 │6 │7
│ │8
↓
"1\n2",3,4\r\n5,6,"7\n8"\r\n
あとメモ帳じゃなくてバイナリエディタ使ってみな。
0102nobodyさん
04/07/19 23:59ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0103nobodyさん
04/07/20 13:48ID:???ロケットマウスというソフトの設定ファイルをperlで生成して出力させようと
思ったのですが
ロケットマウスでは記号(){},+^~%`と半角スペースは特殊文字として
認識されてしまうのでメタキャラとして設定ファイルとして書き込む場合には
「+あかさたな+」という文字列では
「{+}あかさたな{+}」と置換してからファイルに書き込むようにしなければならないので
my $Name_T = '+あかさたな+';
my $Name_T = ~s/+/{+}/g;
のように置換できたのですが
「+-あかさたな-+」のようなものを上に書いたような形で一発で置換する
ことはできないのでしょうか?
最悪一つ一つ置換していけばOKなのですができればスマートに
できたら幸せになれます。
どうぞよろしくお願いします。
0104nobodyさん
04/07/20 14:08ID:???s/([\x20(){},+^~%`])/{$1}/g;
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlre.html
WebProg と関係無い Perl の話はム板のスレへ。
http://pc5.2ch.net/test/read.cgi/tech/1085564875/
0105103
04/07/20 14:24ID:???勉強になります。
次からはム板でさせていただきます。
0106nobodyさん
04/07/22 07:13ID:???@data=<DATA>;
close(DATA);
foreach $data( @data ) {
とやって、同じディレクトリのindex.htmlを読み出して、携帯電話対応に書き換えるスクリプトを作ってたんですが、
ヘッダーをつける
<body>という文字列が見つかるまで、$data = '';に書き換える
次の$dataから書き出す
</body>が見つかったらそれ以降を$data = '';に書き換える
フッターをつける
とやってたんですが、なんか回りくどい気もします。
ヘッダ、body要素の中身、フッタを簡単に分ける方法ってないですかね。
0107106
04/07/22 07:43ID:???@dataから一行ずつ引っ張り出した、<body>〜</body>の$dataを@bodyに格納したいんですが、
$dataを書き直して、@bodyに入れていく、の方法がわかりません。
$dataを書き直して吐き出す、までは出来てるんですけど。
#@bodyをバイト数で割って、「次のページ」というのをやりたいんです。
0108106
04/07/22 08:06ID:???で出来ました……。板汚しごめんなさい。
0109nobodyさん
04/07/22 09:18ID:0RDyhyxo$data .= $_ while read(DATA,$_,1024);
close(DATA);
if ($data =~ m{<\s*body.*?/body\s*>}i) {
$head = $`;
$body = $&;
$foot = $';
}
0110nobodyさん
04/07/22 13:24ID:???#!/usr/local/bin/perl
use strict;
my @body;
m|<body>| .. m|</body>| and push @body, $_ while <DATA>;
shift @body; # <body> を捨てる
pop @body; # </body> を捨てる
print @body;
__DATA__
<html>
<head><title>test</title></head>
<body>
<h1>test</h1>
<p>foo</p>
<p>bar</p>
</body>
</html>
0111nobodyさん
04/07/23 00:29ID:TCCtsz0d指定したURLのファイルの更新時間を取得したいのですが
どうやって取得すればいいのでしょうか?
0113111
04/07/23 00:59ID:TCCtsz0dぐぐってHTTPの仕様と言う事はわかったのですがそれ以上の事は解りませんでした。
それをどうすれば取得できるのでしょうか?
0114nobodyさん
04/07/23 01:09ID:???0115111
04/07/23 01:31ID:TCCtsz0drequire LWP::UserAgent;
$ua = LWP::UserAgent->new;
$request = HTTP::Request->new('GET', 'http://google.co.jp/');
$response = $ua->request($request); # or
$response = $ua->request($request, '/tmp/sss'); # or
$response = $ua->request($request, \&callback, 4096);
sub callback { my($data, $response, $protocol) = @_;
print "$data";
}
0117111
04/07/23 01:39ID:TCCtsz0dHEADだと何も帰って来ないんです。
からっぽです。
0118nobodyさん
04/07/23 01:41ID:???http://www.studyinghttp.net/
http://member.nifty.ne.jp/hippo2000/perltips/LWP.html
0119111
04/07/23 01:43ID:TCCtsz0d両方とも紫色です・・・。
0120111
04/07/23 02:04ID:TCCtsz0drequire LWP::UserAgent;
$ua = LWP::UserAgent->new;
$request = HTTP::Request->new('HEAD', 'http://akky.cjb.net');
$response = $ua->request($request);
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($response->headers->last_modified);
$year += 1900;
++$mon;
print "更新時:$year年$mon月$mday日 $hour時$min分$sec秒\n";
0121111
04/07/23 02:06ID:???0122nobodyさん
04/07/23 11:00ID:???ソース:
ttp://tool-ya.ddo.jp/2ch/trash-box/file/20040723105619092.zip
gifcatで連結して出力する場合、ブラウザで確認すると、桁が左側から順に表示されてしまいます。
連結されて一つの画像になっているにもかかわらず、桁ごとに表示されるという現象が起こっています。
一桁ずつ順に表示するのではなく、例えば5ケタなら5ケタ分を一気に表示させたいのですが、
どのように記述すればいいのでしょうか。
0125nobodyさん
04/07/23 14:01ID:???0127nobodyさん
04/07/23 14:18ID:???でもそれじゃあ格好がつかない というわけで
連結(conCATenate)だと由来を後付した。
0128nobodyさん
04/07/23 14:35ID:???0131nobodyさん
04/07/23 15:57ID:???.._ .......、._ _ /:/l! そんなエサでぬこさまが(ry
:~""''.>゙' "~ ,、、''‐'、| _
゙、'、::::::ノ:::::::_,.-=. _〜:、 /_.}'':,
``、/:::::::::__....,._ `゙'Y' _.ェ-、....._ /_゙''i゙ノ、ノ
,.--l‐''"~..-_'.x-='"゙ー 、`'-、 ,:' ノ゙ノブ
" .!-'",/ `'-‐'') /\ `/ でノ-〈
.-''~ >'゙:: ‐'"゙./ ヽ.,' ~ /
//::::: ', / ,:'゙
0133nobodyさん
04/07/23 17:17ID:???foreach $temp (@line) { # @lineはログ
$temp =~ s/\s*$//;
@data = split (/\t/, $temp); # タブ区切りなのでタブで分割
if (index ($data[0] . $data[1] . $data[2], $words) > -1) { # 名前,メール,本文 $wordはフォームから受け取った検索ワード
push (@new, $temp);
}
}
このようにして、@newの中身をforeachで書き出せば、指定語句を含むものだけは書き出せました。
これを、検索ワードをスペース区切りで複数指定可能にしてAND検索をできるようにしたいと思っています。
$word =~ s/\x81\x40/\t/g; # スペースで区切って入力されたフォームの検索ワードをタブ区切りにする
@words = split (/\t/, $word); # 検索ワードをタブで区切って配列に入れる
この2行を追加して検索ワードを複数取得したのはいいのですが、indexの第二引数の部分で@wordsの中身を全て含む場合の記述方法が思い浮かびません。
どのような記述方法があるのでしょうか。
0134133
04/07/23 17:43ID:???@words = split (/\t/, $word);
foreach $temp (@line) {
$temp =~ s/\s*$//;
@data = split (/\t/, $temp);
foreach (0 .. $#words) {
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
push (@new, $temp);
}
}
}
このように記述してしまうと、検索ワードを複数指定した場合、
「検索ワードを含む記事の数 * 検索ワード数」分の記事が出てしまうのです。
Ex1.
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんだ」という記事がある場合、
検索ワードを「オレオレ ばぁちゃん 車ぶつけて 50万必要」などとすると、同じ記事が4つ@newの中に入ってしまいます。
Ex2.
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんだ」という記事と、
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんです」という記事がある場合、
検索ワードを「オレオレ ばぁちゃん 車ぶつけて 50万必要」などとすると、
「〜必要なんだ」という記事が4つ、「〜必要なんです」という記事が4つの計8つが@newの中に入ってしまいます。
0135nobodyさん
04/07/23 17:50ID:???0136133
04/07/23 18:00ID:???> if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
この部分は
if (index ($data[0] . $data[1] . $data[2], $words[$_]) > -1) {
の間違いです。失礼しました。
0137nobodyさん
04/07/23 18:18ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Loop_Control
0138nobodyさん
04/07/23 18:20ID:???そこまで書けるんならそんな難しい事じゃないと思うぞ。
foreachの中でマッチするたんびにpushしてるからそうなるんであって、
flag設定してflagたった時だけpushするとか、
grepで一個でもtrue返したらpushするとか。
方法はいろいろあると思うけど、もうちょっと自分で考えてみれば?
0139nobodyさん
04/07/23 18:43ID:???無駄フラグ作ったり、grepで全検査するよか
LINE: foreach $temp (@line) {
・・・
foreach (0 .. $#words) {
next LINE if index($data[0] . $data[1] . $data[2], $words[$_]) == -1;
}
push (@new, $temp);
}
のがいいのでは?
>>137はそういうことではないかと。
0140nobodyさん
04/07/23 18:52ID:???いろいろ方法はある訳で、
ちょっとは自分で考えたら?
と言いたいわけですわ
0141nobodyさん
04/07/23 19:22ID:???漏れは元質問者じゃねーが、壷に嵌ったときはさらさらコードを書けるが、ドツボに嵌った時は何をやっても書けない。。。
そんな時つい2ちゃんに書きたくなるんだよ。
0142nobodyさん
04/07/23 19:28ID:???それこそ幾通りも方法はあるし、それじゃ
丸投げと同じじゃんよ。
少しは自分で考えてやってみろって、
それでうまく行かないってんならアドバイスのしようもあるけど、
0145126
04/07/23 20:14ID:???0146nobodyさん
04/07/24 03:47ID:???0148nobodyさん
04/07/24 08:46ID:???おーい、そろそろ次の質問をどうぞー。
みんな暇してるゾ。
0149nobodyさん
04/07/24 10:01ID:???\x8e\x9f\x82\xcc
EOT
\x8e\xbf\x96\xe2
EOU
\x82\xc7\x82\xa4\x82\xbc
EOV
0150133
04/07/24 17:26ID:???もう少し色々実験してみます。
0151nobodyさん
04/07/25 04:48ID:???5000文字に一番近い\nごとに区切りたい(4951文字目のあとに\nが来れば、4951文字目まで、とそれから5000文字に一番近い\nまで、という感じです)のですが、
substrを使ったら\nの個数がでてきたり、と全くわけがわからなくなってしまいました。
ご教授願えませんでしょうか。
0152nobodyさん
04/07/25 06:27ID:RBsrNYZOわけがわからないのはお前の質問だ。落ち着いてわかるように書け。
とりあえず突っ込みどころとしては
配列@fooに文字列が入ってるってどういうことよ?
5000文字に一番近い\nっていうが、4999文字目と5001文字目に\nが
あったらどっちが一番近いのか?
一番近いの\nごとというが、一番近いのは1つじゃないのか?
\nがなかったらどうするよ?
0153nobodyさん
04/07/25 06:47ID:???@@@@@@@\n
@@@\n@@@@\n
@@@@@@\n
@@@@@@@@@\n
こんな感じに幅を合わせたいんじゃない?
5000文字目から後ろに\nを探して最初に見つかったところで──って感じかなあ。
正規表現は{,5000}みたいに大きな数字は扱えなかったような気がするので、
ループが入るとは思う。
0154nobodyさん
04/07/25 07:00ID:???>153さんのいうような感じで、5000以下のパケットのようなものを作りたいんです。
具体的に言うと、
ページを携帯電話対応に書き換えるスクリプトを作ってるんですが、
ヘッダをとって、body部分を6KB以下に分けたいんです。
ただ、改行で切らないと、タグの途中で切れたりしちゃうので、それを避けるために一番近い(以前に、です)\nを探す、というのも必要だったんです。
0157nobodyさん
04/07/25 09:25ID:???0158nobodyさん
04/07/25 10:03ID:???href="hoge">
とか二行に分かれてたらどうすんだよ。
0161nobodyさん
04/07/25 16:36ID:???二つのCGIがあり、片方はフォームからPOSTで。
もう片方は<a href= でリンクで飛ばしています。
これらを別のCGIで吐き出されるページで使いたいのですが、
片方ずつならちゃんと動作するのに、両方を同時に設置するとどちらもエラーになります。
GETとPOSTは共存できないのですか?
0162nobodyさん
04/07/25 17:12ID:???0164nobodyさん
04/07/25 17:36ID:???んだ。イメージが全然浮かばない。
クライアントからの1リクエストにGETとPOSTを同時に含めることはできない。
URLにGETもどきのパラメータを仕込んでPOSTすることは可能。
・・・って、くらいしか答えられん。
0165nobodyさん
04/07/25 20:19ID:???substr($x, 0, 1+rindex($x, "\n", 4999))
よくわからんが結局こういうことがやりたいのだろうか?
5000文字以内に改行がないときは空文字列になるけど、
いやなら適当に直してね。
0166nobodyさん
04/07/25 22:29ID:???引っ張ってくる画像が閲覧可能であるか、不可であるのかは判別可能でしょうか?
思考錯誤してますがどうにも苦戦中です。
何卒ご指導お願いします
0167nobodyさん
04/07/25 22:33ID:8FggQcGjhttp://〜/member.dat のようなファイルをHTMLで読見込むにはどうしたらよいでしょう?
勿論Perlでも構いません
教えてください
それで、CGIを実行出来るかアドレスを打ったのですが、
ファイルのダウンロード
ファイルによっては、コンピューターに問題を起こす可能性があります。
以下のファイル情報に関して疑わしい点がある場合や、発信元が完全に信用で
きない場合は、このファイルを開いたり保存したりしないでください。
ファイルを開くか、ファイルをコンピューターに保存するか選択してください。
と、でてしまい開くを押しても何も起こりません。
どうすればCGIを実行出来るんでしょうか?
すません、わかりました。
ありがとうございました。
0171nobodyさん
04/07/26 00:33ID:???それです。完璧です。有難う御座いました。
0172nobodyさん
04/07/26 01:11ID:???呼び出すと、文字化けしてます。content-typeが問題な気もするんですが、どうしたらいいんでしょうか。
0173172
04/07/26 01:20ID:???0174nobodyさん
04/07/26 05:28ID:???0175133
04/07/26 14:29ID:???突っ込もうとしているログのデータが配列内に無かった場合のみ、という判定方法で正常に動作しました。
ありがとうございました。
$word =~ s/\x81\x40/\t/g;
@words = split (/\t/, $word);
foreach $temp (@line) {
$temp =~ s/\s*$//;
@data = split (/\t/, $temp);
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
if (!grep $temp eq $_, @new) {
push (@new, $temp);
}
}
}
0176133
04/07/26 14:35ID:???ちとタンマ。
0177nobodyさん
04/07/26 15:15ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o">
$is_there = grep $_ eq $whatever, @array;
だとか
$is_there = grep /$whatever/, @array;
のようなやり方はしないでください。
これらのやり方は遅く(最初に対象が見つかったとしてもすべての要素を
検査していしまいます)、非効率(同じ理由です)で、バグの可能性を含んで
います ($whatheverに正規表現キャラクターがあったりしたら?)。
</q>
0178133
04/07/26 15:23ID:???grepはNGですか、foreachに書き換えることにします。
ちなみに>>175のコードって、これはOR検索になってますね orz
0179133
04/07/26 18:16ID:???$word =~ s/ | /\t/g; # スペースで区切って入力されたフォームの検索ワードをタブ区切りにする
@words = split (/\t/, $word); # 検索ワードをタブで区切って配列に入れる
if ($search eq "and") { # 検索方法がAND形式である場合
foreach $temp (@line) { # 配列の数だけ繰り返す
$temp =~ s/\s*$//; # 行末の改行コードや空白を取り去る
@data = split (/\t/, $temp); # 一行取り込んだ部分を分割して配列に格納する
@check = (); # チェック用配列を初期化
foreach (0 .. $#words) { # 検索ワードの数だけ繰り返す
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
push (@check, 1); # チェック用の配列に1を入れる
} else { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在しない場合
push (@check, 0); # チェック用の配列に0を入れる
}
}
$output_flg = 1; # データ出力用フラグを用意する
foreach (@check) { # 配列の数だけ繰り返す
if (!$_) { # チェック用の配列に0がある場合
$output_flg = 0; # データ出力用フラグを0にする
last; # ループを抜ける
}
}
if ($output_flg) { # データ出力用フラグが立っている場合
push (@new, $temp); # 検索ワードが存在するログの行を新しい配列に格納する
}
}
0180133
04/07/26 18:17ID:???foreach $temp (@line) { # 配列の数だけ繰り返す
$temp =~ s/\s*$//; # 行末の改行コードや空白を取り去る
@data = split (/\t/, $temp); # 一行取り込んだ部分を分割して配列に格納する
foreach (0 .. $#words) { # 検索ワードの数だけ繰り返す
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
$exist_flg = 0; # データ存在フラグを用意する
foreach $_ (@new) { # 配列の数だけ繰り返す
if ($_ eq $temp) { # ログから取り込んだ一行が新しい配列内にあるデータと一致する場合
$exist_flg = 1; # データ存在フラグを立てる
last; # ループを抜ける
}
}
if (!$exist_flg) { # データ存在フラグが立っていない場合
push (@new, $temp); # 検索ワードが存在するログの行を新しい配列に格納する
}
}
}
}
}
grepの部分も>>177が提案してくれた方法で書いてみました。
0181nobodyさん
04/07/26 18:21ID:QB5gv79+「DoCoMo 2.0 N900i(c100;TB;W24H12;ser***;icc***) 」 (***はランダムな英数字)
という文字列が入ってるとして、「(」以降を切り捨てて
「DoCoMo 2.0 N900i」だけにするにはどうすればよいのでしょうか?
substrで桁数を指定するしかない?
0183nobodyさん
04/07/26 18:27ID:???0184nobodyさん
04/07/26 19:24ID:84cm3KM0どうでもいいけど無駄多いな
@words = /([^ | ]+)/g;
foreach (@line) {
s/\s+$//;
@data = split(/\t/);
$hit = 0;
foreach $sword (@words) {
$hit++ if index("$data[1]$data[2]$data[6]", $sword) > -1;
}
next if !$hit;
push(@new,$_) if $search ne 'and' or $hit == $#words + 1;
}
じゃだめか?
0185nobodyさん
04/07/26 19:26ID:???こうか
0186181
04/07/26 20:14ID:QB5gv79+携帯からでしか確認できないのと今手元に実機がないので
また失礼します。何度もすいません。
$data = s/.+(.+)//;
でいけますかね?これで「(」と「)」にはさまれた部分を削除できる・・・かな?
0188181
04/07/26 20:47ID:QB5gv79+レスありがとうです。
私はアホなので意味がさっぱりわからないんですが
これそのままコピペしてもいいのかな・・・。
ちょっと拝借して明日動作確認してみますね。
というか>>183さんも今見たらアドバイスくれてたっぽいですね。
こっちも私には難解だけどありがとうです。
0189nobodyさん
04/07/26 23:50ID:???どうでもいいが、and検索時にログに検索対象の文字列の有無を判定する時に、
配列に0やら1やらを突っ込んで後からチェックするってやり方が俺と同じだ。
わからないときはフリーのソースでも拾って参考にしなさい。
0190nobodyさん
04/07/27 00:02ID:???0191133
04/07/27 00:11ID:???>>184-185氏、そのような書き方もあるのですね。
自分はまだ色々と省略されると見直す際にワケわからなくなるので、
まどろっこしくても極力ああいったソースの書き方をするようにしています。
それらのソースも参考にして、もう少し改善してみようと思います。
とりあえずは動くので失礼します。
ありがとうございました。
0192nobodyさん
04/07/27 00:23ID:???184-185 は無視しておきましょう。
あと、検索部。
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1)
検索語が跨ぐ場合も考えられますのでご注意の程を。
ex.
$data[1] = '2004/07/27';
$data[2] = 'sage';
$data[6] = 'test test test';
@word = qw|27sa agete|;
0194nobodyさん
04/07/27 02:53ID:tzLxOAtQ関係部分のコーディングを全て修正するのは大変なのですが、
c言語のように、ファイルフォーマットのマクロ定義みたいなことは、perlでは
できないのでしょうか?
0195nobodyさん
04/07/27 05:16ID:???そういうのは OO 的アプローチで解決する方がスマートだが、
こういうものもある。
http://perldoc.com/perl5.8.4/pod/perlfilter.html
0196nobodyさん
04/07/27 10:11ID:lcTiWytfPerl のバージョンは、Ver 5.8.0 なので、
フリーのCGIを利用して
@ CGIにに、 use utf-8; 行を追加
A CGI中の、 jcode.pl を利用している部分を削除
B 送信用HTMLをutf-8 に変更
し、送信テストを試みるのですが、受信したメールが文字化けしてしまいます。
レス頂ければ幸いです。
0199181
04/07/27 11:40ID:5fKcxtBPありがとうでした。あと>>193さんもありがとう。まだ試してないけど
今後のために保存しておきます。皆様感謝感謝〜 m(_ _)m
0200nobodyさん
04/07/27 12:14ID:q+Q9Gs/i1111,データ1
1112,データ2
1115,データ5
最大値をとってそれに1を足そうとしたんだけれど
$noに1だけ入ってしまいます。どうも最大値が文字列
扱いされているようです。
どんな感じになおしたらいいだろうか。
while(<IN>){
chomp;
$record{(split(/,/,$_))[0]} = $_;
}
$no = ((((sort keys %record))[-1]));
$no++;
close (IN);
0201nobodyさん
04/07/27 12:40ID:???1116になるので、その意味では直す必要はないよ。
ここに書いてない部分がおかしいか入力ファイルがおかしいか
というあたりだろう。もう一度良く見ろ。
特にwhileループ抜けたあとで%recordがどうなってるか、sortのあと
$no++する前の$noの値はどうなってるか、といったあたりを確認
することをオススメする。
0202nobodyさん
04/07/27 12:41ID:???そうでないならsortは文字列比較がデフォルトなので、<=>を
使った比較を明示しないとおかしくなるよ。
0203nobodyさん
04/07/27 12:48ID:5NNnTCFI最大値取るだけで、意味不明なことやりすぎ。
↓で十分だろ
while(<IN>){
if (m/^(\d+),/) {
$max = $1 if $max < $1;
}
close (IN);
0204nobodyさん
04/07/27 13:20ID:YbDKdELb0206nobodyさん
04/07/27 14:10ID:???@hoge2=( "1", "2", "4", "5" );
foreach(0..@hoge1 -1){
if($hoge1[$_] ne $hoge1[1+$_] ){
push(@hoge3,$hoge1[$_]);
}
}
foreach(0..@hoge2 -1){
foreach$wk(0..@hoge3 -1){
if($hoge3[$wk] eq $_){
push(@hoge4,$_);
}
}
}
結果
@hoge4の中身
"1"
"4"
"5"
質問させて頂きます。
@hoge1、@hoge2の要素を比較して同一だった要素を
@hoge4のように1つだけ取り出す為に上記のようにしてみましたが
効率が悪いような気がします。
もっとスマートに出来る方法はないでしょうか?
0207206
04/07/27 14:21ID:???0208nobodyさん
04/07/27 14:27ID:???foreach (@hoge1) { $h{$_} = 1; }
@hoge4 = grep {$h{$_}} @hoge2;
一例としてはこんなとこか?
0209黒死犬 ◆EgxBlf8nvc
04/07/27 14:30ID:???my $m = 0;
my $n = 0;
while($m <= $#hoge2 and $n <= $#hoge3) {
if($hoge2[$m] < $hoge3[$n]) {
push(@hoge4, $hoge2[$m++]);
} else {
$hoge2[$m] == $hoge3[$n] and $m++;
push(@hoge4, $hoge3[$n++]);
}
}
テストしてないので動作に保証出来ません(単にマージしただけだけど)
Perlだと、組み込みのハッシュ使った方が早いかも
0210nobodyさん
04/07/27 16:02ID:???後はこんなんとか、
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print sort keys %{{map{($_ => 1)}@hoge1,@hoge2}};
0212206
04/07/27 17:35ID:???grepを使って何とか出来ないかと思っていたのですが
hashを利用しての真偽判定でしたか。
大変参考になりました。どうもありがとうございました。
0213nobodyさん
04/07/27 17:41ID:???@hoge3みたいに重複した要素を取り除いた結果が欲しかったら
@hoge1 = grep(!$h{$_}++, @hoge1);
0214nobodyさん
04/07/27 17:47ID:???0215nobodyさん
04/07/27 17:53ID:???いるとしたらどんなツールを使っていますか
0216nobodyさん
04/07/27 17:59ID:???あ、そか、勘違い。
すません、じゃこれ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0217nobodyさん
04/07/27 18:03ID:???重複した要素を取り除くなら、これ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{!exists ${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0219nobodyさん
04/07/27 19:35ID:OzHvZIRFhttp://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNG-CRCAppendix.html
リンク先のアルゴリズムを単純にPerlに書き換えてみたんですが
全然CRC32にならなくお手上げになってしまいました。
原因はどこにあるのでしょうか?
ご教授の程宜しくです。
一応ソース貼っておきます。
テストなんでいきなり文字列渡してsplitして、最後は整形して返してますが。
print &getCRC('string');
sub getCRC {
my ($c, $n) = 0xffffffff;
unless (defined @crcTable) {
for (0..256) {
$crcTable[$_] = $n = $_;
$crcTable[$n] = $crcTable[$n] & 1 ? 0xedb88320 ^ ( $crcTable[$n] >> 1 ): $crcTable[$n] >> 1 for 0..7;
}
}
$c = $crcTable[ ($c ^ $_) & 0xff ] ^ ($c >> 8) for split //, shift;
return sprintf "%08x", $c ^ 0xffffffff;
}
0220219
04/07/27 19:39ID:???0221nobodyさん
04/07/27 19:59ID:???# やはり Pure Perl 実装に需要があるのかな…。
以前同じものを作ってたヤツ。動くかどうかは知らん。:p
my @crc = (0..255);
for my $c (@crc) {
$c = $c & 1 ? 0xedb88320 ^ ($c >> 1) : $c >> 1 for 0..7;
}
sub crc {
my $str = pop;
my $len = length $str;
my $pos = 0;
my $crc = 0xffffffff;
# CPU を食うが恐らく省メモリ
$crc = $crc[ ($crc ^ ord(substr $str, $pos++, 1)) & 0xff ] ^ ($crc >> 8)
while $len--;
# メモリを食うが恐らく高速
# $crc = $crc[ ($crc ^ $_) & 0xff ] ^ ($crc >> 8)
# for unpack 'C*', $str;
pack 'N', ~$crc;
}
0222nobodyさん
04/07/27 21:00ID:cIaHUHzzすみません、最大値を取る参考にしようとしていますが、
コードがシンプルすぎて、私のような初心者には
どういう動作をしているのか、わからないので
少し解説していただけないでしょうか?
m/^(\d+),/ この部分がどういう動作をしているのかがまず、わからないのですが。
それからどういう仕組みで$1が出てきて、中に
何が入ってくるのでしょうか?
それから$maxに$1という変数の値を入れた後に
if で$max < $1という条件比較をしてますが、真
だったときの実行内容が省略されていてわかりません。何が省略されているのでしょうか?
0223nobodyさん
04/07/27 21:10ID:AqRc0k7e以前、ここのスレッドで教えて頂いた内容を参考に
open(LOGFILE,">>log.csv");
print LOGFILE "\"あああ\nいいい\"";
close LOGFILE;
と記述し、Excelで開いた場合にもセル内で
改行が行われるようになりました。
ですが、改行して保存されるようにはなったのですが、
-----------
あああ・
いいい
-----------
のように、改行の部分に「・」と言った
不要な文字が表示されてしまいます。
これを、表示させないようにするにはどのようにすれば良いのでしょうか?
0224nobodyさん
04/07/27 21:14ID:???> m/^(\d+),/
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
> if で$max < $1
http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-7
0226200
04/07/27 21:48ID:cIaHUHzz$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';# 会場データファイル名
$act = "edit";
###### 会場データの読み込み ######
&lock;
open KAIBA,"$kaibadata" or die &error("会場ファイルが開けません");
@kaiba = <KAIBA>;
my $n;
$n = 0;
foreach $kaiba(@kaiba) {
chomp $kaiba;
($kai_id,$kai_name,$kai_tan,$kai_syoku,$kai_busyo,$kai_tel,$kai_fax) = split(/<>/,$kaiba);
if ($kai_name eq $kaibamei){$act = ""; print "同一の会場名が存在します。<br>";
print "既存会場名・・・$kai_name<br>\n";
print "入力した会場名・・・$kaibamei<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
$kai_tel =~ tr/0-9//cd;
if ($kai_tel eq $kaibatelno){$act = ""; print "同一電話番号の会場がすでに存在します。<br>\n";
print "既存会場電話番号・・・$kai_tel<br>\n";
print "入力電話番号・・・$kaibatel<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
}
}
長いのでいったん切ります。
0227200
04/07/27 21:50ID:cIaHUHzz### 追加会場ID生成
while(<KAIBA>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
$new_kai_id = (((sort keys %record))[-1]);
$new_kai_id++;
close (KAIBA);
ここで、$new_kai_idの中身が1になってます。
0228200
04/07/27 21:51ID:cIaHUHzz###### ロックファイル処理 ######
sub lock {
local($flag) = 0;
foreach (1 .. 5) {
# ロックファイルが存在すれば1秒待つ
if (-e $lockfile){ sleep(1);}
# ロックファイルが存在しなければ生成する
else {
open (LOCK,">$lockfile");
close (LOCK);
# ロックに成功したらフラグを立てループを抜ける
$flag = 1;
last;
}
}
}
### --- ロックファイル処理 END --- ###
###### ロックの解除 ######
sub unlock {
if (-e $lockfile) {unlink($lockfile);}
}
### --- ロックの解除 END --- ###
0230200
04/07/27 21:52ID:cIaHUHzz100001<>○○ホール <>鈴木<>青 <>777<>0552-99-0000 <>0552-99-0000
100002<>○○公園 <>佐藤 <>黄 <>777<>044-999-0000 <>044-999-9999
100003<>○○○第2別館 <>田中 <>白 <>777<>03-9999-0000 <>03-9999-9999
1<>○○駅前広場<>テスト<>テスト<>777<><>
1<>test<>test<>test<>default_bumon<>111<>111
1<>テスト<>テスト<>テスト<>596<>1<>2
このような感じです。
0232219
04/07/27 21:55ID:???どーもです。
返り値を
unpack 'H*', $crc;
でバッチリでした;-)
ありがとです。
>>229
どーもです。
幸せを探してきます。
0233200
04/07/27 22:03ID:???読み方でおもろそうだったので。
別に日本語が不自由なわけじゃないですよ。
0234nobodyさん
04/07/27 22:04ID:???%recordの中身みたか? 多分からっぽだと思うのだが。
KAIBAファイルハンドルはopen直後の
@kaiba = <KAIBA>;
で全部読み出されてしまっているハズ。
あとこの問題とは関係ないがそのロックは全くなってない
ので勉強して書き直すこと。
0235nobodyさん
04/07/27 22:06ID:???0236200
04/07/27 22:20ID:cIaHUHzzありがとうございます。
@kaiba = <KAIBA> で
<KAIBA>の中身が@kaibaにコピーされると思って
おりました。取りだされていたのですね。
ロックの方はなんとか勉強しなおそうと思います。
0238200
04/07/27 23:01ID:cIaHUHzz応答が返ってこなくなるんですね。
もう一度開きなおすしかないのでしょうか。
0239nobodyさん
04/07/27 23:10ID:???実際に組むのはそれからだ。
無限ループ起こすような奴は一から出直せ。
0241nobodyさん
04/07/27 23:48ID:5NNnTCFI$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';
とりあえず、cgiとdataは違うディレクトリに置いとけよ
ロックはお前みたいな初心者は素直にflock使っとけ。
XPならflock使えるし
0242nobodyさん
04/07/28 06:05ID:GXYYbYLCCGIだけ詳しい友達に作ってもらったのだけど
この度HPリニューアルしたら、CGIだけがうまくいきません。
(アクセス権等は変更しました)
何かいじったわけではないし、その部分はそのままにしておいてはずなのに
(そこだけはそのままおいておいて新しいページとリンクしただけですが)
nobody@××.ne.jpという中身のない注文書がきます。
今ではHP注文もきて、傾いている店も繁盛してきたのに
どうしたらいいか・・・親の視線がいたいです
助けてください
0244nobodyさん
04/07/28 06:17ID:???ここで聞くのは筋違い。
じゃなければ金出してプロに頼め。
0247nobodyさん
04/07/28 18:30ID:+xurfTPEそのCGIにアクセスがあったときに、
そのフォルダ内のHTMLファイルを返すにはどうしたらいいのでしょうか?
ググろうにも・・・どうキーワードを打ち込んでいいのか分からないのでここへ来ました。
# 今はprintでJavaScriptを含むHTMLを出力して、
# そのJavaScriptで目的のHTMLファイルを読み込ませているのですが、
# どうも・・・
0251nobodyさん
04/07/28 18:47ID:???ここ書込んだときに「しばらくおまちください」みたいなページ出たよな?
それが答えの1つだ。
あとは。。。ロケーションヘッダでぐぐれ
0253nobodyさん
04/07/28 19:23ID:H19oR7ELそこでcronを使って実現しようとしているのですがうまくいきません。
■動かしたいファイル:xxx.cgi
(4行目で require 'abcd.pl'; を記述してます)
■実行した手順
telnetでログイン
↓
crontab -e
↓
0-59/10 * * * * /home/www/●●●/public_html/xxx.cgi
↓
:x で終了
すると、line 4. (実行しているファイルの4行目)がエラーだと
いう記述のメールは届いてしまいます。
メールの原文は下記の通りです。
Can't locate ./abcd.pl
in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 . /usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503)
at /home/www/●●●/public_html/xxx.cgi line 4.
上記の通りなのですが、
うまく実行させるにあたりご教授願えればと思います。
0254247
04/07/28 20:05ID:???>>248
ごめんなさい。
>>249-250
それでググってみます。
>>251
しばらくお待ちくださいから飛ぶのはmetaタグのやつですよね。
JavaScriptでもmetaタグでも、どっちにしてもページを介さなければならないのが
ちょっと・・・
「ロケーションヘッダ」でもググってみます。
0256nobodyさん
04/07/28 20:10ID:???0259nobodyさん
04/07/29 07:52ID:Y1hnbGEZWhileの前でもう一度ファイルを開いたら
なんとか動きました。これでお客さんになんとか見せれそうです。
ありがとうございました
0260nobodyさん
04/07/29 09:03ID:???通販サイトの注文CGIをPERLで作っていて疑問。オブジェクト指向で書き上げたいんだけど、
とりあえずEcomという名前のモジュールを作って、それのコンストラクタで単価、商品名等の基本部分を
設定。Ecomのコンストラクタが返すオブジェクトの初期プロパティに商品名とかのハッシュリファレンスを持たせる。
で、疑問なのはこのオブジェクトは当然モジュールEcomのメソッドを全て使用できるわけだけど
一体この場合のメソッドって一体何?
クラスにおけるメソッドの役割みたいなものがはっきりしない(理解できない)
っていうかどういう意味合いで使えばいいのかというか;ちょっと例を出してみる。
1.コンストラクタが返すオブジェクトの強化、改造のため
2.コンストラクタが返すオブジェクトのプロパティを参照して何らかの処理をして、呼び出し元に値を返す。
3.?思いつかない
未完成であるオブジェクトを完成させるのがクラスのメソッドなのか?みたいにも思うけど、
イマイチ。どう捉えれば一番すんなりいくのかな?
0261nobodyさん
04/07/29 09:44ID:???プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
0262nobodyさん
04/07/29 14:11ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/10.htm
0263nobodyさん
04/07/29 14:34ID:???http://perl.infoware.ne.jp/documents/perlboot.ja.html
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
http://perldoc.jp/docs/perl/5.8.0/perltooc.pod
http://www.melma.com/mag/85/m00014785/a00000001.html
あと駱駝と黒豹と Effective Perl 。
0265nobodyさん
04/07/29 17:55ID:???Perl の配布パッケージに含まれている公式な説明書。> perldoc
和訳は駱駝本がそうであるとも言えるし、perldoc.jp のように有志の
手による部分訳もある。
0266522
04/07/29 19:47ID:???0268nobodyさん
04/07/29 19:57ID:???>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0271nobodyさん
04/07/29 21:31ID:???0272nobodyさん
04/07/30 12:42ID:As0li0gB[0]から順に数字が入っている事が前提でかまいませんので。
0274nobodyさん
04/07/30 15:59ID:???Thx.ありがとう。
0275nobodyさん
04/07/31 00:34ID:k0R22EX12個以上配列の中に要素としてある数字を、
配列として読み込ませるにはどうすればいいですか?
具体的に言うと、
@array = (0,2,3,2,0,4,1);
こういう配列から
@req = (0,2);
こんな配列が作りたいんですけど・・・
0276nobodyさん
04/07/31 01:02ID:???$hash{$_}++;
}
for (keys %hash){
$hash{$_} > 1 and push(@req, $_);
}
0277275
04/07/31 01:08ID:k0R22EX1Thxです!
0278nobodyさん
04/07/31 01:10ID:???0279nobodyさん
04/07/31 03:22ID:???push(@req,$_) if $hash{$_} > 1;
の方がいいと思った。
0280nobodyさん
04/07/31 04:52ID:???foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}
とループひとつで済ませるかな。
0281nobodyさん
04/07/31 08:53ID:???==2だと「要素が二個だったら」になるぞ。
0282nobodyさん
04/07/31 09:47ID:???@arrayに2回以上出現する要素を@reqにひとつずつ
入れるのだから、==でいいはず。>=2だと
@array=(2,2,2)のときに@req=(2,2)になっちゃう。
0283nobodyさん
04/07/31 11:26ID:JonE4G7Jperlを勉強しようと思いますが、
主にcpanを使ったwebプログラミングを作っていきたいと思いますが、
何をどこからやれればよいか途方に暮れています。_| ̄|○
参考になるサイトや本を探しても全然勉強にならない。
※ある程度知っている人向けが多い・・・_| ̄|○
猿でもわかるcpanやcpanを使ってのperlやcgiについて
参考になるサイトや書籍をご紹介いただければ幸いです。
お礼はアフィリエイトリンクを踏んで本を買います。
そしたら、利益供与(?)いたします。
0284nobodyさん
04/07/31 14:49ID:RsJc0bwQPerlやppm等のコマンドを打つと、
'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と表示されます。
何度か再インストールしても、Perlフォルダを消してみても同じでした。
どなたか解決策教えていただけませんか?
0285nobodyさん
04/07/31 14:53ID:???0286nobodyさん
04/07/31 15:04ID:???pathって打ってみて、表示されたリスト内にperl.exeのフォルダがなければパスが通ってない。
設定はシステム→詳細設定→環境変数から。pathを選んで好きな位置にフォルダを追加する。
(他のフォルダとは ; で区切る)
0287nobodyさん
04/07/31 15:25ID:???cpan、cpan言ってないでまずはperl自体を勉強汁。そうすれば、cpanのことも自ずと分かってくる。
ちなみに、webにあるperl講座とかは殆どが始めてやる香具師用だ。
それがちゃんと探してから言った言葉なら、冗談抜きで理解力無いんだと思うぞ。
perlの事がそこそこ分かってきて、cpanのライブラリも利用しようということになったら下のサイトが大いに役に立つだろう。
http://www.cpan.jp/
0288nobodyさん
04/07/31 15:28ID:RsJc0bwQpathと打つと、
PATH=C:\WINDOWS\system32;"%path%;C:\Perl\bin;C:\Perl\bin\;C:\WINDOWS;C:\WINDOWS\
system32\WBEM;
と表示されます。
perl.exeはC:\Perl\binに入っていたので、大丈夫だと思うのですが…。
0289nobodyさん
04/07/31 16:16ID:???0290nobodyさん
04/07/31 18:24ID:???おもいっきりおかしいとこあるじゃん!
0291nobodyさん
04/07/31 19:50ID:???何をどうやったらそんなものが紛れ込むんだろう
0292nobodyさん
04/07/31 22:49ID:JonE4G7Jdクス。勉強汁よ・・・
0293nobodyさん
04/08/01 02:50ID:???忘れてたんですが、ちょっと思い出して作ってみたんですが、どうでしょう。
Subjectは適当に付けて、Question&Answerはほどよくコピペするといいと思います。
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
0295nobodyさん
04/08/01 07:05ID:???画像のURLがあった場合、その画像を拾ってきてサーバに保存する機能を付けたのですが、
画像のあるサーバが落ちている場合などは
connectがエラーを返すまでに時間がかかってしまいます。
connectがタイムアウトする時間を設定することはできないのでしょうか?
Windows上のサーバでCGIを動かすのでalarmが使えずに困っています。
0296nobodyさん
04/08/01 08:00ID:???0297295
04/08/01 08:47ID:???どういう画像が貼られるかわからないのでなんとも・・・
アプロダも似たようなものだと思うんですがどうなんでしょうね
0298nobodyさん
04/08/01 08:53ID:???0299295
04/08/01 09:43ID:???0300nobodyさん
04/08/01 11:30ID:???普通は timeout 設定できるやろ
君がどういうライブラリ/クラス/関数使ってるかわからんのでやりかたはなんとも言えんが
0302nobodyさん
04/08/01 12:25ID:???0303nobodyさん
04/08/01 13:19ID:???0304nobodyさん
04/08/01 14:40ID:???登録してから再編集する機能をつけました。 このシステム自体荒らしに弱いのが難点なので、バックアップ機能もつけておきます。
>>301
やっぱり、人の手で判別して人の手でちょっと編集するのが一番だと思うのですが。
暇だったら登録お願いします。
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
0305nobodyさん
04/08/01 14:43ID:???アプロダも「自分で描いた絵」なら全く無問題。
他人の絵を無断でアプしたら著作権侵害。
他人がやっているから自分もいいと考えるのはただの自己厨。
そういうシステムを作ろうってなら、まずは著作権を勉強しろ。
0306nobodyさん
04/08/02 05:33ID:???push @req, $_ if ++$hash{$_} == 2;
}
++$hash{$_} == 2 ここの部分の意味教えてください・・・
0307nobodyさん
04/08/02 05:50ID:???hash : http://www5a.biglobe.ne.jp/~n_rieko/perl/4.htm
++ : http://www5a.biglobe.ne.jp/~n_rieko/perl/5.htm#5-1
== : http://www5a.biglobe.ne.jp/~n_rieko/perl/5.htm#5-4
$_ : http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-4
0309nobodyさん
04/08/02 13:08ID:???$lib = new LIB;
とやってlib.plにpackage LIB;
とやって、
print "Content-type: text/html\n\n";
とやってもエラーがでます。
「require 'lib.pl';」
「$lib = new LIB;」
この2つの行を消したらエラーは出ずに表示されるんですが、
なんでエラーがでるのでしょうか?
0310nobodyさん
04/08/02 13:23ID:???new サブルーチンあるの?
0312nobodyさん
04/08/02 20:51ID:???0313nobodyさん
04/08/03 08:57ID:bp7Se8/yスクリプトを改造してる形になるんですが、リンクをクリックしたら
ある変数に値を代入(ここでは$#aaaに1を入れたい)するというのは
どうすればいいんでしょうか?そのあとにIFを設置して条件分岐の材料に
したいのですが、下の通りにやっても処理されてくれません。元の文はこれです。
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D">);
で、これを
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D" $#aaa=1>); とか、
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D&$#aaa=1">); とかにしても
うまく動作しないんです。こういう処理って無理なんでしょうか?
0315nobodyさん
04/08/03 20:27ID:???記述方法をお聞きしたいと思います。
例えば、Perlで作ったフォームに「Shutdown」というボタンがあったとして
このボタンを押すと「shutdown -h now」というコマンドがサーバに
反映されてサーバ機が止まるような。
こういうことって出来るのでしょうか?
0316nobodyさん
04/08/03 20:30ID:???例のshutdownの実行には、root権限が必要そうだが、コマンドを実行するだけなら、exec(), system(), open(), ``などの方法がある
0319nobodyさん
04/08/03 23:10ID:???0320nobodyさん
04/08/03 23:49ID:???思ったんだけど、俺が神経質すぎるだけなのかなあ。
フォームのボタンで/sbin/以下をごにょごにょするって話にしては
なんだか呆気なく感じたんだけど、気にしすぎ?
# スレ違いでごめんなさい。
0322nobodyさん
04/08/04 00:04ID:???0324320
04/08/04 00:17ID:???うまく言えないんだけど、
入門書にある「print `pwd`; してみよう」レベルのことを尋ねてる人が、
「ブラウザから鯖を halt させたい」ってところに引っかかったのかな。
最近、セキュリティがアマアマの自宅鯖を見すぎてるだけかも。
0325nobodyさん
04/08/04 00:43ID:???共有鯖ならばシャットダウンに必要な権限を得られないから問題無い。
シャットダウンに必要な権限が得られる個人鯖ならどうなろうと知ったこっちゃないので、やっぱり問題無い。
0326320
04/08/04 00:50ID:???わかりやすい意見をありがとうございます。
2行めを読んで激しくスッキリしました。
コーディングと関係ない話で引っ張って失礼しました。
0327nobodyさん
04/08/04 01:14ID:???0329nobodyさん
04/08/05 06:51ID:A93W0UINみんなはちゃんと、アクセスメソッド作ってやってる?
今作ってるやつはオブジェクトのメンバ変数(プロパティ)が結構な数あるからいちいち個々に対するアクセスメソッドを
作るのは冗長な気がするんだよね。中にはハッシュとかもあるし;
シンボリックリファレンスありにすれば1個で済むような気がするけど、知恵を貸してください。
0330329
04/08/05 07:03ID:A93W0UINsub new{
my $self = shift;
my %form;
foreach ( split /&/,shift ) {
( my $a , my $b ) = split /=/;
$b =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$form{$a} = $b;
}
bless {
form => %form
},$self;
}
ちょっとプロパティを減らしたけど、とりあえずこんな感じ。
それでmainの方で
my $obj = Testclass->new($ENV{'QUERY_STRING'})
としてから随時HTML出力途中に
$obj->{form}{hoge}
として参照したいけど、これをアクセスメソッドを介してのものに変えたい。
0331nobodyさん
04/08/05 08:28ID:???http://perldoc.com/perl5.8.4/pod/perlsub.html#Autoloading
http://perldoc.com/perl5.8.4/pod/perltoot.html#AUTOLOAD--Proxy-Methods
0332nobodyさん
04/08/05 08:54ID:o7gPPImy教えて頂けないでしょうか?phpのarray_change_key_case
http://php.s3.to/man/function.array-change-key-case.html
のようなものを探しております。
0334329
04/08/05 09:01ID:A93W0UIN0335nobodyさん
04/08/05 09:08ID:???@_[0]=\@a;
この@_[0]をデリファレンスするにはどうsればいいですか?
@@_[0]
@$_[0]
とかではできませんでした。
それと
@$#_[0]
みたいなことをして、配列の最後の番号を知りたいんですが、どうすればいいですか?
0336nobodyさん
04/08/05 09:38ID:???@_[0]=\@a;は正しくない。正しくは$_[0]=\@a;
デリファする時は@{$_[0]}のように{ }で囲む。
要素見るときは$_[0][N]、最大添字は$#{$_[0]}。
0337nobodyさん
04/08/05 09:43ID:???>>6
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Autoloading
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
0338nobodyさん
04/08/05 10:20ID:???日本語のマニュアルしか受け付けないって人は止めた方がいいと思うよ
0339329
04/08/05 10:54ID:A93W0UINありがと。でもアクセスメソッドとのつながりがイマイチわからん。
下のはアクセスメソッドのこと書いてるけど、冗長だよね。
ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
使えるやつにしたいんだけど、ゆっくり自分で考えるよ。ありがとう。
>>338
ほんと日本人には不利だよね。というか英語圏の人間はそれだけでずいぶん楽なんだろうな。
0340335
04/08/05 11:02ID:???ありがとうございました!できました^^
0341nobodyさん
04/08/05 11:46ID:???>ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
>使えるやつにしたい
無理だろ。どんなクラスでもこのアクセスメソッドで完全にokなんてのがあったら、有名になってるって。
できたら金やるよ
0342nobodyさん
04/08/05 11:47ID:IwD+3Zuujcode.plで受け取ったデータを「EUC」に変換した後、
EUC特有の「全角英数→半角英数」の処理を施し、
その後再び、「SJIS」に変換する、といった処理は可能でしょうか?
0344nobodyさん
04/08/05 12:32ID:???orz =3
0345329
04/08/05 12:41ID:A93W0UINどんなコンストラクタでも使える、どんなオブジェクトにも使えるアクセスメソッドってのは
さすがにまだだけど、とりあえずできたよ。
呼び出しを
$obj->access([path1,path2,.....],代入したいならここに);
こんな感じにして。第一引数に例えば$obj->{form}{hoge1}の場合は
[form,hoge1]
みたいな無名配列のリファレンス渡しで一応カタグロブ以外は対応できた。
0346nobodyさん
04/08/05 13:16ID:???baka@yyy.jp
chinko@zzz.jp
みたいな感じになっているファイルを開いて
aho@xxx.jp,baka@yyy.jp,chinko@zzz.jp,
こんな風にカンマで区切って、こいつを変数にするにはどうしたらいいのでしょうか。
エロイ人教えて...
0347332
04/08/05 13:38ID:o7gPPImy早!そしてありがとうございます!
こりゃ自分では答えが出ませんでした。
0348nobodyさん
04/08/05 14:06ID:???俺はエロクないから答えるべきでないかもしれんが、
とりあえずそのファイル名をhogeと仮定して。
open ( FH , "hoge.txt" );
$a = join ",",<FH>;
ってのはどうだ。
0349nobodyさん
04/08/05 14:40ID:???改行コードを取り除く必要があるなり
chomp(my @i = <FH>);
$mail = join(',', @i);
0350nobodyさん
04/08/05 15:05ID:???とかはどうだろう?
0353329
04/08/05 15:49ID:A93W0UINmy $value = $obj->access(path1=>hoge,path2=>hogeがハッシュ、配列のリファレンスならその続きをここに,value=>代入したい値);
突っ込んでくれるとどこを改良すればいいかのめぼしがつくからうれしい。
sub access{
my $self = shift;
my %atr = (path1 => undef,path2 => undef,value=>undef,@_);
if ( !($atr{path2}) ) {
if ( ref $self->{$atr{path1}} eq "SCALAR" ){
if ( $atr{value} ){${$self->{$atr{path1}}} = $atr{value};}
return ${$self->{$atr{path1}}};
} elsif ( ref $self->{$atr{path1}} eq "ARRAY" ){
if ( $atr{value} ){@{$self->{$atr{path1}}} = $atr{value};}
return @{$self->{$atr{path1}}};
} elsif ( ref $self->{$atr{path1}} eq "HASH" ){
if ( $atr{value} ){%{$self->{$atr{path1}}} = $atr{value};}
return %{$self->{$atr{path1}}};
} else {
if ( $atr{value} ){$self->{$atr{path1}} = $atr{value};}
return $self->{$atr{path1}};
}
} elsif ( !($atr{path3}) ) {
if ( $atr{value} ){$self->{$atr{path1}}{$atr{path2}} = $atr{value};}
return $self->{total}{prtotal};
}}
0354nobodyさん
04/08/05 16:11ID:???サブルーチンを呼び出す時は、一度ヒアドキュメントを終了して、
&subrootin();
等として呼び出すしかないんでしょうか?少し面倒な感じなのでもし、もっといい方法がありましたら教えて下さい。
0356nobodyさん
04/08/05 17:05ID:???ヒアドキュメントにサブルーチンが返す文字列を埋め込みたいと
いう話なら
${\(&subrootin();)}
または
@{[&subrootin();]}
0357nobodyさん
04/08/05 17:28ID:???test
%s = subroutine(%s)
EOF
でもいいと思うし。
0358nobodyさん
04/08/05 17:29ID:???> printf <<EOF,$value, subroutine($value);
逆だ鬱。
printf <<EOF, subroutine($value),$value;
0359nobodyさん
04/08/05 19:46ID:???早速ありがとうございます!
>>356
ばっちりできました!
>>357-8
printfについて勉強が浅かったので、今解説サイトのprintfとsprintfのページみて少しは
わかってきましたが、>>357-8さんのコーディングがまだ理解できませんorz
難しいですね
0360354
04/08/05 20:06ID:???>>356さんの教えてくれた方法は、サブルーチンが返す値を出力するときのみなんですよね?
サブルーチンでprintしてる場合は何故か変なところに出力されてしまいました;
printが2重になってしまうのでやっぱり無理ですよね。
0361nobodyさん
04/08/05 20:18ID:???AUTOLOADは早くないと思う。
>>353
アクセッサーの自動生成なら。他 CPANに 同様のClass::モジュールが多数有
http://perldoc.jp/docs/modules/Class-Accessor-0.18/Accessor.pod
0363nobodyさん
04/08/05 21:08ID:???たかだがアクセスメソッドのために、モジュールを一個useするのって重くないか?
極力削りつつ、汎用的でいけてるプログラムを目指さなきゃ。
0364nobodyさん
04/08/05 21:38ID:???別の方法もあるが、一度ヒアドキュメントを終了して書く方が後々面倒じゃないので、
ヒアドキュメント閉じる方がいい方法だと思う。
0365361
04/08/05 22:41ID:???ごめん。実行速度の事だと勘違いしてました。
>>363
でも、頻繁に使われるものだから、何度も書き直すものではないよ。
似たようなコードが複数のファイルに散らばると保守が面倒になるし、
僕ならモジュール使う方を選ぶけど。
主張の違いは置いておいて、AUTOLOAD使うとしたらこんな感じかな。
sub AUTOLOAD {
# getter/setterを呼出時に自動定義
my ($self, $value) = @_;
return if $AUTOLOAD =~ /::DESTROY$/;
if ($AUTOLOAD =~ /::((get|set)_?(\w+))$/) {
if ($2 eq 'get') {
eval "sub $1 { my (\$self) = \@_; return \$self->{lc($3)} }";
return $self->{lc($3)};
}
if ($2 eq 'set' and defined $value) {
eval "sub $1 { my (\$self,\$val) = \@_; \$self->{lc($3)} = \$val }";
$self->{lc($3)} = $value;
}
}
}
書いてて思ったんだけど、>>353 のコード
配列とかハッシュはリファレンスを返せば充分じゃない?
0367nobodyさん
04/08/06 00:59ID:???print <<EOF,&subhoge('hoge'),<<EOF;
hogehoge
EOF
hogehogehoge
EOF
0368nobodyさん
04/08/06 01:16ID:Qwf6u7BBperldoc -f pack
を読むと template の S, I, L のバイトオーダは機種依存とありますが
N, V の方はどうなんでしょうか?
N は big-endian, V は little-endian と機種に依存しないような体で書かれているんですが。
0369nobodyさん
04/08/06 01:27ID:???一つずつの配列を出力する時にhogehage.gif hagehoge.gif honehone.gif...と出力
させたいのですが、楽な方法はありますかね?
bashの
for $i in *.png
do;echo ${i%.png}.gif;done;
と同じように考えていただければ良いのですが…。
0372368
04/08/06 01:58ID:???間抜け晒してお恥ずかしい
0373329
04/08/06 05:44ID:???>書いてて思ったんだけど、>>353 のコード
>配列とかハッシュはリファレンスを返せば充分じゃない?
漏れ的にはオブジェクトをとても親切な人として想定してるので、
リファレンスのまま返すのはちょっと無愛想かなって;
0374nobodyさん
04/08/06 06:33ID:???foreach (/x=(\d+)/g) { $sum = $sum + $_; }
としたのですが、もっと綺麗とか高速とかな書き方はないでしょうか?
0376nobodyさん
04/08/06 07:03ID:???前にどこかでサブルーチン名にアンダースコアを含ませる時は何かの注意をするように
って書いてるサイトを読んだ。
うろ覚えでどこのサイトかもどんな注意かも忘れちゃってて、今ググテみたけどそんな注意らしきことは
どこにも見当たらない。サブルーチン名にアンダースコアを含んで、含まないときと異なる注意点ってあったっけ?
0377nobodyさん
04/08/06 08:45ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
単語を区切るためにアンダースコア (_)を使いましょう。これは、
一般的に言って $VarNamesLikeThis よりも $var_names_like_this の
ほうが、特に英語のネイティブスピーカーでない人にとっては、読む
のが簡単です。 これは VAR_NAMES_LIKE_THIS のような場合でも
有効である単純な 規則です。
<snip />
名前の先頭にアンダースコアを使うことで、その変数や関数がそれが
定義されているパッケージの外では使うべきでないということを表わす
ために使うことができます。
</q>
__LINE__ や __FILE__ といったリテラルトークンと同名のサブルーチン
は作るのも呼び出すのも難しい。
*__LINE__ = sub { 1 };
print &__LINE__;
0379376
04/08/06 09:04ID:???ありがとう!多分先頭がアンダスコアの変数、サブルチンはパッケージ外では使わない
っていうのを中途半端に覚えていたせいで、変に怖かったんだ;
0380nobodyさん
04/08/06 10:49ID:DHgT8QqI文字列 =~ //aa/
でいいの? それとも/の前になんか必要?
0383nobodyさん
04/08/06 11:21ID:???エスケープをエスケープして↑じゃ駄目か?
0384nobodyさん
04/08/06 11:48ID:???bmpファイルから画像情報を抜き出そうとしています。
$hexdata = unpack("H*",$bindata)として
424d36e80300000000003604000028000000fe0200004c010000 (0x1A以降略
ここまで取得することができました。 ↑
矢印の「fe02」の部分がWidthで「766」に変換したいのですが、
どのように変換するのがスマートでしょうか?
hex(substr($hexdata,36,2))+hex(substr($hexdata,38,2))*256
で一応取得はできるのですが文字列として扱ってる時点から冗長過ぎる気がします。
0385nobodyさん
04/08/06 14:07ID:???unpackでv使え。
% perl -e '$s="\xfe\x02"; ($w)=unpack("v", $s); printf "%d\n", $w;'
766
bmpのファイルフォーマットは知らんので前後をどうべきかは
わからん。
0386nobodyさん
04/08/06 14:14ID:???my @TagsBITMAPFILEHEADER = qw/
bfType
bfSize
bfReserved1
bfReserved2
bfOffBits
/;
my @TagsBITMAPINFOHEADER = qw/
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
/;
my $bmp = {};
@{$bmp}{@TagsBITMAPFILEHEADER} = unpack('a2VvvV', substr($bindata, 0, 14));
@{$bmp}{@TagsBITMAPINFOHEADER} = unpack('VVVvvVVVVVV', substr($bindata, 14, 40));
print $bmp->{biWidth};
0387nobodyさん
04/08/06 14:35ID:???http://search.cpan.org/~gaas/Image-Info-1.16/
0388384
04/08/06 21:58ID:???回答ありがとうございます。
>>386
unpackに配列を返させてまとめてハッシュに格納してるのはなんとなく分かるのですが、
以下の読み取り方法では何も表示されませんでした。
他の方法をとらなければならないのでしょうか?
$file = './tmp.bmp';
open FH, $file;
binmode FH;
read FH, $bindata, -s $file;
close FH;
0391nobodyさん
04/08/07 00:19ID:???0392384
04/08/07 00:52ID:???LANケーブルで首吊って死につつ蘇って精進します。
0393nobodyさん
04/08/07 03:22ID:???$a2 が $aa に当てはまっていれば、その行の $b を $b2 に代入
という風にを、 $a1 〜 $a13 までやって、それに応じて $b1 も $b13 まで用意する、とやるのに、
13個ルーチンを書くのは無駄が多いような気がするんですが、簡素に書く方法ありませんか?
0397nobodyさん
04/08/07 06:38ID:???パッケージ=ルーチン
メソッド=サブルーチン
と言う感じですか..?
メインルーチン=ルーチン?
0398nobodyさん
04/08/07 07:03ID:???http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-2
を読みましたが知りたいことが書いてないみたいなので質問させて下さい。
$a = \"あいうえお";
リファレンスを格納している変数の中身を文字コード変換するにはどうすればいいでしょうか?
jcode::convert(\$a,"sjis");
jcode::convert($a,"sjis");
jcode::convert(\($$a),"sjis");
できないのでしょうか?
0399nobodyさん
04/08/07 07:42ID:WwZLffmc調べろ
http://e-words.jp/w/E383ABE383BCE38381E383B3.html
0401nobodyさん
04/08/07 09:41ID:???それを抜きにしても、型グロブ受け取るサブルーチンに
スカラーのリファレンス渡すのはどうすりゃいいか
わからんな。
やりたいことが文字コード変換ならJcode.pm使え。
0402nobodyさん
04/08/07 10:06ID:M9c7I24Iしてたのですが、鰍ネどは判定してくれるのですが、
のような文字は判定してくれません。
92区(0xEE9F~0xEEFC)にあたるのでこの正規表現に
含まれると思うのですが、どうしてでしょうか。
教えてください。お願いします。
# 機種依存文字の有無確認
# 有→1、無→0 を返す
sub depend_kisyu{
my $name = shift;
if($name){
# 機種依存文字発見のためにsjisに変換
&Jcode::convert(\$name, "sjis","auto");
my $ascii = '[\x00-\x7F]';
my $sjis_twoBytes = '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';
my $sjis_pattern='[\x87\xED\xEE\xFA-\xFC][\x40-\x7E\x80-\xFC]';
if($name =~ m/\G(?:$ascii|$sjis_twoBytes)*?((?:$sjis_pattern)+)/og){
return 1;
} else {
return 0;
}
}
}
0404nobodyさん
04/08/07 11:34ID:???なぜ正規表現が正しいかという話なのに、ifだの
Jcode::convertだのがついた関数にして質問するかな?
前後に余計なものがついてると問題がぼやけるので、
$nameにいきなりその""をSJISで入れて、その関数の
正規表現の部分でマッチするかどうか、というところ
を調べてから出直して来い。
0405nobodyさん
04/08/07 11:56ID:20zkJ4Vm改行の場所にスペースも入ってしまって困っています。
改行などもそのままで表示したいのですが…。お願いします。
(ファイルはアスキーモードで転送しています)
open(PAGE_FILE, "test.txt");
@page = <PAGE_FILE>;
close(PAGE_FILE);
print <<"";
<form action="$program_name" method="GET">
<input type="hidden" name="title" value="$title">
<input type="hidden" name="mode" value="write">
<textarea cols="80" rows="20" wrap="off" name="text">@page</textarea><br>
<input type="submit" value="送信">
</form>
0406nobodyさん
04/08/07 12:12ID:???(解決法1)
ファイルを読むときに配列じゃなくてスカラーに読んで
そっちを使う
{local $/; $page=<PAGE_FILE>;}
(解決法2)
配列を文字列に埋め込んだときに要素間に挟む文字を
空文字列にする。
{ local $" = '';
print ...
}
0408nobodyさん
04/08/07 13:52ID:???my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%02d:%02d:%02d GMT",($hour,$min,$sec);
他にどんな使いかたがあるでしょうか?この二つの関数についての理解を深めたいので
いろんな使い方を知りたいです。
どうぞおながいします。
0409nobodyさん
04/08/07 14:21ID:???http://perldoc.com/perl5.8.4/pod/func/sprintf.html
0411nobodyさん
04/08/07 14:48ID:???0412nobodyさん
04/08/07 14:52ID:???my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%4d/%02d/%02d GMT",($year,$mon+1,$mday);
0413nobodyさん
04/08/07 15:14ID:???my $a = sprintf "%4d/%02d/%02d GMT",($year+1900,$mon+1,$mday);
0417nobodyさん
04/08/07 17:06ID:???のサイトの
printf '%2$d %1$d', 12, 34; # prints "34 12"
はどういうことだろう?テストコピペして動作確認したが期待通りにはならなかったぞい。
英語が嫁ねと駄目だなorz
0419nobodyさん
04/08/07 17:26ID:???その変換指定子の書き方は 5.8.0 からサポートされた。
http://perldoc.com/perl5.8.4/pod/perl58delta.html
0421nobodyさん
04/08/07 18:07ID:???最後の文字がxなら @xに
最後の文字がx以外なら @yに
こういう正規表現を絡めたコーディングがしたいです。
@x = grep { /x\z/ } @a;
@y = grep { /[^x]\z/ } @a;
で一応できるんですが、一度目でfalseだったものはそのまま@yにいれていくような感じにしたいんですが
どうすればいいでしょう?
foreach ( @a ) {
if (/x\z/) {push @x,$_}else{push @y,$_};
}
できました^^ところで{push @x,$_}の部分、{push @x}では$_の値を自動で追加してくれないんですが
ifの実行文内では、デフォルトで$_に作用する法則?が崩れるんですか?
0422nobodyさん
04/08/07 18:19ID:???そんな法則は存在しない。
foreach ループの変数名を省略した場合は $_ に代入され、
マッチ演算子に対してマッチ結合演算子で文字列が指定
されていない場合は $_ が対象となるだけ。
0423nobodyさん
04/08/07 18:22ID:???for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
if ( $i == 3 ){
print "$i回目終了できず<br>";
真であればこの後の処理をループして4回目に移行
}
print "$i回目終了<br>";
}
って残りの処理をelseに書けばいいんですよね;
でももっとなんか強制的に次回に移行するようなのってないですかね?
0425nobodyさん
04/08/07 18:26ID:???0429nobodyさん
04/08/07 18:38ID:???jsの
for( i in obj.array ) 〜
みたいな
0430nobodyさん
04/08/07 18:49ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Loop_Control
>>428
後置 foreach は 5.005 で実装されたので記憶違いだろう。
http://perldoc.com/perl5.8.4/pod/perl5005delta.html#EXPR-foreach-EXPR-is-supported
>>429
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Foreach_Loops
0432423
04/08/07 19:19ID:???for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
/3/ && print "$i回目終了できず<br>" && next;
print "$i回目終了<br>";
}
できました!ありがとうございました。
0433nobodyさん
04/08/07 20:37ID:pd//1imi★あなたのHPのアドレス長くて憶えられません!
【独自ドメインでホームページを作るならここ!】
A:無難なサーバー。 お勧め!!
http://www.webspeed.ne.jp/
http://www.wadax.ne.jp/
http://www.ktplan.ne.jp/
http://domainya.net/
http://www.cpi.ad.jp/
http://solid.ad.jp/
B:ある程度の障害は大目に。
http://www.binboserver.com/
http://s55.net/
http://www.j-navi.com/
http://www.wakuwaku.ne.jp/
http://www.j-speed.net/main/
http://www.cyberjellyfish.com/
0435nobodyさん
04/08/08 00:09ID:???0436nobodyさん
04/08/08 06:38ID:???っていうか付属ドキュメント読めたらCGIレベルでのコーディングスレなんかいらねよ。
0438nobodyさん
04/08/08 10:16ID:???入力しないと終わらないもの(例えば"tail -f")をPerlで取り込んで
webで表示したいのですが、方法はありませんか?
open(AA,"コマンド|")で取り込んだ場合、コマンドが終了しないために
うまく取り込めないようで困っております。
0441nobodyさん
04/08/08 12:19ID:???ログが増える度に画面更新して欲しい
・定期的にクライアント側で更新 -> javascript + tail
・サーバから垂れ流したい
-> ログチェック用のデーモン作成。Java Flash等コネクションを貼れるものを使う。
0442nobodyさん
04/08/08 14:31ID:???コマンドはなんでもいいとして、キーボードからの入力で終わるコマンドを取り込む場合はどうすりゃいいんだろね。
0443nobodyさん
04/08/08 14:50ID:???0444nobodyさん
04/08/08 15:44ID:???<q cite="http://perldoc.com/perl5.8.4/pod/func/open.html">
You are not allowed to open to a command that pipes both in and out,
but see IPC::Open2, IPC::Open3, and perlipc/"Bidirectional Communication
with Another Process" for alternatives.
</q>
0445nobodyさん
04/08/08 17:47ID:???ここは日本人が見るスレなんだから他国語じゃ通じないよ。
正直おまいみたいに頭のいいやつはこのスレで質問しない。でもおまいみたいに頭のいいやつがいないと
このスレは成立しない。だからやさしくしてね^^
0447nobodyさん
04/08/08 18:29ID:???0448nobodyさん
04/08/08 18:37ID:???英語が読めないとほざくバカチョン様へ
まずは、コード例をみてみましょう。
そして気になるところがあったら、その部分の解説英文をコピーして、
http://www.excite.co.jp/world/english/
に貼り付けてみましょう。
バカチョンな訳しかできないけれども、それなりに真意は読めてきます。
気をつけるところは大文字の MUST や MAY などの大文字を小文字に変換してみましょう。
あとは脳内で「日本語置換」するのではなく、「英文を感じ取る」のです。
と、ここまで書いてみたところで、バカチョン様には無理でしょうねぇ。
0449nobodyさん
04/08/08 18:49ID:???>>6
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_open_FILEHANDLE_MODE_LIST
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_open_a_pipe_both_to_an
0450nobodyさん
04/08/08 18:51ID:???$aが未定義であれば代入するっていうunlessを使った処理だけど、
たいていのリファレンスサイトではこの処理を↓で説明してるよね。
unless ( $a ){ $a = 1 }
簡単な処理の場合は一行目の書き方のほうがいいと思うんだけど、何故か一行目の書き方も
できると説明してるサイトは見たことない(perl.doc等ならあるだろうけど日本人の作ったサイトでは見てない)。
perlのバージョンによって通用するか異なる書き方だからかな?それともなんかやめておいたほうがいい理由があるのかな?
0451nobodyさん
04/08/08 18:54ID:???0452nobodyさん
04/08/08 18:56ID:???0453445
04/08/08 18:57ID:???俺は何も質問してないよ;
>>446
で、試しに>>444と同じ事を日本語で説明してるサイト探してみなよ。
面倒くさくないか?
>>447
せっかくの回答者に暴言吐くな
>>448
今度疑問があったときにやってみるね。
0454nobodyさん
04/08/08 18:57ID:???0455nobodyさん
04/08/08 18:58ID:???thx
0457!445
04/08/08 19:17ID:???甘ったれ過ぎだろ。赤ん坊か?カスどもめ。
0458nobodyさん
04/08/08 19:18ID:???0459nobodyさん
04/08/08 20:00ID:alTDDsx/特定のポートに接続があったら,スクリプトを起動すると言うことは可能でしょうか?
0461459
04/08/08 20:08ID:alTDDsx/ということは,例えば,メールを受信したらスクリプトが起動するという処理も
可能と言うことですよね?
0462nobodyさん
04/08/08 20:11ID:???可能。
サンプル ttp://www.fc-lab.com/network/program/inetd/
「inetd」でググった最初のページにあった。
0464nobodyさん
04/08/08 20:36ID:???0466nobodyさん
04/08/08 21:57ID:???inetd でどうやって「メールを受信した」が判別出来るのかを考えてみましょう。
smtp は、あくまでも「中継」だからねぇ。
個人的には .qmail に | を入れているけれども。
♪ウイルスチェックと、新着ウイルス DAT 情報から dat ファイルを取りに行くスクリプトなどなど。
0467nobodyさん
04/08/09 06:45ID:???0469nobodyさん
04/08/09 08:33ID:???真面目に相手をしてあげすぎなんじゃない?
いいやつなゆえだろうけど、気楽にいこうよ。
0470nobodyさん
04/08/09 08:43ID:???それとも、ちゃんと作れば大丈夫?
0473nobodyさん
04/08/09 09:13ID:???0474nobodyさん
04/08/09 09:15ID:???それはPerl云々よりもOSの問題もあると思うが。
Perl自体は妙な使い方をしないかぎり平気。メモリはちゃんと管理してくれる。
0475nobodyさん
04/08/09 10:10ID:???0477nobodyさん
04/08/09 11:24ID:???0478nobodyさん
04/08/09 15:37ID:???Perlはメモリの管理はしっかりしてるが、一度確保したメモリは終了まで保持される模様。
巨大なメモリが必要なところは、forkして子プロでやるのが吉。
0480sage
04/08/09 17:15ID:17VOmc59======
/folder1/
/folder2/
/folder3/
/file1/test.txt
/file1/test00.txt
/folder2/aa.txt
/folder2/
======
と、フォルダ名、ファイル名がガガっと書いてあります。
カウントしたいものは、
/folder1/
/folder2/
/file1/test.txt
へのアクセス回数です。ということで、
%count =("/folder1/"=>0,"/folder2/"=>0,"/file1/test.txt"=>0);という連想配列を作成しました。
ファイルオープン→それぞれの行を@log_gyouに入れて
while (($key,$value) = each %count){
if ($log_gyou[$cc] =~ /^$key/){
$count{$key}=$value+1;
last;
}
}
$ccを行数分繰り返してます。
結果は、カウント数がおかしいです。自分で目でカウントしたものより、少なく出ています。
連想配列のキーに、「/」とか「.」は使えない??と思いましたが、それならエラーになりますよね??
でも、やっぱ使わない方が良いんですか?
どこか、おかしなところがあったら、教えてください。
0481子プロ哲哉
04/08/09 17:15ID:???0483nobodyさん
04/08/09 17:33ID:???0484nobodyさん
04/08/09 17:35ID:???eachを使ったループを途中でlastで抜けて最後まで
使ってないので、次の回でeachがリセットされてない
ためと思われる。
この構造でいきたいなら、keysかvaluesでリセットすれ。
0485nobodyさん
04/08/09 17:41ID:???>>484さん。解決できました!!
すううげええぇえええぇえ!!
一瞬でわかっちゃう人が居るんですね!
ありがとうございました!ぺこり。
0488486
04/08/09 19:33ID:???0489nobodyさん
04/08/09 22:22ID:???0490nobodyさん
04/08/09 22:27ID:???0491nobodyさん
04/08/09 22:37ID:???必要なくなったらってことだよ
{ my $var = 1111111; }
$varはブロックを出るときに、開放されるのかってことが聞きたい
0492nobodyさん
04/08/09 23:03ID:???undefしたりスコープから抜けるとPerlが空きブロックだと認識して、別の変数でそこのメモリ空間を再利用するだけ。
0495nobodyさん
04/08/10 12:44ID:???0496nobodyさん
04/08/10 13:46ID:???外から見れば取りっぱなしなので解放されないともいえるという
玉虫色の解釈でいいと思われ。
0497nobodyさん
04/08/10 16:56ID:Rp3Iu5NLprint<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_COCUMENT
をコンパイルすると必ず
>C:\httpd\cgi-bin>perl 52.pl
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3.
というエラーが出てきます。解決方法知っている方教えてください。
0498nobodyさん
04/08/10 17:02ID:???メッセージの意味は
「ターミネータの "HTML_DOCUMENT" が EOF まで行っても
見つからないよ、うわーん」なので、
最後の
> HTML_COCUMENT
こきゅめんと を どきゅめんと に変える、とか。
あと、
> content-type: text/html
この辺、調べなおしたほうがよいです。
0500nobodyさん
04/08/10 17:13ID:Rp3Iu5NLレス有難うございます。
こきゅめんとをどきゅめんとにしましたが
それでも上手くいきません・・・。
#!/usr/bin/perl
print<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
> content-type: text/html
をどうしたらよいのでしょうか?
0501498
04/08/10 17:24ID:???どことかぶってるの?(丸投げスレでヘンなことになったしさ)
>>500
> 上手くいきません
の内容を書かないと伝わらないですよ。
手元の環境では、 perl -wc test.pl しても OK 出るし、
perl test.pl で標準出力に表示してくれます。
>>497のエラーは出なくなってると思うんですけど…。
0502498
04/08/10 17:33ID:???> content-type: text/html
\n\nがついてるのを見慣れすぎてただけです。すいません_| ̄|○
0503nobodyさん
04/08/10 17:57ID:???http://pc5.2ch.net/test/read.cgi/tech/1090889189/278
0504nobodyさん
04/08/10 17:57ID:Rp3Iu5NLprint <<HTML_DOCUMENT;
content-type:text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
をC:\httpd\cgi-bin>perl 52.pl でコンパイルしていますが
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3
. となり上手く行きませんほかにコンパイル方法あるのでしょうか?
0506nobodyさん
04/08/10 19:29ID:???ヒアドキュメントの終端識別子の後には空白行が必要。正確には空白でなくてもいいが、
ファイルの最後の行数=終端識別子のある行数ではエラーになる。
で、コピーして動作確認したが何のエラーもなく表示されたぞ?おまいは何だ?
0507nobodyさん
04/08/10 19:43ID:???これを含まないで一発で取得する方法ってありますか?
あとで拡張子等を評価するってのは思い付くのですが
何か無駄なような気がするので質問させてもらいました。
0508nobodyさん
04/08/10 20:22ID:???> ヒアドキュメントの終端識別子の後には空白行が必要。
不要。終端文字列の前後に余計な空白文字があるのは NG だが。
>>507
http://perldoc.com/perl5.8.4/pod/func/readdir.html
my @file = grep /^\.\.?\z/, readdir DIR;
0509nobodyさん
04/08/10 21:41ID:???ちゃんと最後まで読んでよ。
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
って言ってるじゃないのよ。まあ初めが語弊のある言い方だったけどさ。
0510nobodyさん
04/08/10 22:26ID:???終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
>509はそういうことが言いたいのか?俺にも今ひとつ分からんかったのだが・・・
>>508
「.」と「..」を含まないでって言ってんのに、それじゃあ「.」と「..」しか得られん。
my @file = grep !/^\.\.?$/, readdir DIR;
では?
0511nobodyさん
04/08/10 22:40ID:???print <<EOF;
here-document.
EOF
この三行で普通に動くが?
ヒアドキュメントの終端は「終端文字列だけから成る*行*」でなければ
ならないので、終端文字列の後ろに改行は必要だが、それ以下には
何ら必要でない。
>>510
訂正ありがとう。
0514nobodyさん
04/08/11 04:28ID:???$a{aa} = 1;
------------------
my $a;
$a{aa} = 1;
------------------
my $a;
$a->{aa} = 1;
の違いがイマイチ分かりません。
解説してる所とか無いですか?
0516nobodyさん
04/08/11 04:37ID:???二番目はありえない気ガス
0518nobodyさん
04/08/11 08:46ID:???真ん中はスカラー変数$aをmyにしてるが、2行めは%aへの操作で
別にエラーになるような間違いじゃないがその2行はなんの関連
もない。
下はスカラー変数$aがmyになっていて、最初はundefが入っているが、
$a->{aa}=1;したときに自動的に無名ハッシュが生成されてその
リファレンスが$aに入る。で、その無名ハッシュのキーaaに対応
する値が1になる。
0519509
04/08/11 09:33ID:???>>510-511
>終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
だから
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
と同じ意味だろ。改行いれずにどうやって
ファイルの最後の行数!=終端識別子のある行数
にするの?
>>513
行数がわからないと、文法チェックもできないからちゃんと勉強しれ。
0520nobodyさん
04/08/11 09:52ID:???>>506 での "空白行" が >>508 では "空白文字" と捉えられてる。
空行とか改行文字って表現にしたほうが良かったんじゃない? > 語弊の原因
# 空白行ってあまり聴かないし
0521黒死犬 ◆EgxBlf8nvc
04/08/11 11:59ID:???>>519
うちの環境だと、それでもエラーになりませんが・・・
でも前のバージョンでエラーになった覚えがあるので、ひょっとしたら改善されたのかもしれません
0522nobodyさん
04/08/11 12:30ID:???確かにふつーは空行だな。
でも空行ってのは行頭に\nがあるわけで、この場合必要ない。
必要なのは終端識別子の末尾の改行。
そこでファイルエンドなら問題ない。
>>519
>>ファイルの最後の行数=終端識別子のある行数ではエラーになる
>と同じ意味だろ。
とか言われても、お前にしか通じん言葉では同意は得られんと思うが?
行数じゃなくて行番号ならまだしも。
ただ、
HTML_DOCUMENT[\n]
[EOF]
となっている場合、終端識別子の行がファイルの最終行なわけだが、
これなら改行が入っているから問題ない。
一部のエディタじゃ[EOF]にも行番号が表示されるから、そこが最終行だと
勘違いしてんじゃねえのか?
0524nobodyさん
04/08/11 13:02ID:???$value =~ s/1/1/g;
みたいなのを1〜9まで繰り返すしか思いつかないのですが、一発でやるようなコーディングはありませんか?
0525nobodyさん
04/08/11 13:41ID:???0528nobodyさん
04/08/11 15:05ID:???$ref_exchange = ['0','1','2','3','4','5','6','7','8','9'];
$value =~ s/$ref_exchange->[$_]/$_/g for 0..9;
printf "%s\n", $value;
かなりお間抜けかも、、、
0529nobodyさん
04/08/11 15:17ID:???プラス、マイナスとかのこと?
print pack "c*" 0xa4,0xa2;
print pack "C*" 0xa4,0xa2;
EUCだと両方「あ」って表示されて差がわかりません。おながいします。
0530nobodyさん
04/08/11 15:42ID:???use Jcode;
$value = '1234567890';
$value = Jcode->new($value)->tr('0-9', '0-9')->euc;
print $value, "\n";
または
use utf8;
use encoding 'euc-jp', Filter=>1;
$value = '1234567890';
$value =~ tr/0-9/0-9/;
print $value, "\n";
0531nobodyさん
04/08/11 15:47ID:???packするときは違いがでない。unpackすると違いが出る。
print unpack "c*", "\xff";
print unpack "C*", "\xff";
0533529
04/08/11 16:09ID:???print unpack "c*", "\xaf";
print unpack "C*", "\xaf";
だと
-81
175
で
print unpack "c*", "\x7f";
print unpack "C*", "\x7f";
だと
127
127
で同じ。一体どういう仕組みですか?
0534529
04/08/11 16:13ID:???print unpack "C*", "0xff";
print qq\<br>\;
print unpack "C*", 0xff;
print qq\<br>\;
print unpack "C*", "\xff";
print qq\<br>\;
print unpack "C*", \xff;
は
48120102102
505353
255
83676576658240481204957555350489941
になるんですが、どうしてクォートありなし、\xと0xで違うものになるんでしょうか?
\xは0xと同じ意味だと思ってたのですが。
0535nobodyさん
04/08/11 16:15ID:???Perlじゃないけどこんなページ見つけた
ttp://www.kab-studio.biz/Programing/PragmaTwice/Main/056.html
0536524
04/08/11 16:16ID:???Jcodeは使ったことないので多分自宅のテスト環境用のactiveperl5.6.613には入ってないと思いますが
ppmを使ってインストールができるモジュールなのでしょうか?鯖(joe's)でも使えるか確認してみます。
0538529
04/08/11 16:58ID:???符号あり-128〜127
符号なしは0〜255
16進数二桁だとこんなかんじなんですね^^mysqlのtinyintと同じ感じ。
わかりやすいサイトでした。534については載ってませんでした。
0539nobodyさん
04/08/11 17:31ID:???perlのリテラルについてよく勉強しろ。
"0xff"
'0', 'x', 'f', 'f'の4文字からなる文字列
48120102102
'0'の文字コード48, 'x'の文字コード120,
'f'の文字コード102, 'f'の文字コード102
がくっついて出力された
0xff
16進数のff=10進数の255
505353
255がまず文字列に変換され、各桁の文字コード
'2'が50と'5'が53がくっついて出力された
"\xff"はいいだろう。
\xff
裸の文字列リテラルxffの前に\演算子がついて
それのリファレンスをとったことになる。
83676576658240481204957555350489941
スカラーのリファレンスは文字列に変換すると
SCALAR(0xほげほげ)と変換される。(0xほげほげ
はポインタかなんかを16進表示したもの)
'S'は83,'C'は67,...(以下略)
0540nobodyさん
04/08/11 17:36ID:???RGBフォーマット(ベタイメージ)の画像があるのですが、
(サイズや色数情報などば別の変数に持っています)
これをPNGとして書き出すのにいい方法はありませんか。
テンポラリファイル等はできるだけ作りたくないのですが。
とりあえず新しくImage::Magickオブジェクトを作ったあと、
SizeとDepthをセットしunpackでforで1ピクセルずつ16進表記に直してSetした後、
Writeする方法でやってみたのですが、
1ピクセルずつSetを行うととんでもなく遅いので…
0541nobodyさん
04/08/11 17:37ID:???○forで1ピクセルずつunpackで16進表記に直してから
0543529
04/08/11 18:31ID:???非常にわかりやすい説明ありがとうございます。
ところで"\xff"はどういう感じなのでしょうか?
print "\xff"とするとEUCでは「・」だけ表示されます。
0xff → 先に255に変換されてから関数に渡される。
"\xff" → 255に変換せずに16進数のffという値を関数に渡している。
であってますよね?
0544nobodyさん
04/08/11 18:49ID:???"\xff"は16進数のff(=10進の255)1バイトからなる
文字列。
これはEUCとしては使ってない部分なので、なにか
表示されるとしても苦し紛れになんか出してるだけ
だと思うよ。
0545nobodyさん
04/08/11 18:53ID:???foreach my $foo (@array){
$foo=~s/aaa/bbb/;
}
とすると@arrayに書き戻せないですよね?
for (my $i=0; $i >= @#array; ++$i){
$array[i]=~s/aaa/bbb/
}
これでいけると思うんですけど、ほかにシンプルな方法はありますか?
0547nobodyさん
04/08/11 19:45ID:???0548nobodyさん
04/08/11 19:47ID:???思い込みで試してなかったんですが
やってみたらうまくいきました
ポケットリファレンスを見て書き戻せないのかなぁと勘違いしてて
今オライリーで見直したらこの書き方でいけるってのがわかりました
0549529
04/08/11 19:48ID:???ありがとうございます。いろんなサイトのpack,unpackの解説をみてますがやっと少しだけ理解できました。
print unpack"C*","\x41";
これは10進の65に当てられている文字列Aを10進の65に変換して返してるんですね。なので
print unpack"C*","A";
と同じ。でその逆がprint pack "C*",65;ってわけですね。
でもchar値int値long値short値というのは具体的にどういうものかがわかりません。
char値とは16進2桁、2進で言うと8桁=8ビット???自分で言っててよくわかりませんorz
pack TEMPLATE,LIST;
LISTをTEMPLATEのフォーマットでパックするみたいに解説されてますが、例えばH型(16進文字列)なら
"\x41" eq pack "H",41 で、内部的な流れも理解できる気がします。
C型はLISTを10進数での文字列で捉える?それを16進文字列に変換して返すみたいな・・・
なんか違いますよね。char値があってそれを利用してpackで10進数から16進数文字列に変換できるだけで
元々char値をそんなためにあるわけでもないですよね?
ぐぐてもchar値とはみたいなサイトが見つからないんですよねorz
0550nobodyさん
04/08/11 19:57ID:???おおこれは便利
0551529
04/08/11 19:57ID:???char値 符号付
10進で言えば -128〜127
int値 符号付
10進で言えば -2147483648〜2147483647
short値 符号付
10進で言えば 不明
long値 符号付
10進で言えば 不明
結局扱える大きさが違うだけですか?でもそうなるとpackの型のC等の意味と内部的な処理内容がよくわかんないんですよね。
だんだんスレ違いになってきたので、後は自分で色々なサイトを読んでみます。
親切に対応してくださってありがとうございました。失礼します。
0552nobodyさん
04/08/11 20:04ID:???blobToimageでやってみました。
なぜかRGBでblobToimageやるとうまくいかないので、
PPMでやってヘッダだけ付け足したらできました。
まともな速さになりました。ありがとうございました。
0553nobodyさん
04/08/11 20:09ID:???これって漏れも初めて知ったんだけど怖くない?
map s/kuroguro/hage/,@family;
妄想の中で家族が全員はげたところを創造してみたら、現実にみんなはげちゃったーーーーー
って冗談じゃなく怖いな。
0554nobodyさん
04/08/11 21:10ID:???%83%7E%83P%83l%83R
みたいになってますが、これは何エンコードなのでしょうか?
同じ形式でエンコードしたいのですが
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;
では同じ形式にはならないです。(URIエンコードで調べて見つけたサイトに乗ってたコードです)
ちなみに
$value = '%83%7E%83P%83l%83R';
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
print $value;
>ミケネコ
です。
0555nobodyさん
04/08/11 21:16ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep()やmap()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文の
こと)を使うことは避けましょう。そういった関数はすべて戻り値を
持っているのですから、それを使うべきです。戻り値に用がない
のであれば、代わりにforeach()を使ったループか system()関数
を使いましょう。
</q>
s/aaa/bbb/ for @foo;
>>554
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
0556nobodyさん
04/08/11 21:16ID:???は戻値のためにバッファ用意されんのが無駄。
戻値いらんのなら、
s/aaa/bbb/ for @foo;
でええやろ。
0557556
04/08/11 21:17ID:???0559554
04/08/12 00:07ID:???そのサイトを見て自分でやってみましたが、
$str = "ミケネコ";
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;
では
%83%7E%83P%83l%83R
になりませんがどうすればよいですか?
0561nobodyさん
04/08/12 00:19ID:???0562nobodyさん
04/08/12 00:22ID:???ではヤダ、って話じゃないのかしら?
0565nobodyさん
04/08/12 01:02ID:???になってしまう。という話かもしれん。
0566nobodyさん
04/08/12 01:59ID:???map s/aaa/bbb/, @foo;
は生理的に気持ち悪いんだよ。
そんなこと気にも止めんorそこまで手の回らん奴には
分からん感覚さね。
速度が欲しけりゃCで書け。
0567nobodyさん
04/08/12 02:03ID:???お前が生理的に気持ち悪いだけだろ?
オレはそれは一種のイディオムだと思ってるので
別に読みにくいとは思わんし気持ち悪くもないよ。
0568nobodyさん
04/08/12 02:10ID:???可読性まで考えてっておかしくないか?
map { ブロック } リスト は普通の書き方だろ。
単にmapを使い慣れていないから見慣れないものを
気持ち悪いことにしてるとしか思えない。
0569nobodyさん
04/08/12 02:25ID:???つーのもあるわな。(非効率)
0571nobodyさん
04/08/12 02:43ID:???0572nobodyさん
04/08/12 02:47ID:???今回の問題でmapを使うのは変わった書き方と言われてるぞ(ゲラ
0575566
04/08/12 04:08ID:???書き方の問題じゃねえっての。理由は555に書いてあんだろ。
mapにはmapの使いどころってもんがあんの。
何でもmap使えばいいってもんじゃねえのよ。
仕事で人のコード読んだりコードレビューだのが増えてくると
自然と身につくんだよ。そういう感覚が。
0576nobodyさん
04/08/12 07:52ID:???0577554
04/08/12 10:02ID:???これはshift_jisだったんですね;すみませんでした。
ところでShift_JISの「ケ」は83Pになるみたいですが、これはどういうことでしょうか?
文字コード表を見てみたら、0x83,0x4Fの「グ」の一つ右側にあるので
0x83,0x4F+1で0x50?になるのかと思ってたんですが、0x83Pなんですね。
$str =~ s/([0-9a-fA-F][0-9a-fA-F])/pack("C",hex $1)/eg;
これでデコードするときにPは置換されませんよね?0x83で返してくる値にPを付けると
shift_jisではケになるんですか?ケの2バイト目は他とは違う扱い方がされてるんでしょうか?
0578554
04/08/12 10:04ID:???パーセントが抜けててごめんなさい。
0579nobodyさん
04/08/12 10:05ID:???つーかアスキーコード表読めよ
0581nobodyさん
04/08/12 10:07ID:???0582nobodyさん
04/08/12 10:15ID:???Perlは大規模開発に向かないって誰が言ったんだろうね?
Perlの言語仕様なら何の問題も無いと思うんだけど。
0583nobodyさん
04/08/12 10:25ID:???0584nobodyさん
04/08/12 10:35ID:???0585nobodyさん
04/08/12 10:37ID:???0587nobodyさん
04/08/12 10:40ID:???カプセル化という名の強制隠蔽は、技術者のレベルと意識の低さを
言語仕様で補おうというもの。
決められたルールに厳重に従ってコーディングされるならば、
カプセル化は必要ない。
0588nobodyさん
04/08/12 10:49ID:???だから仕事でもPerlを使ってる。
さっさと作って儲けるのが第一なんで。
0589nobodyさん
04/08/12 10:51ID:???0590nobodyさん
04/08/12 11:05ID:???必死だなw
藻前らもうPerlのスレには来んでええぞ
0592554
04/08/12 11:38ID:???ありがとうございます。しかしそれだと何故に
%83%7E%83P%83l%83R
が
%83%7E%83%P%83%l%83%R
にならないんでしょうか?「ミ」の文字はちゃんとバイトの前に%が付いているのに。
0593nobodyさん
04/08/12 12:10ID:???URLエンコーディングについて理解して下さい。
自分で何も出来ないんですか?
http://www.mars.dti.ne.jp/~torao/rfc/rfc1738-ja.txt
0594554
04/08/12 13:43ID:???ありがとうございます。読んでみましたが、
>付加的に、8ビット文字は文字 "%" に続く 8ビット文字の 16進数値となる 2
>つの 16進数 ("0123456789ABCDEF") の 3文字により符号化される。(文字
>"abcdef" も 16進数符号化で使われるだろう。)
やはり%が付くと思うんですが、どうして%83%Pにでなく%83Pなのか理解できません
もしかして、元々shift_jisの「ケ」は"\x83","\x50"ですが、エンコード処理中に
先に"\x83"だけ置換されて、次は"\x50"になる。そしてその時に"\x50"=Pなので
/(\W)/単語構成文字以外に一致
Pは単語構成文字なので一致せずに処理が行われない。だから%もつかない。
そしてデコードでも処理はされないけど
"\x80","\x50"をshift_jisで読むと「ケ」と解釈する。
!?これで正解ですよね?
0595nobodyさん
04/08/12 14:43ID:???8ビット文字は、もしそれらが US-ASCII コード文字セット内の印字可能な文
字でない場合、その文字の使用が安全でない場合、もしくはそれが特殊な URL
スキーム内で何か別の処理のために予約されている場合に符号化されなければ
ならない。
印字可能な文字でないとは:
URL は US-ASCII コード文字セットの印字可能な文字でのみ記述される。8
ビット文字の 80-FF は US-ASCII で使われていない。そして 8ビット文字
00-1F と 7F は制御文字に相当する。これらは符号化されなければならない。
さっきの所のコピペ
0597nobodyさん
04/08/12 16:05ID:???$dbh = DBI->connect ($dsn,$user,$password,{ AutoCommit => 0 , RaiseError => 1 });
$sth = $dbh->prepare(
qq|select * from test|
);
$sth->execute;
@a = $sth->fetchrow_array;
jcode::convert(\$_ , "euc" ) foreach @a;
print $_,"<br>" foreach @a;
$dbh->disconnect;
みたいにしてtestテーブルから全レコードを引き出そうと思ったんだけど、何故か1行しか取り出せない。
一気に全レコード取り出すにはどうやればいいの?
0598nobodyさん
04/08/12 16:12ID:???0599nobodyさん
04/08/12 16:26ID:???fetchrow_array は、
DBの1レコードを1つの array にして取り出すメソッドで、
array の各要素には1レコード中の各フィールドが入る
全レコードを取り出すときには >>598 のようにやるか
あるいは while で回すか
0600597
04/08/12 17:02ID:???selectall_arrayrefがレコード全部をスカラで返してくるのかな?
でもこれSQL文を引数にしるんだな。なんかprepareしたいけど。
>>599
そういうことね。わかりやすい説明thx
ところでprepareって元々何のためあるの?XSS対策にサニタイジングしてくれるわけではないでしょ?
なんかprepareしておいたほうが安全だよって話をよく聞くんだけど。
0602597
04/08/12 17:29ID:???ありがととりあえず
$a = $sth->fetchall_arrayref;
から試したけど、この子はリファレンスの中にリファレンスでさらにリファレンス(これがfeachrow_arrayかな)が入ってるのね。
MySQLの中身がShift_JISで、perlはeucで出力はShift_JISだからちょっと面倒;
とにかくthx!
0603nobodyさん
04/08/12 17:36ID:???暇だからコーディングしちゃった^^
for ( $i=0 ; $i<$#{$a} ; $i++ ){
jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
0604nobodyさん
04/08/12 17:39ID:???か
$i<@$a
じゃない?
0605nobodyさん
04/08/12 17:40ID:???shell>perl -e "@array=qw/1 2 3 4 5/;
while(@array){print}"
とかしたことある?
0607nobodyさん
04/08/12 17:46ID:???この場合インデックスはいらないと思うので、
foreach (@$a) {
foreach (@$_) {
Jcode::convert(\$_, 'euc');
}
}
でいいんでねーの?
0608597
04/08/12 17:56ID:???せっかくだから遣わしてもらおうと思ったら
for ( $i=0 ; $i<=@{$a} ; $i++ ){
jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
多分こう書いた。
ループから抜けられず延々HDDがガリガリ(表現悪いけど、処理してる音);
なんとか再起動できたけど、よくエラーにならなかったなとceleron2.7GHz/xp
のすごさを確認したよw
ていうかなんでループから抜けられなかったんだ?もしかしたら
$i=@{$a}
って書いちゃったのかも;
0610597
04/08/12 18:04ID:???それの方が安全そうwと思って試したけどできんかったよ?
それの後に
print $a;
で何も表示されず(リファレンスが表示されると思ったけど)
print @{$a};
でも何も表示なし・・・(リファレンスの配列が・・・)
print @[$a->[0]};
やっぱりだめで何も表示されず・・・・(実際のレコードの中身が・・・・)
603のやつではちゃんと表示されるけど、デリファレンスの方法が違うん?
0612nobodyさん
04/08/12 18:15ID:???その配列無限拡張って何かに使えないかな。
もちろんブロックの中に
last if @$a == 20;
みたいな制限をつけて。
0613nobodyさん
04/08/12 18:32ID:???0614nobodyさん
04/08/12 18:36ID:???いくつ拡張するかが未定な時には?
一応最大長は決めるが最小長は決めないみたいな場合なんかにつかえるかなと・・・;
駄目か。ごめんよ。
0615nobodyさん
04/08/12 19:45ID:???確か
selectall_arrayref()
ってちゃんとprepareされてるよ。自分でやるか自動でやるかの違い。
http://ash.jp/db/dbi_dbd.htm
でも配列よりハッシュで取り出したいよね。columns_nameをハッシュのキーにして。
$sth->fetchrow_hashref()
みたいなのがあると便利なんだけどしゃ。
0616nobodyさん
04/08/12 19:58ID:???http://search.cpan.org/~timb/DBI-1.43/DBI.pm#fetchrow_hashref
0617nobodyさん
04/08/12 21:16ID:???0619nobodyさん
04/08/12 23:04ID:???フェッチ?フィーチ?なんかの略だよね?
0620nobodyさん
04/08/12 23:06ID:???fetch で辞書に載ってますよ。略語でなく。
たぶんフェッチが一般的だけど、読み方は好みで可。
スレ違っててごめんなさい...orz
0621nobodyさん
04/08/12 23:12ID:???>>566,567だけみるとそういう風に誤解されやすそうだけど。
ちゃんと元の投稿>>545 から関連する部分を読んでみよう。
0622nobodyさん
04/08/12 23:25ID:???0625nobodyさん
04/08/12 23:49ID:???http://d.hatena.ne.jp/keyword/perl
あとどっかの記事によると国内のBlogレンタルサービスはほとんどスクリプト言語で書かれてるんだそうで
0626nobodyさん
04/08/12 23:51ID:???べきとかって、StrictHTMLじゃないんだから処理効率を最優先させることを非難してもしょうがないよ。
とりあえずもういいんじゃなかなこの話題は。自分の環境にあわせて好きにしようってことでさ。
一応俺の個人的な意見は、「どっちでもいい」だね。まあforeachの処理速度がmapより遅いからね。おやすみ
0627nobodyさん
04/08/13 00:17ID:???個人で遊んでるんだから好きにさせて
0628nobodyさん
04/08/13 00:23ID:???>処理効率を最優先させることを非難してもしょうがないよ。
Perl使っときながら処理効率?はぁ?
んなこと言ってる奴のコードには必ずと言っていいほど
他に見直すべき部分があるんだよな。
>>622
>@foo = map s/aaa/bbb/, @foo;
mapによって@fooは置換済みなのに何で入れ直すの?
mapの動作理解してるか?
0629570
04/08/13 00:29ID:???なんか可読性だけで遅いってことになっているような。
use Benchmark;
timethese(-3,
{
map => sub{
my @list = 1..1000;
map { $_ *= 2 } @list;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
},
}
);
__END__
Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 1504.78/s (n=4725)
map: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.02 CPU) @ 745.27/s (n=2247)
0630nobodyさん
04/08/13 00:35ID:???いるんだよな、まともなアルゴリズムも組めないくせに
最適化とか言って部分的な高速化にこだわる奴。
ま、素人相手にムキになりなさんな。
0631570
04/08/13 00:38ID:???What's wrong with using grep in a void context?
The problem is that grep builds a return list, regardless of the
context. This means you're making Perl go to the trouble of building a
list that you then just throw away. If the list is large, you waste both
time and space. If your intent is to iterate over the list, then use a
for loop for this purpose.
In perls older than 5.8.1, map suffers from this problem as well. But
since 5.8.1, this has been fixed, and map is context aware - in void
context, no lists are constructed.
0632nobodyさん
04/08/13 00:50ID:???同じ事を書こうとして先越されたので、ヴァージョンでの差異も含めて追試。
#--- test.p ---
use Benchmark;
@Str = ((qw(aaa bbb ccc aaabbb cccaaa)) x 100);
timethese(-5, {
for => sub { my @str = @Str; s/aaa/bbb/ for @str },
grep => sub { my @str = @Str; grep s/aaa/bbb/, @str },
map => sub { my @str = @Str; map s/aaa/bbb/, @str },
});
__END__
・ActivePerl 5.8.4 Build 810
for: 6 wallclock secs ( 5.71 usr + 0.00 sys = 5.71 CPU) @ 660.25/s (n=3770)
grep: 6 wallclock secs ( 5.65 usr + 0.00 sys = 5.65 CPU) @ 667.26/s (n=3770)
map: 6 wallclock secs ( 5.49 usr + 0.00 sys = 5.49 CPU) @ 656.83/s (n=3606)
・ActivePerl 5.005_03 Build 522
for: 5 wallclock secs ( 5.06 usr + 0.00 sys = 5.06 CPU) @ 782.81/s (n=3961)
grep: 5 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 808.60/s (n=4043)
map: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 440.33/s (n=2369)
わざわざ副作用を使おうとするひねくれた子には grep を勧める。
「grep より map の方が読み易い」というのは当然無しだよ。:p
0633nobodyさん
04/08/13 01:06ID:???追加ということで。(Vine 3.0)
This is perl, v5.8.2 built for i386-linux-thread-multi
Benchmark: running for, grep, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.28 usr + 0.01 sys = 5.29 CPU) @ 848.77/s (n=4490)
grep: 5 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 808.32/s (n=4276)
map: 21 wallclock secs ( 5.44 usr + 0.02 sys = 5.46 CPU) @ 744.69/s (n=4066)
This is perl, v5.8.5 built for i686-linux
Benchmark: running for, grep, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 1241.79/s (n=6656)
grep: 5 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 1261.10/s (n=6646)
map: 5 wallclock secs ( 5.35 usr + 0.01 sys = 5.36 CPU) @ 1216.98/s (n=6523)
0634nobodyさん
04/08/13 01:10ID:???perl使ってる時点で速度とか捨てろよ
何か反論できなくなるとすぐベンチ厨だもんな
これだからまいるよ
0635nobodyさん
04/08/13 01:20ID:???そらまいるわなw
0636nobodyさん
04/08/13 01:27ID:???自分でも書いているように、
正確には「印字可能」だからではなく、
単に \W にヒットしないからそのままPなだけ。
逆に、符号化する必要のない - とかまで符号化されちゃうけどね。
判って使う分には\Wで手抜きするのもOKなり。
0637nobodyさん
04/08/13 02:22ID:???0638nobodyさん
04/08/13 03:48ID:???戻り値やパフォーマンス、効率、map/forに限らず
副作用を期待したコードは出来るだけ避けた方が良いと思うんだけど。
>>628
>>622はmapの副作用の有無に関わらず、
@fooが変更されたと言うのがコードから読みとれる。
そもそも、そう言った用途にmapを使うなって話なら同意だけど、
もしmapを使うとしたら配列が変更されたのを明示するって例だと思う。
perl以外の言語を使っている立場から見ると、
mapが勝手に配列の要素を変更するのが気持ち悪いんじゃないかな?
例えば次のコード例で、barの引数 @data にはどんな値を期待するか。
foo(map s/A/B/, @data);
bar(@data);
0640nobodyさん
04/08/13 04:23ID:???藻前はTemplate::HTMLとか使わないで全部自分でHTML printするのかと。
0641nobodyさん
04/08/13 05:03ID:???可読性の話だよ。>>555 にあるように Perl コミュニティ的には、
何をしているのか分かり易くする為、副作用のみを利用する
ようなコーディングを奨めていない。
しかし (Perl スクリプトという手段の中で) 速度の為に可読性
を犠牲にしなければならない場面というのは確かにある。でも
そういう時でさえ map でやる意味が無い、という事をベンチ
マークが示している。それを理解できない子が吠えてるだけ。
>>640
HTML::Template の仕様が気持ち悪いから必要充分なものを
再発明、というのはありじゃないかな。
0642nobodyさん
04/08/13 05:18ID:???1.関数の一番最後の式は戻り値になるのでvoid contextじゃない。
2.mapの方だけブロックにするのは不公平。
use Benchmark;
timethese(-3,
{
map => sub{
my @list = 1..1000;
map $_ *= 2, @list;
1;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
1;
},
}
);
Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 1535.91/s (n=4961)
map: 4 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 1577.47/s (n=5111)
0643570
04/08/13 05:33ID:ZD4WTWGN確かにね。投稿してからきずいたよ。
ただ、ベンチとったら633と同じような結果だったからどうでもいいと思ったんだ。
その2点に注意して、
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 1534.68/s (n=7721)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 6 wallclock secs ( 5.50 usr + 0.02 sys = 5.52 CPU) @ 1486.58/s (n=8200)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 1529.42/s (n=8005)
map: 5 wallclock secs ( 5.48 usr + 0.00 sys = 5.48 CPU) @ 1495.26/s (n=8200)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.50 usr + 0.00 sys = 5.50 CPU) @ 1502.36/s (n=8263)
map: 6 wallclock secs ( 5.53 usr + 0.00 sys = 5.53 CPU) @ 1482.28/s (n=8200)
0644nobodyさん
04/08/13 05:44ID:JjTi/TTmまったくの暗中模索状態なので検索ワードだけでもお教えいただければ幸いです。
よろしくおねがいします。
0645nobodyさん
04/08/13 06:03ID:???△▲ WebProg 初心者の質問 Part9 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1086715675/
0646nobodyさん
04/08/13 06:15ID:JjTi/TTmありがとうございます。
過去ログ読んで、ないようなら移動します
0647nobodyさん
04/08/13 07:11ID:???関数自体が無効コンテキストで呼ばれるので、
戻り値を気にする必要はないと思うよ。
Benchmark.pm の runloop() 参照。
0648nobodyさん
04/08/13 09:10ID:???0649nobodyさん
04/08/13 11:56ID:???0650nobodyさん
04/08/13 12:14ID:???ソース公開するってんなら別だが。
Bench取る癖は悪かないが、mapとfor比べたってしょうがないだろ。
複雑な問題解決のためのアプローチの違いとかでやんなさい。
0651nobodyさん
04/08/13 12:35ID:???@math = ("0","1","2","3","4","5","6","7","8","9");
for($i=0;$i<@math;$i++){ $value =~ s/@math[$i]/$i/g }
ダサイ・・・・・・・
for($i=0;$i<10;$++){ $value =~ s/\xa3\xb$i/\x3$i/g }
こんなのがokなら一行ですむのに
0652nobodyさん
04/08/13 12:37ID:???上の方から気になってたんですが、思い切って質問することにしました。
foreachの速さを調べる時はforでベンチ取るんですか?
0654nobodyさん
04/08/13 12:58ID:???Perl では for ループも foreach ループも実体は同じ。
foreach (my $i = 0; $i < 5; $i++) { print $i }
for (5..9) { print }
但し "foreach" 修飾子は存在するが "for" 修飾子は
存在しないので、以下のような事はできない。
print $i for ($i = 0; $i < 5; $i++);
まぁ1つの文に ; が複数出てくる事になるので自明だけど。
0656652
04/08/13 13:16ID:???ありがとうございます。
for(@a){print}
print $_ for @a;
と
foreach(@a){print}
print $_ foreach @a;
両方使えるなんて知りませんでした。なんか今後foreach使わずにforだけでやってしまいそうですが
for(@a){print}ができるならforeachってあまり必要ないと思うんですが、そんなことはありませんか?
0657nobodyさん
04/08/13 13:56ID:???%a=( aa=>1 , a1=>1 , a3=>1 , ax=>1 , a8=>1 , a5=>1 );
このハッシュのキーを正規表現にかけて
/\w\d/
に真がでるキーが3個以上あればそれらに対して
delete $a{hoge};
をしたい。
とりあえずいまのとこ思ってるもの↓
@a = grep/\d\w/,keys %a;
undef $a[0] for 0..1;
delete $a{$_} for @a;
undefに配列スライスが使えないなんて知らなかった;
他にもコーディング案があったらレス下さい。
0658nobodyさん
04/08/13 13:58ID:???これは
undef $a[$_] for 0..1;
の間違いでした。
0659nobodyさん
04/08/13 14:28ID:???delete 対象の優先順位とかは無いの?
if ((my @key = grep /\w\d/, sort keys %a) > 2) {
delete @a{ @key[2..$#key] };
}
0660657
04/08/13 14:47ID:???優先順位はなし。消えればなんでもいい感じ。
delete @a{ @key[2..$#key] };
これいいね!@aってのがミソなのね。知らなかったよ。
ところで全然関係ないことなんだけど、HTMLタグのサニタイジングってどのタイミングでしてる?
今まで受け取って%formを作る際にしてたんだけど、それじゃちょっとよくないから
ちゃんと出力時||使用時にやろうと思うんだけど例えば
$form{hoge} まだサニタイジングしてない状態
$form{hoge} サニタイジング済み
にするべきか
$form{hoge} まだサニタイジングしてない状態
$hramless{hoge} サニタイジング済み
にするべきかなんだけど、やっぱり送られてきたデータの初期状態は残して置くべきだから
後者でやるべきだよね?
でもちょっとに大きくなってきたので(プログラムが)、きついんだよね。
0661nobodyさん
04/08/13 15:01ID:???俺は
read(STDIN.$buffer,$ENV{CONTENT_LENGTH});
foreach(split/&/,$buffer){
my($a,$b)=split/=/;
$b =~ s/%(..)/pack("H",$1)/;
$b =~ s/<>\:\;その他自分のサイトで必要ない記号//g;
$form{$a} =$b;
}
でやってる。いちいちその都度やってるとモジュール化もやりづらい。
0663nobodyさん
04/08/13 15:36ID:???0664nobodyさん
04/08/13 17:32ID:???0665nobodyさん
04/08/13 17:43ID:???呼び出し側からみたら第1っぽいからいんじゃね?
それよりここにいるやつのどれくらいがオブジェクト指向プログラミングできるのかね?
漏れは通販サイトの注文システムを一個の自作モジュールで、面倒andどのページでも使うような
処理をまとめようと思ったが、挫折したorz
どこまでをmainのオブジェクトにやらせて、どこからをモジュール側のオブジェクトにやらせるかの
境界線に苦悩して、最後は状態と振る舞いの境界(意味不明な言い方でごめん)までわからなくなって
結局ライブラリにして終らせた;
むずいんだよ!
0666nobodyさん
04/08/13 17:47ID:???お前はまずオブジェクトを何に見立てるかができてないんだろ?
例えばメインパッケージを注文を電話で聞くお姉さん。
モジュールの方を、お姉さんが使うパソコン。
とかな。まあお姉さんが注文が来るたびにパソコンを買う(new)なんてのはおかしな話だがなw
0667nobodyさん
04/08/13 18:17ID:???$hoge="hoge=1&data=a-a-a&test=23456";
この$valueの中からdata=a-a-aだけを取り出したいです。
data=a-a-aのある位置は毎回違うのでsubstrではできません。
data=に続く文字列も毎回違います。
splitとforeachを使って%formなどを作るのは禁止で、実現したいです。
$hoge =~ s/(data=.*?)&//;
$value = $1;
で一応data=...の後に&がある時は取り出しに成功できますが、
$hoge="hoge=1&data=a-a-a";
などの場合もあるのです。それと
$hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
みたいな場合もあります。
どうにかどんなときでもdata=文字列だけを一発で取り出せないでしょうか?
0668nobodyさん
04/08/13 18:20ID:???if ($hoge =~ /data=.*&/){
$hoge =~ s/(data=.*?)&//;
$value = $1;
}else{
$hoge =~ s/(data=.*)//;
$value = $1;
}
ちと長いな。
0669nobodyさん
04/08/13 18:31ID:???0670nobodyさん
04/08/13 18:32ID:???0671667
04/08/13 18:42ID:???ありがとうございます
/(data=.*?)&?$/
これ不思議なコードですね;どうしてこれでうまくいくのかな。
$は&?にかかってるけど、&がないときは(data=.*?)にかかるって言う便利なコードですか?
・・・すごいですね>>669さんは。本当にすごいです。
0673667
04/08/13 18:48ID:???($value) = $hoge =~ s/(data=.*?)&?$//;
としたいんですが、置換にすると置換数?真偽?が帰ってくるので
$hoge =~ s/(data=.*?)&?$//;
$value = $1;
とするしかありませんか?一行でバチッとできるとカッコイイんですが。
ものすごく>>669さんからの返事が楽しみです^^(頼り切ってすみません;)
0675nobodyさん
04/08/13 19:02ID:???for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
my($value) = $hoge =~ /(?:^|&)(data=[^&]*)(?:&|$)/;
print "$value\n";
}
0677669※
04/08/13 19:03ID:???そして、ハシュを拒否する事由は?
my $hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
my %hash = map +(split /=/), split /&/, $hoge;
printf qq|%s = %s\n|, $_, $hash{$_} foreach keys %hash;
env.:
$ perl5.8.5 -v
This is perl, v5.8.5 built for i686-linux
0680667
04/08/13 19:16ID:???/(?:^|&)(data=[^&]*)(?:&|$)/;
これは>>669さんのやつの変形ですか?でも>>669さんのコードで試したらちゃんと表示されましたよ?
テストが足りないんですかね?もう一度やってみます。
>>677
フォームで送られてくるデータを一度変数に入れて、その後
dataの部分だけをAルーチンに渡して、
それ以外をBルーチンに渡したかったのです。(ルーチンは外部ファイルに作ってあるます)
今はAルーチンとBルーチンの方で、ハッシュにする流れです。先にこちらでハッシュにしてわたしてもいいのですが、
こういうのもできたらカッコイイなと思って質問いたしました。
0682667
04/08/13 19:23ID:???hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
($value) = $hoge =~ /(data=.*?)&?$/;
print "$value<br>";
}
>data=a-a-a&test=23456
>data=a-a-a
>data=a-a-a&test=12345
>>676
さっきはうまくいったと思いましたが、↑のソースでやってみたらうまくいきませんでした;
ちゃんとテストしたつもりが勘違いでした;
>>皆様
もの凄く勉強になりました!本当にありがとうございました!それでは失礼します。
0684nobodyさん
04/08/13 19:37ID:???オブジェクト指向で書く場合は俺はサニタイジングモードを作ってるよ。
sub new {
my $self = shift;
my $buffer = shift;
my %harmless_mode = (
normal => 1,
html => 0,
sql => 0,
csv => 0,
);
みたいなね。(1=on,0=of)
んで状態移行のメソッドを作っておけば一応問題ないかな。まあ俺は小規模プログラムしかやったことないから
大丈夫なだけかもねw
0685nobodyさん
04/08/13 20:13ID:???確かに >>667 のは \b で充分だね。分かって言ってるんだろうけど一応。
for my $hoge (
"hoge=1&data=a-a-a&test=23456",
"hoge=2&a-data=a-a-a&test=12345",
"data=a-a-a\n",
) {
my($value1) = $hoge =~ /\b(data=[^&]*)/;
my($value2) = $hoge =~ /(?:^|&)(data=[^&]*?)(?:&|$)/;
print "1[$value1] 2[$value2]\n";
}
0688nobodyさん
04/08/13 20:55ID:???sub new{
my $this = shift;
my $propety = {
color => shift,
weight => shift,
};
bless $propety,$this;
}
ていうコンストラクタだったとして、あとから他のメソッドで
sub change{
my $this = shift;
$this->{color} = "red";
$this->{changed} = "1";
}
みたいにコンストラクタではなかったchangedっていうプロパティをいきなり作っちゃっていいんですか?
それとも、コンストラクタを
$propety = {
color => shift,
weight => shift,
changed => 0,
};
みたいにするべきでしょうか?そうしてしまうと新しいプロパティがほしくなった時に
わざわざコンストラクタをいじらなければいけなくて、不便かなと思うんですが・・・
0689683
04/08/13 21:00ID:???ウソ!?って思って試してみた。
for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
$str = ($hoge =~ s/\b(data=[^&]*)//, $1);
print "$str\n";
}
PCに入ってるPerlでも動かなかったw
0690nobodyさん
04/08/13 21:25ID:???そのコードの$hogeはReadOnlyな文字列への別名だから、
置換できるわけなかろう。
$hogeをループ先頭でmy $hoge=$_;とすりゃ動いたぞ。(Perl5.8)
#つか、foreachであるべきところをケチってforにすんな、紛らわしい。
ちなみに>>685の問題も回避したい場合、
置換では>>675でもうまくいかんので、
$str = ($hoge =~ s/(?:^|(?<=&))(data=[^&]*)//, $1);
とするといい。
#後ろの(?:&|$)はいらんべ?
0691nobodyさん
04/08/13 21:57ID:???作法として行儀がいいかどうかは別として、blessされてる以外は
ただのハッシュだからキーの追加だろうが削除だろうが自由にでき
ます。
use fields使ってりゃ別だけどな〜
0692688
04/08/13 22:39ID:vpkCloyFできるのは知ってるのですが、どうするのが一番「十分に拡張的なプログラム」なのかで悩んでます。
0693nobodyさん
04/08/13 23:27ID:???一番かどうかはともかく一つのやり方として。
コンストラクタでは何もせず、プロパティは全てアクセサ経由で触り、
初期値はアクセサで設定する。
#--- Foo.pm ---
package Foo;
sub new {
my $class = shift;
bless { @_ }, $class;
}
sub color {
my $self = shift;
@_ or return $self->{'-color'} ||= 'red';
$self->{'-color'} = shift;
$self;
}
1;
#--- script ---
use Foo;
my @obj = (Foo->new, Foo->new(-color => 'green'), Foo->new);
$obj[2]->color('blue');
print $_->color, "\n" for @obj;
0694nobodyさん
04/08/13 23:34ID:Dbtrqa9I喧嘩を売っています
0695nobodyさん
04/08/14 03:15ID:HZTk9WgD普通にファイルオープンの open(AAA,"<BBB.txt") のように開いて
データを取得することが出切るのでしょうか?
検索で、解説ページなどを探したのですが良いサイトが見つかりません。
(探し方が悪いだけかもしれませんが・・・・)
どこか良いサイトなどがありましたら、教えてください。
0696nobodyさん
04/08/14 03:19ID:???0697688
04/08/14 10:22ID:???例まで書いていただいてありがとうございます。
買う時には必要でなかったプロパティが、買ってから途中でほしくなった場合のために
プロパティを後から追加できるオブジェクトメソッドを作っておいたらオブジェクト指向の利点がどこかで
失われてしまいますか?
sub additional_propety {
my $class = shift;
$class->{shift} = shift;
}
第2、第3引数に新規に追加するプロパティとその値を期待します。
0698nobodyさん
04/08/14 10:39ID:???そもそもコンストラクタ(new)を「買う」ことだと思ってる時点で、間違ってるな。
まあよくある解説だけどw
人に置き換えて考えてみ?例えば友達に「ジュース買ってきて」って頼むだろ。
そんでその友達がジュースをkって来るのは友達にはそういう振る舞いができるってこと
で、お前はその友達のインターフェースさえ知っていれば何度でもジュースを買ってきてもらえるんだ(買ってこない友達の状態もあるけどな)。
んでこんな時に new=買う ではおかしいだろ?だから new=自分と同一世界にいると認識する
なわけよ。だから認識さえすれば、人の家のテレビだって使えるわけだ。これが自然。
0699nobodyさん
04/08/14 11:03ID:???0702nobodyさん
04/08/14 15:31ID:???$sub
$exit{for}
ここらへんがPerlのいいところですか?(Perlとmysqlしか知らないのでよくわかりませんが、すくなくともSQLでは予約語はdb_name,tbl_name,columns_nameには使えなかった気がしたので)
0703nobodyさん
04/08/14 15:35ID:???0704nobodyさん
04/08/14 15:52ID:???a => 1,
b => 2,
c => 3,
};
このハッシュのキーと値を「=」でjoinして、さらにそれを「&」でjoinしたいんです。
my @a;
foreach (keys %$test)
{ @a = $_."=".$test->{$_} }
$ok = join '*',@a;
undef @a;
わざわざ@aに一度入れるのが、冗長な気がするんですがいれない方法はありますでしょうか?
0706704
04/08/14 16:03ID:???$a = join "&",map{$_."=".$test->{$_}} keys %$test;
0707nobodyさん
04/08/14 16:24ID:???と
$a == undefined && $a =1;
と
if($a == undefined){ $a == 1 }
これってどれが一般的に可読性がよいのですか?僕は結構真ん中の書き方がすきなのですが
みんなでプログラムを組む時などにはどれを使うと喜ばれますか?
0708nobodyさん
04/08/14 16:27ID:???0711nobodyさん
04/08/14 16:55ID:???0712695
04/08/14 17:13ID:HZTk9WgD見つかりはするんですが、内容が難しかったり、関係無いものだったり・・・
わかりやすいページを見つけるにはどういった単語で検索すれば良いのでしょう?
0713nobodyさん
04/08/14 17:20ID:???undefinedじゃなくてundefだろ。
そういうミスを use strict が警告してくれるんだよ。
ちなみに普通はundefは使わず、それぞれ
$a = 1 if ! defined $a;
defined $a or $a = 1;
if (! defined $a) { $a = 1 }
のようにdefinedを使って書く。
また、if ! の代わりにunlessを使って
$a = 1 unless defined $a;
unless (defined $a) { $a = 1 }
のようにも書けるが、一般的にunlessやuntilなどの否定条件文は理解の
妨げになることが多いので使われない。
if ! より字数が多いのもネック。
で、or(または||)やand(または&&)を利用した「式1 or 式2」のような
記述は、副作用を持つ式1の結果如何で式2を評価するというものなので、
副作用のないただの条件式を式1に使うことはない。
#openがよい例
やるなら後付けif文か通常のif文かだが、今は$a=1しかすることが
なくても、後々他の処理も追加する可能性が少しでもあるなら
通常のif文を使うべき。
長文スマソ
0715nobodyさん
04/08/14 17:27ID:???>見つかりはするんですが、内容が難しかったり、
難しいんじゃなくてそれが普通なんだよ。
藻前には無理ってことだからあきらめろ。
0716nobodyさん
04/08/14 17:45ID:???undefined間違えてすみません。
でも聞く限りではuse strictはやっぱり無駄なモジュールなんですね。
一応文法チェックかけるんでそれで十分だと思います。というか何故に毎回そんなモジュールを読み込む必要が
あるのか?です。なんかアフォぽです。
0719nobodyさん
04/08/14 17:55ID:???はstrict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、
$a == undefinedとか書いちゃうようなバカにはちょっと遅いくらいが
ちょうどいいと思いますよ。ほんと。
0721nobodyさん
04/08/14 18:07ID:???use strict; に厳しい添削をしてもらって完成したコードが
エラーや警告出なくなったらお引取り願えばいいことも
わからないバカは(ry
0724711
04/08/14 18:15ID:???@a = qw/1 2 3 4/;
$a = "absnd";
%a = (a => 1);
(%a , $a , @a) = undef;
print "$a\n",%a,"\n@a";
これだけできました。でも一応
(%a , $a , @a) = (undef) x 3;
とかしたほうがいいですか?
0725nobodyさん
04/08/14 18:17ID:???0729nobodyさん
04/08/14 18:36ID:???0730nobodyさん
04/08/14 18:44ID:???0734nobodyさん
04/08/14 19:25ID:???0735nobodyさん
04/08/14 19:33ID:???0736724
04/08/14 19:33ID:???それでもできるんですね。
>>733
代入できても、やってはいけないことなのでしょうか?
(%a , $a , @a) = (undef x 3);
これが一番ですか?
0737nobodyさん
04/08/14 20:37ID:???コンマ演算子の優先順位が代入演算子より低いから括弧で括る必要が
あるのであって、代入する要素が一つの場合はわざわざリストにする
必要はない。つまり @a = 'a'; は @a = ('a'); と等価。
>>736
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
(%a, $a, @a) = undef; は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = (undef x 3); は構文エラー。
(%a, $a, @a) = (undef() x 3); は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = ((undef) x 3); は %a = (undef, undef, undef), ($a, @a) = (); と等価。
0738nobodyさん
04/08/14 20:43ID:???もまえは何がやりたいんだ?
(%a , $a , @a) = (undef x 3);
には少なくとも2つの大きな間違いが存在している。
まず、第1にundef x 3は文法エラーとなる。内容は実際に実行してから読め。
そして第2に、
(%a , $a , @a) = (1 => 2, 3, 4);
がどうなるのか考えろ。
0739nobodyさん
04/08/14 20:46ID:???use strictの有用性を説明されても聞かないくせに、
自分の質問にだけは答えてもらおうとする。
さ す が 夏 休 み
0741nobodyさん
04/08/14 21:41ID:???まったく動かない事くらい察してやれよ。
0742nobodyさん
04/08/14 21:49ID:EgOE5Yt9最初は釣りかと思ったが真性包茎みたいだねw
0743nobodyさん
04/08/14 21:58ID:???簡易デバッガみたいな使い方だろ、use strictって
0744nobodyさん
04/08/14 22:01ID:???っていうか、人間の感覚じゃまずわからんだろ。
strictは結構効率良いみたいだ。
Benchmark測ればわかる。
そんなことより、速度が遅いとか、無駄とかアフォとか言う前に、基本を勉強するべ
きで、しかもuse strict;の必要性についても、もっと勉強したりここの上級者の言
うことを信用したりしろっての。
0745黒死犬 ◆EgxBlf8nvc
04/08/14 22:38ID:???従わなかったところで、挙動が変わるわけでは無いし
http://perldoc.jp/docs/perl/5.8.1/strict.pod
0746nobodyさん
04/08/14 22:55ID:???0747nobodyさん
04/08/14 23:00ID:???完結してるんじゃないの?
まあuse strictと書きたくないなら
$^H |= 2|0x200|0x400;
とでも書きなさいっと。
0748nobodyさん
04/08/14 23:01ID:???0750黒死犬 ◆EgxBlf8nvc
04/08/14 23:11ID:???ああ、my変数の typo を教えてくれるという重要な機能がありましたね・・・
sub unko {
my $unko = shift;
$$unchi = $$**$$; # $$unko (ry のつもり
}
0751nobodyさん
04/08/15 00:17ID:ThpZR4YaC-BOARDで、投稿画面に追加したセレクトボックスの
投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?
下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。
#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');
#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
0752nobodyさん
04/08/15 00:33ID:???めんどいから use strict つけたままだけど
俺んとこは mod_perl だから実行時の速度は変わんないし
しかし珍しく本当に「コーディング」の話題だなあ
0753nobodyさん
04/08/15 00:49ID:???■ 自分で改造するアドバイスが欲しい場合には
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/79(テンプレ)
0754nobodyさん
04/08/15 00:57ID:3zveFoKh読み出した文字列が文字化けしたままなのです。
&jcode'convertで文字コードが変換出来ていないようなのですが・・・
どこが原因なのか、良くわからないのです。
お手数ですが、教えてくださいまし。
require "jcode.pl";
open(FI,"aaa.csv") || return 0;
while(<FI>){
$_ = nkf("-ed",$_);
chomp();
split(",");
if($_[0] eq $bbb){
$ccc = $_[1];
&jcode'convert(*ccc, "sjis");
}
}
close(FI)
0756754
04/08/15 06:40ID:3zveFoKh0757724
04/08/15 11:33ID:???とりあえず一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefして
メモリを開放したいんです。
($a,@a,%a) = ();
これで完全に未定義の時と同じメモリ状況になるんですか?一応消えるのは確認しましたが。
0758nobodyさん
04/08/15 12:03ID:???ならんて。
$aは未定義になるがメモリとは関係なし。
@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
undef @aするとその分の変数領域は解放されるが、システムリソースとしては
喰われたままでPerlが終了するまで解放されない。
過去ログ嫁
0759724
04/08/15 13:05ID:???>$aは未定義になるがメモリとは関係なし。
>@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
>ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
Perlではundefしてもメモリの開放はできないから、メモリ開放を期待して
ちょこちょこundefする必要はないってことですね。
0760nobodyさん
04/08/15 14:37ID:???0761ぢおぢお
04/08/15 15:24ID:EbxomzZwファイルがあったらというのはどうやってすればいいんですか?
0762nobodyさん
04/08/15 15:28ID:???ファイル検査演算子を使う。
0763nobodyさん
04/08/15 15:31ID:???0764ぢおぢお
04/08/15 15:33ID:EbxomzZw0765nobodyさん
04/08/15 15:36ID:???何をやってダメだったか書いてみ。
winだからって全てのファイル検査演算子が使えないわけじゃない。
tu-ka,環境依存の話なら先にそれを言え。
0766nobodyさん
04/08/15 15:54ID:???0767ぢおぢお
04/08/15 15:56ID:EbxomzZwprint "存在\n";
}
という風に存在したらというのをやったらなりませんでした
0768nobodyさん
04/08/15 16:04ID:???0769ぢおぢお
04/08/15 16:19ID:EbxomzZw0770nobodyさん
04/08/15 16:39ID:LDNVI8I+0771ぢおぢお
04/08/15 17:11ID:EbxomzZwのようなやつで
何々と何々と何々が読み込めたらという処理はどうすればいいんですか?
すみません検索しても分からなかったので
0772nobodyさん
04/08/15 17:29ID:???そ ん な お 前 が
や り た い こ と
直 接 の サ ン プ ル は な い
$aと$bと$cが1以上ならという処理はどうすればいいんでしょうか。
考える気がないだろ。
0773nobodyさん
04/08/15 17:30ID:???@hozonに全部パスを入れとけアフォ
foreach(@hozon){
print "ok" if -e $_;
}
このクソアフォが!?
0775nobodyさん
04/08/15 17:37ID:???0776ぢおぢお
04/08/15 17:44ID:EbxomzZw0777nobodyさん
04/08/15 17:45ID:???if ( $a && $b && $c ){ print "これでよくね?w" }
それとも
if ( $a > 0 ){ if ( $b > 0 ) { if ( $c > 0 ) { print "天山ツームストン" } } }
にするか?いっそのこと
exit || exit;
でいいんじゃん?
0778nobodyさん
04/08/15 17:46ID:???0779nobodyさん
04/08/15 17:47ID:???0780ぢおぢお
04/08/15 18:01ID:YD+WDikbなりませんでした。
0782ぢおぢお
04/08/15 18:10ID:YD+WDikb0784nobodyさん
04/08/15 18:41ID:???foreachのように、毎回スカラにリストの内容を代入する
+
forのように$iに現在のループ回数を入れる。
みたいなことは不可能ですか?foreach側で使うのは keys %hash なのでforの$iとリンクさせる形での
処理はできません。
0785784
04/08/15 18:45ID:???ループ回数が一定の基準を超えると、発動する処理をしたいのです。
0786nobodyさん
04/08/15 18:49ID:???ダサいやつでいいなら
$i = 0;
foreach(@a){
処理〜;
print "2桁キター" if $i > 9;
$i++;
}
で一応できるよ。
0788nobodyさん
04/08/15 19:28ID:???a => 1,
b => 2,
c => 3,
d => 4,
e => 5,
);
@a = keys %data;
delete @data{@a[1..3]};
これが
$data = {%data};
の場合に
delete @data->{@a[1..3]};
としてもうまくいきませんが、何か方法はありますか?
0789黒死犬 ◆EgxBlf8nvc
04/08/15 20:17ID:???こうですね
0790nobodyさん
04/08/15 23:12ID:???read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
のようにすればできたのですが、いきなり$$bufferに代入するとおかしい気がするので(シンボリックリファレンス?なんか非推奨って読んだ気がします)
$buffer = \"";
read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
とかを考えてみました。
0791nobodyさん
04/08/15 23:37ID:???☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 質問者が返信する際は、名前欄に「最初に質問したレス番号」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0792nobodyさん
04/08/16 01:57ID:???0793nobodyさん
04/08/16 02:09ID:???こんなところか。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 返信は名前欄に「最初に質問したレス番号」・メール欄に「sage」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0794nobodyさん
04/08/16 02:11ID:???0795nobodyさん
04/08/16 02:15ID:???☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ .★
☆ .☆
★ 右の星もちゃんと整列させてから書き込め .★
☆ .☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0797nobodyさん
04/08/16 09:30ID:???ウザい質問者は徹底スルーが基本だって。
0798nobodyさん
04/08/16 09:52ID:f4GvLXd6qq{ INSERT tbl_name SET name="$hoge{name}" sex="$hoge{sex}" weight="$hoge{weight}" }
)
%hogeにはフォームから送られてきたクエリが格納されてます。
このようなSQLインジェクションをやる場合にXSS対策として、
foreach( keys %hoge){
$hoge{_} =~ s/"|'//g;
}
としてるのですが、これでXSS対策は万全でしょうか?とりあえず上のSQL文の場合、クォートさえ消しておけば
全部文字列として解釈されるので、おかしなことにはならないと思いますが、もしも穴がありましたら
ご指導願います。
0801798
04/08/16 10:49ID:???q{ INSERT tbl_name SET name="?" sex="?" weight="?" }
);
$sth->execute($hoge{name},$hoge{sex},$hoge{weight});
http://www.rfs.jp/sitebuilder/perl/dbi/02.html#プレースホルダとバインド値
ここを見ながらやってみましたが、これであってるのでしょうか?
後から結びつけることで、SQL構文になってしまうようなバインド値の場合にエラーを出して
executeしないんですかね?
0803nobodyさん
04/08/16 17:39ID:YMFVNVGstelnetにて正常動作したperlスクリプトをCGIとして動かすと
エラーになってしまいます。
ログをたどると以下のようになってます。
Can't locate CGI.pm in @INC (@INC contains:
/usr/home/xxx/usr/local/lib/perl5/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl
.) at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
BEGIN failed--compilation aborted at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
[Mon Aug 16 10:19:51 2004] [error] [client 138.243.201.4]
Premature end of script headers: /usr/local/etc/httpd/htdocs/board/index.cgi
で、不可解に思って、なんでCGI.pmがないんやろかと@INCのフォルダを
洗いざらい調べてみたら、なんときっちり存在しているのです。
なにか他に思いつく原因ってあるでしょうか?
ちなみにperl5.8.4です。
0805nobodyさん
04/08/16 17:59ID:???パーミッションは755です。ちなみに705にしてもエラーが出て、
上記のログがApacheのエラーログに追加されます。
またpmモジュールは読めさえ出来ればパーミッション関係なかったような。
ちなみにpmモジュールのパーミッションは444でした。
@INCの各パスとはどういうことでしょうか?
CGI.pmは/usr/home/xxx/usr/local/lib/perl5/5.8.4に確かに存在していました。
0807nobodyさん
04/08/16 18:29ID:???おかしくない?よくわからんけど。
0808nobodyさん
04/08/16 18:33ID:???/usr
/usr/home
/usr/home/xxx
/usr/home/xxx/usr
/usr/home/xxx/usr/local
/usr/home/xxx/usr/local/lib
/usr/home/xxx/usr/local/lib/perl5
/usr/home/xxx/usr/local/lib/perl5/5.8.4
これらディレクトリ自体のパーミッションが CGI の実行ユーザに対して
開いているか (読取及び実行権限があるか) ? という事。
0809nobodyさん
04/08/16 18:34ID:???一番疑われるのは、既出の通りファイルまたはディレクトリのパーミッションが
apache の実行権限で読めないようになってる、という可能性だが、
それじゃないなら、なんだろうなあ
まさか apache が実行時に chroot されてるとかか?
apache の管理人に相談した方がいいような気もする
0811nobodyさん
04/08/16 18:58ID:???0812nobodyさん
04/08/16 20:25ID:???cryptがサーバ対応してなくてMD5使えないもので、
ありましたら使い方等教えていただけますと幸いです。
0813nobodyさん
04/08/16 20:57ID:???http://search.cpan.org/search?query=MD5&mode=all
0815803
04/08/16 23:04ID:???問い合わせてみました、返答ですが
「本サーバは若干特殊でお客様のホームデレクトリが仮想ルートと
なっております。(だからホームの下に元々usrとかetcとかあるわけです)
@INCの値を/usr/home/xxx/usr/local/lib/perl5/5.8.4から
/usr/local/lib/perl5/5.8.4に書き換えれば動作します」
とのこと。@INCがおかしくてlib.pmにもアクセスできないのに
どうやって@INCを書き換えればよいのだろうか…。
0816nobodyさん
04/08/16 23:54ID:???use の仕組みを理解して lib.pm が何をしているか
読み解けばいいんじゃないか。
でもおじちゃんが君の勉強の機会を奪ってあげよう。
BEGIN { unshift @INC, '/usr/local/lib/perl5/5.8.4' }
0818nobodyさん
04/08/17 01:17ID:???これだな、うん。
0820803
04/08/17 03:32ID:???なるほど、@INCも所詮はただの配列だからスクリプト側で
勝手に追加すれってことですね。すこし効率悪いかなとも
思ってましたけど、いざ使ってみると1箇所追加するだけでも呼び出す
ライブラリ全部に反映されるみたいなので結構いい感じです。
ご教授ありがとうございます。
0821nobodyさん
04/08/17 13:03ID:???DispError("ERROR") if (判断式2);
$count++;
}
なんですが、
これは判断式1がtrueの場合DispError(ERROR)が発生するとして、
その後の判断式2はどうかかわるのですか?
0822nobodyさん
04/08/17 13:34ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-7
0823nobodyさん
04/08/17 13:54ID:4w98o0dA始めたんだけど、文字列の変数展開で、
"$Foo->bar()"
みたいな事出来ないかな?
Rubyだと
"#{Foo.bar}"
という書き方が出来るんだけど。。。
0824nobodyさん
04/08/17 13:57ID:???"$Foo->{bar}"
$Foo->bar() はメソッド
0826821
04/08/17 14:01ID:???ありがとうございます、特殊な書き方なんですね。
0827nobodyさん
04/08/17 14:04ID:4w98o0dA>>825
0830nobodyさん
04/08/17 16:18ID:???printf "%s", $Foo->{bar};とか
print "", $Foo->{bar} . "";とか
いくらでも書き方はあるけど?
で、>>824に突っ込むなら、Class::Accessor使ってみたら?と。
0832nobodyさん
04/08/17 16:51ID:???ああ、あんまり使わないからわかんなかった。
漏れの場合は825の2つ目のを使うけど。
ヒアドキュメントを使う場って、長いHTMLとかSQLとか書くときがほとんどだけど、
前者はTemplate、後者はプレースホルダーとかsprintfとか使うから、
使うとしても、内部に変数を埋め込むことは少ないなぁ。
TMTOWTDIとすれ違いなのでここまでにしとく。
0835833
04/08/17 17:38ID:???は?どういうこと?
最近Web製作板で、ネオマスって言葉を質問してるやつがいて誰もわからなかったんだよ。
で、お前のアルファベットんp羅列も同じようにわかんねって話なんだが?
0836nobodyさん
04/08/17 17:43ID:???ぐぐればわかるよ。
まあ気にすんな。
時々、ああやって見慣れる言葉を書いて得意気になってる
いつものウンチクオタクだろうから。
0837832
04/08/17 17:44ID:???本気で思わなかったんだよ〜
There's More Than One Way To Do It.
Perlの標語だよ。発音はtim-todayらしいね。詳しく知りたかったらググってみそ。
0838nobodyさん
04/08/17 17:55ID:???0839名無しさん
04/08/17 19:11ID:s4X1hHlIメモリ上だけでやる方法教えてください。
あと、JavaのServletでインスタンスフィールド作ると
スレッドセーフじゃなくなって他のセッションの情報とか混ざっちゃたりするからダメ
みたいなそういう心配ってしなくても大丈夫ですか、Perlは?
0840nobodyさん
04/08/17 19:59ID:???無理。
mod_perlで変数を初期化しなければ・・・みたいなアクロバティックな
方法もあるけど、初期化しないという保証はないからお勧めできない。
PHPとかのセッション管理も実際はファイル書き込み以外の何物でもない。
後Servletは知らないけど、CGIのPerlならプロセスだから問題ない。
mod_perlだと、グローバル変数に適当にセッションの情報を放り込むと、
混ざらないとは言い切れない。
0842名無しさん
04/08/17 20:10ID:s4X1hHlIあと日本語が変でごめんなさい。
JavaのServletではそういうことやっちゃダメで
心配しなきゃなんないんだけど、
Perlでそういう感じの心配しなきゃならないとこってありますか?
ってことを書いたつもりでした。ごめんなさい。
0843nobodyさん
04/08/17 21:08ID:???プログラムで受け取っているのですが、変な文字化けを起こして
しまいます。
jcode::convert(\$form{text}, "euc");
ですと、$form{text}が「てすと」の場合は文字化けを起こさず、
「テスト」の場合は文字化けがおこります。
「テ」の場合は文字化けしません。
これを jcode::convert(\$form{text}, "euc", "sjis");
に明示的に指定すると、「テスト」の文字化けは直りますが、
今度は「てすと」が化けるようになってしまいます。
ループにはまってしまったので、質問させていただきました。
どうか宜しくお願いいたします。
0844843
04/08/17 21:21ID:???そのまえのフォーム受け取りルーチンに問題があったっぽいです。
スレ汚しすみませんでした。
0846798
04/08/17 23:56ID:b/+hcgJEプレースホルダを使用して、LIKE用に%と_をエスケープしておけばそれ以上サニタイジングは
何もしなくても安全ですか?
色々読んだところとりあえずそれで問題はないようなのですが、一応このスレのみなさんに
最終確認して自信を持ちたかったので投稿しました。
どうぞお願いします。
0848nobodyさん
04/08/18 16:37ID:FTnHFAXj$rule1 = rand 20;
$data1 = int($rule1) + 1;
#2番目の数字###############
$rule2 = rand 20;
if ($rule2 <= $data1) {
$rule2a = rand 20;
}
$data2 = int($rule2a) + 1;
ランダムで選んだ2つの数字を$data1より$data2のが大きな数字にしたいのですが
うまく動作しません、どうすればよいのでしょうか?
0849nobodyさん
04/08/18 16:41ID:???0850nobodyさん
04/08/18 16:51ID:???$rule1 = 1 + int rand 20;
do { $rule2 = 1 + int rand 20 } while $rule1 == $rule2;
$rule1 < $rule2 or ($rule1, $rule2) = ($rule2, $rule1);
print "$rule1 < $rule2";
0851nobodyさん
04/08/18 17:03ID:???得られる数値の分布は >>849 と >>850 で大きく異なるので
目的に合わせて選択されたい
0854846
04/08/18 18:50ID:???0856nobodyさん
04/08/18 21:48ID:???まあ完璧か?と聞かれるとそこまで自信が持てなくて返事ができなかったりする;
だってセキュリティ問題ってそういうもんだろ?後は↓こいつが見事な答えをだすんじゃないか?
0857nobodyさん
04/08/18 22:06ID:???まあいいけど。
SQLインジェクションが怖いのは、例えば発行してるのがSELECT文なのに
INSERTとかDELETEとかDROPとかCREATEとかそういうのを使われること。
そういう点では、プレースホルダ使えば”ほとんど”問題はない。
ただ、当然のことだが、SELECT * FROM some_table WHERE ? = ?
みたいなSQLを書いて、?にテーブルのカラム名を入れる〜みたいなのだとまずい可能性が高い。
つまり、数値だとか文字列をエスケープすると言う点ではいいんだけれど、
動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
この辺りのチェックは絶対に必要になる。
それから、他人の情報を盗まれたり〜という点に置いての
チェックなんかも、ユーザーからの入力じゃなくて、セッション管理とかしないとね。
この辺になると、インジェクションというのとはちょっと違うけれど。
0858nobodyさん
04/08/18 22:27ID:???お前さ。2chで大丈夫だよといわれるだけで安心できるの? いくらでも逝ってやるよ。
それで完璧。絶対に大丈夫。
>>857
> 動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
それは設計が悪い。
0859798
04/08/18 23:11ID:???>>857
注文を保存するだけのものなので、
INSERT tbl_name SET name=?
のような使い方しかしないつもりです。
>>858
2ちゃんでというか、自分でできる限り調べるのと+このスレの人の回答を
足し合わせると安心できます。
0860nobodyさん
04/08/18 23:16ID:???モジュール||ライブラリ なしで。
できるやつってすげえな。まあjcode.plの中身を見ちゃえばわかっちゃうけど、
見ないでわかっちゃうやつは
0861nobodyさん
04/08/18 23:26ID:???0862nobodyさん
04/08/18 23:29ID:???目で見ればわかる。なれた。
SJISをEUCのつもりでSJISに変換したのもわかる。
ただなぁコード書けって言われても・・・その、なんだ、困る
0863nobodyさん
04/08/18 23:44ID:???このABCを管理する為のperlプログラムDを作りたいと思っております。
具体的には
DにてABCを起動
ABCを監視し、終了したプログラムに対して再起動やログなどを残す。
プログラムの起動や終了状態を取得するには
system関数を使おうと思っているのですがsystem関数では一つの子プロセスが
終了するまで、親プロセスには制御が戻らないのでどうしたものかと
悩んでおります。
アドバイスなど頂ければ幸いです。
よろしくお願いします。
0864nobodyさん
04/08/19 00:02ID:???つーか戻り値ないsystemを使うのか・・・
0866nobodyさん
04/08/19 00:27ID:???0868857
04/08/19 01:23ID:EPjrU+Ei> それは設計が悪い。
その通り!
でも、そういうことを聞いてるんだと思ったんだが・・・
0869863
04/08/19 01:25ID:???http://66.102.7.104/search?q=cache:-1Ta6TXcnLcJ:naoya.dyndns.org/doc/perl_memo.txt+fork%E3%80%80pid%E3%80%80perl%E3%80%80waitpid&hl=ja&lr=lang_ja
ここが一番解りやすいように書いてくれてるのですが
systemとforkの使い方の流れみたいなのが今一理解できていません。
>>867さんが
system "A.pl &";
system "B.pl &";
system "C.pl &";
と書いてくれていますが、アホな漏れにもう少し補足していただければ幸いです。
書き忘れましたが
perlはActivePerl-5.6.1.635-MSWin32-x86.msi
win2000sp4です。
なのでフラッシュする必要はないと思うのですが・・あってますでしょうか。
0871863
04/08/19 02:38ID:???今調べていると
Win32システム用Perlで実装されていない関数
にforkが入ってました・・
>>870
>>不可能ではないが、どちらかと言うと、潔く諦めることをお勧めする
こう言うことでしょうか?
確かめる為に実際にforkを入れてみるとちゃんとプロセスが増えました。
dos窓がもう一つ増えるわけではありませんが、dos窓一つにperlプロセスPIDが
二つ。
本当はdos窓二つ、perlプロセス2つにしたいのですが。
forkは自分の分身を子プロセスとして作り出すのでDという管理プログラムを
使ってA、B、Cというプログラムを動かすには
Dのコードの中にABCのコードも含めて、子プロセスの場合はABCそれぞれの
ルーチンを機能させるみたいなことにしないといけないのでしょうか?
全く別のプログラムを起動させて、そのPIDを監視と言うか取得できる
方法があれば涙モノなのですがそう上手くはいかないようですね・・
0872nobodyさん
04/08/19 04:48ID:???http://search.cpan.org/modlist/Microsoft_Windows
0874nobodyさん
04/08/19 19:10ID:4YGc7qXm2.1の変数をハッシュにする。
1はだいたい$buffer
2は%form
が多いし、何より自分もそれをずっと使ってきたからわかりやすい。
でも、ちょっと今回は他のことにその名前を使いたいので(ifないのローカル変数だからダブッても
一応問題ないけど、可読性が悪くなっちゃうから)、別の名前を考えてるんだけど
なかなかいいのが思いつかない;
1と2の変数のいい感じの命名をおながいします!
0876nobodyさん
04/08/19 19:17ID:???A
1 $query
2 %query
B
1 $query
2 %data
C
1 $stdin
2 %query
D
1 $demand_query
2 %demand
あんまいいの浮かばないな。
やっぱフォームからクエリの方を統一して$buffer,%formとしたほうがいいと思う。
0877874
04/08/19 19:21ID:???可読性の問題で;わかりやすい変数名にしたいんだ。
>>876
オゥ!?thx!
$queryはわかりやすいね。Aを使わせてもらおうかな。
0879nobodyさん
04/08/19 20:31ID:???言いたいことには賛成なんだが、コンパイラは読みやすさなんぞ
微塵も求めちゃいないし、アルゴリズムってのは個々の問題解決
方法を指すのであって、全体の構成や設計を指す場合には使わん。
0880nobodyさん
04/08/19 22:03ID:???GMT(UTC)とどのくらいの時差があるかを知るには
どうすればいいでしょうか?
Windows / UNIX 双方で共通に使える方法があれば
それでお願いします。
0881nobodyさん
04/08/19 22:24ID:???Time::Zoneでいいんでね? 例えば、
perl -MTime::Zone -e 'print tz_local_offset();'
→ 32400
perl -MTime::Zone -e 'print tz_name();'
→ jst
windowsでは使ったことないんで動くかどうか知らんけど。
0882nobodyさん
04/08/19 23:05ID:TB99xw7Gこのスクリプトの冒頭に出てくる
my($encode) = @_;
この行はどんな処理をしているのでしょうか?
以降の処理を見ると $encode には euc や sjis などの
文字列が入っているような気がするんですが、
↑の処理でなぜ $encode に文字列が代入されるのかがわからんのです……。
0884nobodyさん
04/08/20 01:49ID:???UNIXコマンドの df -kを使って求めたハードディスクの容量(KByte単位)を
GB単位への変換方法がわかりません。
求めた値÷1024÷1024から、splintfで%4.1dとして表示させると
小数点以下が0になってしまいます。
1GB未満 (500KByte等) は0.5GBと表示させたいと思います。
贅沢をいえば、小数点以下第2位を四捨五入できればベストです。
どなたか、お助けください。
よろしくお願いします。
0887nobodyさん
04/08/20 15:13ID:???>>884
%dで小数が表示されるわけないだろう。
これ、どこかでも書いたな。
886 :nobodyさん age :04/08/20 15:10 ID:???
>>885
夢の中だろ?
0889nobodyさん
04/08/20 18:39ID:???0890nobodyさん
04/08/20 19:23ID:???文字列って言ってもな・・・数字は%02dとか便利だけど%sって実際どういう時に使うと便利なのかな
ということでおまいらのカコイイ%sの使い方を、投稿しる。
0891nobodyさん
04/08/20 19:32ID:???0894nobodyさん
04/08/20 19:44ID:???他人のプログラムいじり倒していたら、どれを使っていて使ってないか分からなくなってしまいまして。
0897nobodyさん
04/08/20 20:17ID:???$s = 25;
$str = 'クネクネしとけ';
for (1..6 * $s) {
printf "%${\(length($str) + $s + int $s * sin 4 * atan2(1, 1) / $s * $_)}s\n", $str;
}
0898nobodyさん
04/08/20 20:17ID:pmEwrR+2B::Xref使えば?
0899nobodyさん
04/08/20 21:25ID:???文字の桁揃えとか。
0900nobodyさん
04/08/20 21:26ID:???printf qq|あなたのリモートホストは %s です。\n|, $ENV{REMOTE_HOST};
printf qq|BBQ に%s\n|,
(join '.', unpack 'C4', gethostbyname sprintf qq|%s.niku.2ch.net.|, join '.', reverse split /\./, $ENV{REMOTE_ADDR}) =~ /^127\.0\.0\.\d/
? qq|絶賛登録中ですよ。(・∀・)ニヤニヤ|
: qq|は掲載されていないようです。(゚∀゚)アヒャヒャ|;
0901nobodyさん
04/08/20 21:43ID:???整形はCSSでやれや
0902nobodyさん
04/08/20 21:56ID:???一応送り先と本文が、自由に書き込めるようなタイプ。
0906nobodyさん
04/08/20 22:59ID:???文字をエスケープする事より、いたずらに使われない方法を考える事が重要と思われ。
0907nobodyさん
04/08/20 23:02ID:???CGIゲームを作ろうと思っているのですが、perlで作るのが一番効率がいいのでしょうか?
CGIゲームを配布して下さっている方の物をいくつか見てみたところ、全てperlが使われていたのでやはりperlが良さそうですかね
それよりもいい言語等あれば是非お教え下さいませんか
0909nobodyさん
04/08/20 23:11ID:???うは・・・申し訳ないです
perlに詳しい方々が集まっているようなので聞いて見たかったのですが・・・
どのスレで聞いたらいいのだろう・・・
0912nobodyさん
04/08/20 23:30ID:???0913nobodyさん
04/08/20 23:42ID:NLrO80pOif ( hogehoge条件式 ) {
print <<EOF;
hogehogeテスト中
EOF
}
こういう制御構文の中では、行頭インデントをして見やすくしたいものですが、
ヒアドキュメントを使うと、プログラム上のインデントまで出力されてしまいます。
HTML出力以外ですと、困る場合があるのですが、ヒアドキュメントを使いながら
プログラム上でのインデントを出力させないような方法はあるでしょうか?
とりあえず今は制御構文の中ではヒアドキュメントを使わないようにしてますが、
ヒアドキュメントは便利なので、インデント問題が解消されるならば使いたいです。
とびっきりエロイ人おながいしますm(__)m
0914nobodyさん
04/08/20 23:45ID:???0915902
04/08/20 23:49ID:???あて先 → -_@.,以外をエスケープ。
本文 → 何でもあり
ってことでいい?
本文って何でもありなんだね。HTMLメールだとしても問題はないってことかな。
HTMLメールは送れないように、タグを置換しとこうかと考えたけど、意味ないのね。
>>906
通販サイトの注文システム構築してて、管理画面で使うメールフォームだから
悪用はされないと思う。.htaccess+CGIのダブル認証にしてあるから。
0917nobodyさん
04/08/20 23:55ID:???0918nobodyさん
04/08/20 23:58ID:???$' = "\n";
if ( hogehoge条件式 ) {
print "hogehogeテスト中",
"hagehageつらいな",
"higehige濃すぎるぜ";
}
$' = "";
これで勘弁してくれないか?一応printは1回だし、\nも面倒ではない。
ただ俺の頭の中のPerl6でしかテストしてないから、現実のPerlでどんな挙動なのかは
自分で試してくれ。
0920902
04/08/21 00:02ID:???そうだった;ちょっと盲点だったよ;
でもそれって難しくない?今は<textarea>要素に初期状態(ほとんど完成状態)をぶち込んで
店の人が送信を押すとフォームメールcgiにつながるんだけど、textarea内でHTMLエスケープしておいて
送る時にはHTMLエスケープ以前の状態に戻して送信ってできる?
0921nobodyさん
04/08/21 00:03ID:???# まぁいろいろと
}
if ( hogehoge ) {
print_anti_indent (<<" EOF");
<!doctype>
<html>
<body>
</body>
</html>
EOF
}
0922913
04/08/21 00:05ID:???やはりヒアドキュメントでは無理でしょうか・・・
>>919
???terapad使ってます。インデントは自動ではなくて手動です。
ヒアドキュメント内で、出力されないインデントなんてやっぱりありえないですよね・・・・
一度変数に入れて正規表現でインデントを削除するくらいしかないですよねorz
そんな無駄な処理するなら、素直にprintしたほうがいいですね。
0923nobodyさん
04/08/21 00:06ID:???どうした?
別に「エディタが勝手に変なインデントするから困る」なんて書いてないわけだが。
0924nobodyさん
04/08/21 00:07ID:???入れ子に入れるとソース見にくくなるからヒアドキュメントはできるだけ止めてる
0925913
04/08/21 00:10ID:???sub print_anti_indent {
my $value = shift;
$value =~ s/\n\t/\n/g;
print $value;
}
こんな感じですか?
0926nobodyさん
04/08/21 00:17ID:???プッツンして・・・・・してやった。
0927nobodyさん
04/08/21 00:20ID:???こんなんでどう?
sub print_anti_indent {
my $value = shift;
my $indent = '';
# 最初の行から、インデントの深さを検出する
if ($value =~ s/^(\s+)//) {
$indent = $1;
}
# 次の行以降のインデントを取り去る
if (length($indent) > 0) {
$value =~ s/\n$indent/\n/g;
}
print $value;
}
0928nobodyさん
04/08/21 00:21ID:???Perlの時代が戻ってきたのか?なんにせよいいことだ。
0929927
04/08/21 00:24ID:???927みたいなコード書いちゃったけど、も少しシンプルにもできるか。わずかな差だけどね。
0931nobodyさん
04/08/21 00:40ID:???my $Out_Strings = sprintf <<EOF, 'hogehoge', 'hagehage';
>>> %sテスト中
>>> %sテスト中
EOF
# 無駄なインデントを取り除く無駄な処理(w
$Out_Strings =~ s/^\t+?>>>//m;
print $Out_Strings;
}
♪いろいろな方法があると思うよん。
0932nobodyさん
04/08/21 00:45ID:???スルニョー
つーか927はだめだ。\s は \n と \r にもマッチするから
ヘンなところでヘンなバグを生む可能性があるな。
927を使いたいなら
- if ($value =~ s/^(\s+)//) {
+ if ($value =~ s/^([ \t]+)//) {
の方がよさげ。
0933nobodyさん
04/08/21 00:45ID:???まあ確かに万人向けではないわな
0934nobodyさん
04/08/21 00:52ID:???まさか再帰が書けるとは思わなかったよ。
0935nobodyさん
04/08/21 01:07ID:???DBI位わかりやすい解説サイトがあるといいんだけどな。
探すのが面倒だし、不要なメソッドを抱えてるオブジェクトなんかと
仲良くしたくないから結局自分で作ってしまう。
今のとこ使えるのは
use DBI;
use strict;
だけだ;覚えようか迷ってるのはHTML::Templateとかいうやつくらい。
思いと評判なので使いそうにないけどw
0936初心者
04/08/21 04:37ID:???Perlで一括処理をさせたいのですが、
あるフォルダ配下の複数フォルダにあるファイルをまとめてリネームしhtmlリンクを修正
させたいのですが可能ですか?
最終的にはwork\index.htmから追いたいです
work/
|-1
|-2
|-3
|-4
|-5
以下100程度
手作業で1フォルダ毎やるのが耐えられなかった。。。できますよね。
0938初心者
04/08/21 04:47ID:???カレントディレクトリからフォルダ毎書き換えていたのですが、正直
これじゃ辛いっす。できると思いたいのですが。。。。。
0940初心者
04/08/21 04:57ID:???0941初心者
04/08/21 04:58ID:???>939様
間違えたorz....
0942nobodyさん
04/08/21 05:05ID:???できないならソフトでやればいいじゃん
0943nobodyさん
04/08/21 06:14ID:???新人か?
このスレは大型連休になると盛り上がる。
休みの間にちょこっとPerlでもやってみようって奴が増えるからな。
お陰で厨質問が増える。
その手軽さはPerlのよさではあるが。
0944nobodyさん
04/08/21 06:25ID:???0945nobodyさん
04/08/21 08:43ID:???導入などの手間を考えればPerlの方が手軽なのは間違いない。
0946nobodyさん
04/08/21 09:28ID:???0948nobodyさん
04/08/21 11:38ID:???http://www.genpaku.org/realprogrammerj.html
0949nobodyさん
04/08/21 11:48ID:???ということで、オレサマはこれからrubyを覚えることに決めた。
0950nobodyさん
04/08/21 12:59ID:???0951nobodyさん
04/08/21 13:46ID:???0954nobodyさん
04/08/21 14:13ID:CvZOz/sJ$class->method1();
とかしてもまだbless前だし。
クラス名::mthod1();
こんなことすると、第一引数がクラスにならずに食い違っちゃうし;
一瞬ライブラリでも作ってrequireでもするか。とか考えたけど、それやるとオブジェクトが独立しないし。
一体どうすればいいのさ!
0955nobodyさん
04/08/21 14:17ID:???print "content-type:text/html\n\n";
みたいな部分ってなんて呼べばいいでっしゃろか?
ヘッダ?
header?
HTTPのヘッダ?
あんさんらだけが頼りですわ。
0956nobodyさん
04/08/21 14:34ID:???クラスメソッドはuseすれば、すぐに使える。
new()がbless前に呼び出せるのは何故だか考えてみたまえ。
>>955
perlで書いてはあるが、禿しくスレ違い。「メッセージヘッダー」だ。
0957954
04/08/21 14:37ID:7q3lmCCRあ、
クラス名->method1
の形式で呼べばよかったのね^^
0958nobodyさん
04/08/21 14:44ID:???メッセージヘッダ???エスケープ時の引数名で迷ってまんのや。
例えば &escape($value,"html") って呼ぶとHTML用のエスケープ処理をしてくれる便利なやつや。
そんでな、クッキーとかを焼かはる時にもその「メッセージヘッダ」用のエスケープをしよるんやけど
なんて名前で渡そうかな思てな。
massageheader だとちょっと冗長やろ?わかりやすくてしかも冗長でない最高の
ネーミングを頼んますわ。httpってのもええかな思てるけど・・・
0959nobodyさん
04/08/21 14:53ID:???my @test;
push @test,$_ foreach @array;]
print @test;
use strict環境下で@testの宣言をせずに、pushと同時にローカルであると宣言したいんですが、
push my @test,"hghghg";
はうまくいきますが
push my @test ,$_ foreach @array;
だとうまくいきません。どうしますか?
0960nobodyさん
04/08/21 15:23ID:???my @test;
push
}
0961nobodyさん
04/08/21 15:52ID:???名前で悩まなくても済むようにperlには素晴らしい機能がある。
$_, @_つかえ。
>>959
> @testの宣言をせずに
理由は?
0962nobodyさん
04/08/21 16:22ID:???何を言うてまんのや
$_ = "html";
こんな事せえへんで。第1引数が置換する文字列で第2引数が、何のエスケープかてなってるんやわ。
ヘッダ用のエスケープに使う時の第2引数の名前で悩んでるや。
なにかええのんないやろか
0963959
04/08/21 16:25ID:????
>>961
my @test;
push @test,$_ foreach @array;]
要はこれを一行で済ませたいんです。なんかいちいちmy宣言だけの行があるのがかっこ悪くていやなんです。
0965nobodyさん
04/08/21 17:07ID:???my @test = @array;
おわり。
加工したければ、
my @test = map やりたいこと, @array;
0966954
04/08/21 17:13ID:7q3lmCCRmap BLOCK,LIST;
の書式の場合、返り血をリストコンテキストで評価すると何が返されるの?
@test = ( "a1","a2" );
@an = map { $_ =~ s/a//g } @test;
これだとわかりやすく$_を置換したものが毎回の返り血だけど、
@test = ( "a1","a2" );
@an = map { my $a = 5;
$_ =~ s/a//g } @test;
これだとmap内の一行目の代入成功の真(1)が毎回返される。
@test = ( "a1","a2" );
@an = map { $_ =~ s/a//g;
my $a = 5 } @test;
今度は5が毎回返される。
map内の任意の処理結果を返させたい時にはどうするもんなの?
returnとかやっても期待通りの結果が得られないんだけど。
0968nobodyさん
04/08/21 17:33ID:???■ ■
■ 臭い方言(特に関西弁)は禁止です ■
■ ■
■■■■■■■■■■■■■■■■■■
0969nobodyさん
04/08/21 17:45ID:???headerでいきよることにしましたわ。おおきに。
>>968
おまえ様ルールを押し付けんといてや。
方言があかんなんてアホな話あるかいな。
0970nobodyさん
04/08/21 17:47ID:???> 返り血をリストコンテキストで評価すると何が返されるの?
そのままリストが返されるかと。。。
> map内の任意の処理結果を返させたい時にはどうするもんなの?
> returnとかやっても期待通りの結果が得られないんだけど。
目的が読めませんね。
単に sub や、 eval にした方がよいのでは?
0971nobodyさん
04/08/21 17:51ID:???> おまえ様ルールを押し付けんといてや。
> 方言があかんなんてアホな話あるかいな。
おまはんルールで勝手にエセ関西弁使てるのもワヤですわな。
普通にしとけ。
あと、レスポンスのエンティティヘッダな、> Content-type: strings;
RFC 2068 とか読んどけや。
0972nobodyさん
04/08/21 18:01ID:???>おまはんルールで勝手にエセ関西弁使てるのもワヤですわな。
おまえさんもいつも勝手に標準語使ってはるのやろ?
あんさん言ってることが支離滅裂でっせ。
0973954
04/08/21 18:08ID:7q3lmCCRやりたいことは
@a = qw/1 2 3 4 5/;
$a = join "&",map {
$value = &test($_);
$_."=".$value;
} @a;
こういう感じなんだけど、mapのブロック内のどの処理結果が返されるのかが、明確に理解できてなくて;
一応↑のソースは期待通りの結果が得られるんだけど、今後のために質問してみた。
例えば
@hoge = map { join "i",$_;
join "w",$_;
}@a;
なんかの場合は一体何が返るのか一見ではわからないから、サブルーチンみたく明示的にしたいけど
そういう場合はどうするものなのかなって思って。
0974954
04/08/21 18:10ID:7q3lmCCR思いっきり間違えた;
@hoge = map { my $a = $_ + 2;
my $b = $_ + 5;
}@a;
とかに変更;
0975大阪に30年住んでますが
04/08/21 18:20ID:???> おまえさんもいつも勝手に標準語使ってはるのやろ?
上のほうは自然に読めるけど、下のは読んでいて気持ち悪いですよ。
# 京都の人っぽいけど「すごく無理して書いてる」という印象を受ける。
0976nobodyさん
04/08/21 18:22ID:???%hash = (
a => 1,
":" => 2,
"_" => 3,
);
foreach ( grep /^\w*$/ , keys %hash ) {
print $_,":",$hash{$_},"<br>";
}
これでは_アンダースコアがあってもマッチしてしてまうのですが、完全に英数字だけにマッチさせるには
/^[a-zA-Z0-9]*$/のような方法しかありませんか?メタ文字から任意の一字を引いたりできるとカコイイんですが。
0977nobodyさん
04/08/21 18:25ID:???0978nobodyさん
04/08/21 18:26ID:???下手なのは認めるで。そんでも早く慣れな営業できへんのやorz
こないだも
「東京のお人はエライ冷たい感じがしていややわ」
言われてな・・・・大阪弁と京弁の微妙な違いがわからないのよね。
はぁスレ違い。退散するさかい堪忍な。
0980nobodyさん
04/08/21 18:47ID:???例えば /a/ なんかの場合はgはなくても1回マッチするまでは検索つづけるyね?
っていうかgってもともと置換演算子の修飾子で、たんなるマッチングの修飾子ではないの?
0981954
04/08/21 19:01ID:7q3lmCCR>>980
/a/だけで問題ないよ。
>>976
/[^a-zA-Z0-9]/でいいじゃん。別にかっこ悪くないよ。
0987nobodyさん
04/08/21 23:47ID:???> ちょっと違う質問なんだけど、mapの
> map BLOCK,LIST;
> の書式の場合、返り血をリストコンテキストで評価すると何が返されるの?
BLOCKの返り値をつないだリスト
> @test = ( "a1","a2" );
> @an = map { $_ =~ s/a//g } @test;
> これだとわかりやすく$_を置換したものが毎回の返り血だけど、
そんなこたー無い。
s/PATTERN/REPLACEMENT/egimosx
Searches a string for a pattern, and if found, replaces that pattern with the replacement text and
returns the number of substitutions made. Otherwise it returns false (specifically, the empty string).
なので、@an = (1, 1)
> @test = ( "a1","a2" );
> @an = map { my $a = 5;
> $_ =~ s/a//g } @test;
> これだとmap内の一行目の代入成功の真(1)が毎回返される。
そんなこたー無い。同上
> @test = ( "a1","a2" );
> @an = map { $_ =~ s/a//g;
> my $a = 5 } @test;
> 今度は5が毎回返される。
当たり前。
> map内の任意の処理結果を返させたい時にはどうするもんなの?
> returnとかやっても期待通りの結果が得られないんだけど。
return EXPR
Returns from a subroutine, eval, or do FILE with the value given in EXPR.
ドキュメント嫁。
0988nobodyさん
04/08/21 23:59ID:???0989スレ立てしようとしたら蹴られますた
04/08/22 00:21ID:???>>2だけですが、リンクを新しいスレッドに変えたものを貼っておきます。スレ立て人募集(泣)。
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc2.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ) part2
http://pc5.2ch.net/test/read.cgi/php/1092304968/
△▲ WebProg 初心者の質問 Part9 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1086715675/
【Perl】ファイルロック(排他処理)について語ろう
http://pc2.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc2.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc2.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc2.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
0990966
04/08/22 00:45ID:???おお!やっとエロイ人出現。
なんか966でのソースはテストしたはずなんだけど、思いっきり間違ってたみたい。
結局俺の疑問はブロックの返り血ってことだになるんだよね?
my @test = ( "a1","a2" );
my @an = map { $_=~ s/a//g ; $_.":"."test";} @test;
print @an;
>1:test2:test
これの場合はブロックの返り血がなんで最後の一行だけになるんだろ?
サブルーチンと同じで、returnが省略されてる場合は自動的に最後の一行がブロックの返り血ってことになるってことであってる?
そんな気がするけど、mapのブロックないではreturn使っても動作しないんだけどそこらへんが不思議。
my @test = ( "a1","a2" );
my @an = map { return $_=~ s/a//g ; $_.":"."test";} @test;
print @an;
>
どこにreturnを入れても駄目みたい。元々returnってのは呼び出し元に返すのものだから
駄目とかいう感じなのかな?
0991nobodyさん
04/08/22 01:11ID:???Returns from a subroutine, eval, or do FILE with the value given in EXPR.
って書いてもらってんじゃん。
大体、エラーが出てるだろ。Can't return outside a subroutine
これは多分だけどさ、
sub func1{
my @test = ( "a1","a2" );
my @an = map { return $_=~ s/a//g ; $_.":"."test";} @test;
print @an;
}
だと、returnはどう解釈すりゃいいんだろうね?ってことじゃね?
どうしても、そんなことがやりたかったら、それ用のサブルーチン作っとけば?
0993nobodyさん
04/08/22 01:28ID:???0994nobodyさん
04/08/22 01:30ID:???0995nobodyさん
04/08/22 01:33ID:???0996次スレ1
04/08/22 01:48ID:???0997次スレ1
04/08/22 01:49ID:???0998nobodyさん
04/08/22 02:02ID:???0999nobodyさん
04/08/22 02:03ID:???1000nobodyさん
04/08/22 02:03ID:???Perl コーディング初心者質問コーナー Part37
http://pc5.2ch.net/test/read.cgi/php/1093106507/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。