>>477 >>143 のおれのお題を考えてみてくれよ。
文字そのものと「.」「*」「?」「[ ]」しか使わないという条件もつける。
解法のとっかかりでもいい。
問題の意味がわからん 日本語でおk
480 :
デフォルトの名無しさん :2006/01/09(月) 22:03:51
>>478 そんなの文字クラス[]にマッチする文字のリストアップだけ出来たら終了じゃね?
[]の中身が空集合でなかったらマッチするの作れるだろ。
[]の中身が空集合だったらその文字クラスごと * や ? で潰せないか確認。
>>479 これ以上どう書けばいいのかわからない。
>>480 文字列長は不定だよ。
/^abc$/と/^a.+$/くらいなら全文字列を列挙していけばどこかでひっかかるけど。
>>482 それを使っても総当たり方式にしかならんでしょ。
>>483 総当たりで得た文字列を数えればいいじゃないか。
@both_match = grep $count{$_}++, @regex1, @regex2;
CGIなどのウェブプログラミングの勉強に 「初めてのPerl」という本を読んでいます。 続・初めてのperlは専門的な内容とアマゾンのレビューに 書かれているのを見かけたのですが、 次に読む本としてはperlクックブックと続・初めてperlの どちらが良いでしょうか?
>>484 だから文字列は不定長なんだって。
blute forceは使えない。
Effective Perlで。
アッー!
エッ?!
>>486 もしどちらの正規表現にもマッチする文字列があるなら、
その最短のものの長さには上限がありそうだから、
うまいことそれを証明すればあとは総当りでOKなんじゃ
ないか、と考えてみた。
open関数でパイプや意図しないファイルをオープンされるのを防ぐには サニタイズするのは当然ですがsysopenを使った方がいいのでしょうか。
>>493 「>」や「<」とファイル名はopenでも別々の引数にできる
例:
open FH, '>', $file
ので、こう書けば$fileについてはsysopenと同等。
sysopenだから安全とは・・
IO::File 使えばイイんじゃね。
>>492 regex-A: ^(aaa)+$
regex-B: ^(aaaa)+$
どっか移動するスレ無いだろうか
ちょっと教えてください こんなテキストがあって(一行) foo('a','b'); foo('c','d'); foo('e','f'); foo('g','h'); このfooの第一引数、つまりa, c, e, gを抜き出して処理したいのですが(引数は2つ固定)、 こういう場合どうするのが定石でしょうか よろしくお願いします。
日本語でおk
>>498 正規表現を使うのが定石
$line = q|foo('a','b'); foo('c','d'); foo('e','f'); foo('g','h');|;
@aceg = ($line =~ /\bfoo\('([^']*)'/g);
>>498 それが書き捨てかどうかによるが、
書き捨てなら漏れなら
>>500 よりももっと簡潔にこう書く
@args = $line =~ /\('(.*?)'/g;
>>500 >>501 さん
ありがとうございます。かなり書き捨てなのですが両方ともども参考にさせていただきます!
どもでした。
>>494 引数3つにすると、use open ':encoding(hoge)';が使えねー。
webprogのスレどうにかしてくれ
>>504 板全体のレベルがアレなので、華麗にスルー。これ。
以下のような処理をしています。@all_lineの各行に「aaa」「bbb」「ccc」と いう文字が含まれている、あるいは行頭に「ddd」がある、と言う場合は'NG'と 判定します。 foreach(@all_line) { $line_ok_ng = '';#OKかNGか if ((/aaa/)||(/bbb/)||(/ccc/)||(/^ddd/)){ $line_ok_ng = 'NG'; }else{ $line_ok_ng = 'OK'; } #$line_ok_ngに沿って処理 } しかし、条件が増えてきた為、aaa bbb ccc等の条件を他のファイルに 書き出す必要が出てきました。そこで次のように変更しました。
507 :
506 :2006/01/10(火) 22:01:39
つづき foreach(@all_line) { $line_ok_ng = &line_check($_); #$line_ok_ngに沿って処理 } sub line_check { my $line_ok_ng = 'OK'; #始めはOK my $each_line = $_[0]; #調査対象 my @ng_word = @other_file::ng_word; my @ng_header = @other_file::ng_header; foreach (@ng_word) { $line_ok_ng = 'NG' if $each_line =~ /$_/; } foreach (@ng_header) { $line_ok_ng = 'NG' if $each_line =~ /^$_/; } return($line_ok_ng); } #other_fileの中に@ng_word=("aaa", "bbb", "ccc")が記入してあります やりたいことは実現出来たのですが、微妙に遅くなった気がします。 @all_lineは1万行弱なので、特に困りはしないのですが、上記のことを もっと綺麗に実現するような方法、あるいは私が覚えておいた方が 良いような手法がありましたら、ぜひ御示唆いただけないでしょうか。 よろしくお願いします。
Rock54もそこがネックなのよね(哀)@NGワードの正規表現による多重検索
>>507 >>508 が順等な答え。
で、わざわざ /$_/ と /^$_/ を分けるんじゃなくて、
^ddd
なものも、aaa, bbb, ccc と一緒に入れて大丈夫。
できればファイル中では ^ddd を先に持ってきた方が良いかも。
他にはファイルに入れたパターンを join して、evalする方法もある。
511 :
506 :2006/01/10(火) 23:48:53
>>508 さん、
>>510 さん、ありがとうございます。
qrとかmapとか\bとか、いろいろ勉強になりました。
mapの部分とかが時間がかかるのならば、サブルーチンの中に入れるよりも、
一番最初にグローバル変数として作っておくべきですかね。あとnextで
抜けるのも忘れていました。^dddを一緒に、というのは明日職場でやってみます。
またよろしくお願いします。
Perlで作ったプログラムの二重起動を防止する方法を 考えているのですが良い方法が思いつきません。 何か良い方法ありませんでしょうか?
>>512 UN*Xなら/var/runに<script_name>.pidファイルを置くのが常套手段。
起動時にvar/run/<script_name>.pidを検索しあったら起動しない。
丁寧にやるなら多重起動につき起動キャンセルの旨のログを
cronやほかのprogramから起動時はログに吐く
コマンドラインから起動されたらSTDOUTにもアラートを吐かせる。
winはどうやるのかなあ?
perl -vで何も表示されないのはインストール失敗ですか?
>>512 #!/usr/bin/perl
use strict;
use warnings;
use IO::File;
use Fcntl qw(:flock);
my $lock_f= $ENV{SCRIPT_NAME} || $0 || '/tmp/lock';
my $lock= new IO::File($lock_f,'+<') || die("$lock_f:$!");
flock($lock,LOCK_EX|LOCK_NB) ||die($!);
# 適当に処理
webprog辺りでやってくれるとありがたいのだが エラーメッセージくらい書けよ
すいません、再起動したら上手くいきました。 環境変数いじったときだけ再起動するのかと思ってました。 スレ汚しすいません。
すみません、cygwinのスレで質問しましたが 相手にされませんでした。 ここで質問させてください。 perlのリャマ本で、以下の文がありました。 open passwd, "/etc/passwd" or die "How did you get logged in ? ($!)"; while (<passwd>) { chomp; if (/^adminidtrator/i) { print "iroiro!"; } } Unixのかわりにcygwinで実行したら、 die 以下が実行されました。 なんで、passwdが開けないのですか? 宜しくお願いします。
CygwinのPerlを実行しているつもりが、実は ActivePerlを実行しているとか
CGI を書くときには 有名なとほほさんの
http://www.tohoho-web.com/cgi/wwwperl.txt のように
環境変数を直接読むのが普通です。
ただ、近頃は、CGI.pm を使うの方法も増えているようです。
でも、聞いた話によると、CGI,pmを読み込む分、環境変数を直接扱うより遅くなるそうですし、
使えない環境もあるそうです。
なんか、CGI.pmのマニュアル見ても難しそうだし、結局、CGI.pmを使うメリットというのは何なのでしょう?
有名なって… 目を覆いたくなるような悲惨なスクリプトだな。
開いた瞬間に拒絶反応起こしたwwwww
とほほさんより有名なサイトを作れない雑魚どもは黙れ
528 :
523 :2006/01/12(木) 01:32:10
スレ違いすみませんでした。 WEBプログラミング板で聞き直します。 でも、とほほさんのスクリプトって、そんなに酷いのでしょうか? みんなここを見て勉強しているはずですけど。 とほほさんより良いサイトがあれば教えてください。
>>526 >とほほさんより有名なサイトを作れない雑魚どもは黙れ
とほほにもKENTにもWeb裏技にも世話になったし感謝もしてるけど
今となってはどうしようもなく汚く移植性にも再利用性にも欠ける
最悪スクリプトなのは確かだ。
かつては先生として、今は反面教師として役に立っているwww
再利用性があれば良いってもんでもないけどな と、移植性や再利用性が自己目的化して、本来の目的を 達成できない大量のJavaだけプログラマを見ていると思う
531 :
523 :2006/01/12(木) 01:45:10
昔は良かったけど近頃は酷くなったということなのでしょうか? 技術力がマイナス成長したということ? あまり、あり得ない気がするのですが。 ここが悪いというのであれば、反面教師でないサイトを具体的に教えてもらいたいのですが。
533 :
523 :2006/01/12(木) 02:01:11
テンプレにあった
http://www.site-cooler.com/kwl/perl/ を見てみましたが、とほほさんのところが悪くて、ここが良いといわれる理由がわかりません。
そもそも、OLE使って Excel を使うとかソケット使ってメールを送るとか、難しいことは書いてあるのに、
肝心のCGI の説明が全くありません。
普通にCGIを使うだけならとほほさんのところが一番良いように見えるのですが。
本に関しては、今すぐ見れないので何とも言えないのですが....
>>533 自分が良いと思ったら他を否定してないで信じて学べ。
とほほで勉強してPerlでいろいろ作って2年ぐらいしたら
KENTやとほほ流のやり方の限界がきっと見えてくる。
すぐ正解を求めないで、もっといろいろ勉強することだ。
とりわけ、こんなところにカキコしている暇があるなら
1ステップでもコードを書いたほうがいい。そしてコードを膨らませて
取り返しの付かないような失敗もするべきだな。
とほほさん最高!! 煽りしかできない根暗オタクどもは逝ってよし!
私的にPerお勉強サイトはsmartが一番良いと思うけどね。
537 :
523 :2006/01/12(木) 02:51:36
>534
http://www.site-cooler.com/kwl/perl/ を否定するつもりは有りませんでした。
もし、否定しているように見えたのならすみません。
# どちらかというと、否定されているのは とほほさん のような....
でも、マジで、どの辺がどうダメなのか具体的に教えて欲しいのです。
ダメだダメだといわれるのに、どこが悪いかわからないと、勉強しようがないじゃないですか?
# とほほさんに対する単なるヒガミってことは無いですよね?
>>537 >>529 とかに書いてある。推測だけど、今となっては…ってのは
何にも知らない頃はわからなかった悪いところがわかるようになった、ってことでは。
入門編としてはわかりやすいと思うけど門から先に入るにはちょっとね。
ここはとほほさんを妬むクズの溜まり場 まともな話ができるWebProg板に行こうぜ!
初心者でもわかりやすく説明するにはあれぐらいが妥当じゃないか。 KENTもPerl初心者の頃は行単位の処理がわかりやすかった。
$hoge = "/foo/bar"; use lib $hoge; のようなことをしたいのですが、このようにすると use lib $hoge; のとこどでエラーになってしまいます。 use lib 変数というのはできないのでしょうか?
WebProg板ではあのコードが御神体
>534 そんなことを言っていると、とほほを手本にした糞スクリプトが大量に発生してしまう。 (既に大量発生しているのだが) 確かに、向上心のあるヤツならがんばって、そのうち限界が見えて来るかもしれない。 だが、ほとんどの人間はがんばりもせず、やり方に疑いも持たずに糞スクリプトを日々生産するだけだ。
>541 use が実行されるタイミングは、$hoge="/foo/bar"より前になるので、できない。
>>543 若いものがその体たらくではわしらの時代もまだまだ安泰じゃのう。
ガッハッハッハ
───大原巌@月下の棋士
板違いの話は相手する方も問題だな。無視しろよ。
板違い質問に対しては誘導以外はレス不可とテンプレに書いてくれ。 わけがわからない質問者よりわかってる分悪質だ。
カカオかよwwwwwwwwww
>>537 とほほの方法は非常に仕組みを理解しやすい反面、環境変数決め打ちなので
・参照できない、或いは存在しない環境変数
・参照した結果なにも入っていない環境変数
を判定できない。
具体的なところではCONTENT_LENGTHやCONTENT-TYPEはCGIの場合
POSTでデータが送信されないとそもそも存在しないわけだが、
件のスクリプトでは存在して空文字列が入っているように見えてしまう。
また、
・指定していないが実は存在する環境変数
・サーバのバージョンアップなどで新しく追加された環境変数
もキャッチアップできない。
print "Content-Type: text/plain\n\n";print "$_ = ",$ENV{$_},"\n" for (sort keys %ENV);
こんなワンライナで、参照可能な全環境変数を確認できるし、
Content-Typeにtext/plainを利用すればタグ出力も不要だし
ターミナルからコマンドで確認する場合も楽だ。
(1行目を読み飛ばせば良いだけだからな)
まずそんなことはないと思うが絶対無いとは言い切れない
「どこかの環境変数に"</xmp>"という文字列が入っていたら?」
「どこかの環境変数に悪意のvbsやJavaScriptが入っていたら?」
という潜在問題への対処でもある。
こういうのは本やWebを読んでるだけじゃダメでたくさんスクリプト
書いて、ハマって、解決しないと身に付かないし、そもそも経験則
なので、blogなどに散見されるがまとまったFAQにはなりにくいんだ。
>>607 じゃ売ればいいじゃん
♪高値で掴んで走り出す 行く先もわからぬまま
暗い夜の帳の中へ
これ以上損し出したくないと 損切った昨日の引けに
自由になれた気がした その日の夜
perldoc perldebug してみたところ、デバッガの起動例として、 > $ perl -d -e 42 というのがありました。 この 42 って一体何なんでしょうか? 「銀河ヒッチハイクガイド」と関係ありますか?
553 :
デフォルトの名無しさん :2006/01/12(木) 16:12:56
data.txtとdata1.txtを単純に以下のように連結しdata3.txtに書き出す方法を教えてください。 よろしくお願いいたします。 data.txt data1.txt 1,山田,A 1,山田さん,10 2,鈴木,B 2,鈴木さん,15 data3.txt 1,山田,A,1,山田さん,10 2,鈴木,B,2,鈴木さん,15
1. おもむろにテキストエディタでdata.txtを開く 2. 置換で行末に , を付ける 3. data1.txtを開き、全て選択してコピーする 4. data.txtに矩形貼り付けする 5. 名前を付けて保存でdata3.txtを作成する
Excel
冬休みの宿題か? #!/usr/bin/perl use strict; use warnings; use IO::File; my %data1= parse('data1.txt'); my %data2= parse('data2.txt'); my @keys= unique( keys %data1, keys %data2 ); my $fh= new IO::File('data3.txt','>'); for( sort @keys ){ my $key= $_; my @data1= @{ $data1{$key} || [] }; my @data2= @{ $data2{$key} || [] }; print $fh join(',',map {nval($_)} ($key,@data1[1..2],@data2[0..2]))."\n"; } sub nval{defined $_[0] ? $_[0] : ''} sub unique{my %t;grep !$t{$_}++,@_} sub parse { my $file= shift; my $fh= new IO::File( $file ) || die("$file:$!"); my %r= (); while(<$fh>){ chomp(); my @data = split /,/,$_; $r{ $data[0] }= \@data; } return wantarray ? %r : \%r; }
557 :
553 :2006/01/12(木) 16:36:17
558 :
553 :2006/01/12(木) 16:43:58
>>556 おーっ すごーい。
556さん 感動です。感謝申し上げます。
宿題ではないです。有り難うございました 。
そんなもん paste -d, data.txt data1.txt で終わりじゃねーか。
>>559 Perl のスレだからな。
open eyes, pop or die;
open mind, pop or die;
chomp, print, print "\054".
<eyes> for @your = <mind>
ポエムキタ-
なんか無理に問題を難しくしてないか?
open IN1,"data.txt"; open IN2,"data1.txt"; open OUT,">data3.txt";
while(<IN1>){chomp; print OUT $_ . ',' . <IN2>;}
close OUT; close IN2; close IN1;
じゃダメなのか?
まあこんなことは俺も迷わず
>>559 と同じことをするけど。
1列目がIDでマージするのかと(日ごろそういう作業が多いので)勝手に思い込んでましたOTL
567 :
523 :2006/01/12(木) 23:42:17
>549 確かに前半部分は print "Content-Type: text/plain\n\n";print "$_ = ",$ENV{$_},"\n" for (sort keys %ENV); で済むし、書き方がスマートで無いことはわかりました。 スレ違いなのに、ありがとうございました。
568 :
523 :2006/01/12(木) 23:43:51
スレ違いなのはわかっていますが、最後に一つだけ教えてください。 とほほさんのコードで、もっともよく使うのは以下の部分です。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); } else { $query_string = $ENV{'QUERY_STRING'}; } @a = split(/&/, $query_string); foreach $a (@a) { ($name, $value) = split(/=/, $a); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; print "$name = $value\n"; $FORM{$name} = $value; } これが最悪とおっしゃる方々に質問です。 これを、最良の書き方をすればどうなりますか? WebProg板で普通のコードが最悪とまで言われているのがいまだに理解できないのです。 「最悪」「反面教師」とまで言っておきながら、どこが悪いのか549以外は指摘しないし、 とほほさんを否定するばかりで、とほほさん以上のサイトを紹介してくれないですし。
とほほ信者うぜぇ
>>568 それは別に普通のコードだと思うけど…
妙にmap{}とか使ったりしてるコードの方が読みにくい
ま、色々なスレを数年ROMれば分かるようになる。
>568 この板にいるのは口先で悪口言っているだけで、実際自分では何もできない煽りばっかりなんだから、 あんまりまじめに相手するなよ。
>>568 コーディングに限った話をすればフォーマットの"C"が無駄なくらいだな
Content-Lengthの最大値が無いのでメモリ食い潰し DoS攻撃を受けるな
readのエラーチェックが無いから入力が途中で切れたり したらCGIの内容によっては大変なことになるかもね
>>568 > これが最悪とおっしゃる方々に質問です。
> これを、最良の書き方をすればどうなりますか?
自分で「最良の書き方」を考えても車輪の再発明どころか
劣化版ができあがるだけなので世の中で広く使われている
モジュールを使います。Perlに限ったことではありません。
ブラウザ別Cookieの解析やマルチパートが必要になったら それもとほほの実装をコピペして使わないといけない。 てゆうかあるのか?w
フォームの値はデコードしてるのに名前はデコードしないのか
た し ま り 参 て 盛り上がっ
580 :
デフォルトの名無しさん :2006/01/13(金) 02:01:46
とほほって有名なのか?全然知らんかったけど.
で
>>568 のコード現代的な Perl としてはいまいち.
簡単にいって,
1. use strict; がない (コンパイル時のチェックがきかない)
2. CGI, CGI::Util モジュールの再実装
3. my を使ってない,あと変数名がいまいち
がだめ.いま perldoc 見れない環境だからうろおぼえでかくけど普通↓だろ.
use strict; # この行がないのは基本的にだめ
use CGI;
use CGI::Util;
my $q = CGI->new;
my @names = $q->param;
foreach $name (@name) {
my $value = CGI::Util::unescape($q->param($name));
print "$name = $value\n";
$FORM{$name} = $value;
}
581 :
580 :2006/01/13(金) 02:04:06
あぁぁぁネボけて挙げてしまった…もうねるわ 処理内容としても一対一で翻訳したので微妙だがなー
582 :
551 :2006/01/13(金) 02:32:32
>>552 読んでもよくわからないのですが・・・
一応確認なのですが、
42 でなくても、 0 でも 1 でも 100000 でも効能は変わらんのですよね?
>>(512+64+4+2) もう1回読め。
584 :
583 :2006/01/13(金) 04:40:07
>>568 なんでperl4から5に移り変わる前後に思考停止してそれ以上向上しようとしない人達を
信じてこだわっているのか自分にはよくわからないんだけど...
膨大なモジュールの中から標準モジュールとして選ばれ、多く人から検証されているモジュールをなぜ否定するんですか?
そしてより少ない人からしか検証されていないコードを良しとするのですか?
広く知れ渡っている設計モデルやデザインパターンを否定し、あえてスパゲッティーになりやすい冗長ないコードを書き続けるのはなぜですか?
なぜ、バグの混入が少しでも少なくなるように提供されそして、使う事を推奨されているてる機能を使わず、
たびたびバグを発生させるのですか?(使っていてもバグは発生するのに...)
なぜ、同じコードを何度も(コピペだろうけど)書こうとするのですか?
なぜ、10行コーディングすれば済むプログラムをわざわざ100行かけてコーディングしようとするのですか?
色々考えそして経験していけばそのうちわかると思う。
586 :
551 :2006/01/13(金) 05:02:43
587 :
551 :2006/01/13(金) 05:07:41
あ、 perl 5.005 の頃から 42 とあるので違いますね。 まあとりあえず数字に深い意味はないことがわかったので良しということで。
590 :
549 :2006/01/13(金) 12:44:01
>>568 説明すると長くなるから
ttp://perldoc.jp/docs/perl/5.6.1/perlfaq9.podの How do I decode a CGI form?の項を1000回読め。
とほほのコードがどうしてまずいのかがよ〜く解るだろう。
ついでにCGI.pmはpure perlだから読んでみるとよかろう。
もし君が解読しきれなくても本当に正しくフォームデコード
するというのはどんなに大変なことなのかぐらいは解るだろう。
CGI/util.pmのunescapeメソッドを読むだけでも君は
ここで「とほほのコードはWebProg板では普通のコード」
と言い切ってしまったことをとても恥ずかしく思うようになるはずだ。
cgi.pmのマニュアルがよく解らないというのはオブジェクト指向や
参照渡しがよく解ってないからじゃないのかな。
cgi.pmにはcgi-lib.plもどきの関数インターフェースもあるので
Webを漁って探してみてくれ。日本語訳もあるよ。
まあ頑張れ。
なんだ?ここはCGI.pm信者ばっかなのか? あんなクソ重くて不要な機能テンコ盛りのモジュールのどこがいいんだか こればかりは車輪の再発明させてもらったよ
プギャプギャ━━━━m9(^Д^≡^Д^)9m━━━━ッ!!!!
信者とかそうじゃないけどな やりたいようにやればいいんじゃない?プゲラッチョ
信者ということにしてしまわないと自分の居場所がないんだよ。 そっとしておいてやれ。
595 :
591 :2006/01/13(金) 14:37:17
だってあんなクソモジュール、信者以外の誰が使うの? マジで教えてほしいんだけど、頼む
俺もCGIモジュールはあんま好きじゃないな
だからって自分で書いたらその糞よりもっと糞になっちゃうような気がするんだが
軽けりゃいいのよぉ
こうしてセキュリティホールが日々生まれているわけだな
どこまでセキュリティホールって言うんだか
私も CGI.pm は重い、というか、あまり使わない機能がてんこもりな気がしています。 かと言って車輪を再発明するのはいやなので、既存ので良いのがあれば良いのですが、 基本的な機能だけの機能限定版とか、必要なときに必要な機能だけを use するとか、 そういうのでおすすめなものがあれば教えていただきたいです。
一昔前のマシンスペックならまだしも 今時重いとか何言っちゃってんの?
うちのサーバは一昔前のスペックですが
■テストコード use strict; use warnings; use Benchmark qw(:all); ## テスト2ではコメントアウトをはずす # use CGI; # use CGI::Lite; my $count= 10000; sub use2 { delete $INC{ my $pkg = shift }; eval "use $pkg;";#テスト2ではコメントアウトする return $pkg; } sub func {my$p=use2(shift);my$o=$p->new();} timethese($count, { 'CGI'=> sub {func('CGI')}, 'CGI::Lite'=> sub {func('CGI::Lite')} }); 1; __END__
■テスト環境 OS :CentOS4.2 CPU:AMD Duron 1GHz MEM:256MB ■テスト結果1 Benchmark: timing 10000 iterations of CGI, CGI::Lite... CGI: 9 wallclock secs ( 9.18 usr + 0.00 sys = 9.18 CPU) @ 1089.32/s (n=10000) CGI::Lite: 6 wallclock secs ( 5.94 usr + 0.00 sys = 5.94 CPU) @ 1683.50/s (n=10000) ■テスト結果2 Benchmark: timing 10000 iterations of CGI, CGI::Lite... CGI: 3 wallclock secs ( 3.18 usr + 0.01 sys = 3.19 CPU) @ 3134.80/s (n=10000) CGI::Lite: 1 wallclock secs ( 0.66 usr + 0.00 sys = 0.66 CPU) @ 15151.52/s (n=10000)
秒間1000回以上実行できるんですけど...重いですかね?
塵も積もればなんとやら
オーバーヘッドを考えてない馬鹿発見
お前も釣りが好きだな
>CPU:AMD Duron 1GHz >MEM:256MB 高スペック杉
>>604 use される時や new() の中でやってる処理の内容が全然違うから
そんなの比較しても何の意味も無いよ。
オレはTemplate Toolkit使ってるのでCGI.pmのオーバヘッドなんてゴミみたいなもんだぜ。
use CGI; ($u, $s) = times(); print $u + $s, "\n"; これで十分なベンチだろ ちなみに俺の環境(Cel2.4G + 512MB ActivePerl5.8 WinXP)だと 0.14〜0.155で安定しとる
CGI自体のオーバーヘッドに比べればネコパンチ程度だよ。 塵も積もればはわかるが事実上デフォルトなモジュールなんで なるべく使うようにしてる multipartなんかの処理も論理的に書かれてるし。
それとコンソールから ./abc.pl mode=preview&name=taro でフォームと同様に値を取れるのでデバッグ時にも便利。
CGI.pm自体は仕方が無いけど 他モジュールでCGI.pmへの依存度が高いのはなんだかなとは思う それこそCGI::Applicationなんかquery、header、cookie位なんだからリファクタして欲しい(他人任せ)
では次のご質問どうぞ。
いずれにしても自分で書くのはクソという結論には変わりない とほほのコピペともなれば尚更無意味 あっ、でも遊びで書いてる人はいいのかな
>>610 それのどこが高スペックなんだ・・・
今時ノートPCでもそれ以上あるし、サーバ用途ならむしろ
低スペックだっつーの
ああ言えばこう言う
622 :
523 :2006/01/13(金) 23:33:37
CGI.pm を使う最良のコードになるかを示して欲しかったのですが、 「CGI.pm を使う」というだけで、実際にCGI.pmを使ったコードを 書いたのは 結局 >580さんだけですね。 この >580 のコードには >574 さんの指摘した「Content-Lengthの最大値が無いのでメモリ食い潰し」 >575 さんの指摘した「readのエラーチェック」 >578 さんの指摘した「フォームの値はデコードしてるのに名前はデコードしないの」 というのは対応済みなのでしょうか? >585 「そしてより少ない人からしか検証されていないコードを良しとするのですか?」 google で検索した結果 とほほ CGI の検索結果のうち 日本語のページ 約 338,000 件 CGI.pm の検索結果のうち 日本語のページ 約 32,000 件 一桁以上違いますね。 「知名度は質と比例しない」と言われてしまえばそれまでですけど。
623 :
523 :2006/01/13(金) 23:34:09
とはいえ、何となく、CGI.pmを使ったほうが良いという理由もわかってきました。 以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」 と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、 さっぱりわかりませんでした。 どこが悪いかも指摘せずに、そんな言い方をされても、簡単には納得できないのは 普通だと思います。 間違っているかもしれませんが、自分の理解としては、 とほほさんのやり方は「最悪」と言うよりも......不完全?...というか、足りない?.. ...というか漏れがある?....みたいな雰囲気なんですね。 でも、なんで有名サイトはCGI.pmを使っってないんでしょう? とほほさんとか KENT とか、みんなCGI.pm を使ってません。
偉そうなことを言ってるけど、CGI.pm使ってるのはまだまだ少数派だからな。 以前より衰えたとはいえ、主流はまだまだとほほ系だよ。
Perl 5.8 が主流になりつつある今、 敢えて 5.005 をひきずったコードを参考にすることはないっしょ。 5年前なら「とりあえず KENT やとほほのコードを見れ」で良かったかも知れんけど。
>623 >でも、なんで有名サイトはCGI.pmを使っってないんでしょう? >とほほさんとか KENT とか、みんなCGI.pm を使ってません。 なんであんなサイトがなぜ有名なのか、こっちが聞きたい。
>>623 CGI.pmがデフォで置かれてないサーバもあるし、みんながそうしているから。
今はどうなっているか知らないけどURI unescapeもなぜか効率の悪くて汚いコードが驚くほど出回ってた。
CGI界の不思議。
628 :
520 :2006/01/13(金) 23:45:51
>521 cygwinのshellで実行しているので、それなないです。 >522 よくエラーメッセージを読んで解決しました。 open passwd, "../../etc/passwd"#<-----------------相対パス or die "How did you get logged in ? ($!)"; while (<passwd>) { chomp; if (/^Administrator/) { print "eureka!"; } } 相対パスじゃないとダメみたいです。 絶対パスはなんでダメなんでしょう。 これはcygwinのperlの仕様なんでしょうか? スレ違いならごめんなさい。
>>521 >cygwinのshellで実行しているので、それなないです。
perl -v で確認したのか?
>>626 どういうサイトのほうが有名になるべきなのか教えていただけますでしょうか?
もういいじゃない ずっととほほのコード使ってればいいと思うよ どうせ中学生の趣味プログラミングだろうし その昔、BASICのGOTOプログラミングに夢中になった 子供たちと同じだと思えば実に微笑ましい
632 :
580 :2006/01/14(土) 01:12:01
>>622 基本的に貴方の示したコードを 1:1 に直訳しただけですからね.
CONTENT_LENGTH -> $CGI::POST_MAX=1024; # 1024 バイトに制限
read のエラーチェック -> 十分ではないですが,標準でされてます.
デコード -> CGI::Util::uscape() 使ってください
正直とほほとか KENT とかは一瞥しただけでコメントしかねますが,
かわりにオススメの Perl 入門を…
1. Learning Perl(O'reilly 入門 Perl)
Windows ユーザーなら Win32 のほうを.2. 以降は結構高度なので,まずこれを飽きるまで読むといいですよ.
2. Programming Perl(邦訳:プログラミング言語 Perl )
3. Advanced Perl (邦訳:実用 Perl プログラミング)
4. Object Oriented Perl (邦訳:オブジェクト指向 Perl マスターコース)
今は Perl Best Practice を読んでます.これはすごくイイ.
633 :
580 :2006/01/14(土) 01:12:55
あぁぁぁ,また age ちゃった…もう消えまつ
>とほほ CGI の検索結果のうち 日本語のページ 約 338,000 件 なんで"日本語のページ"?
簡単な判断基準を教えてやろう use string; がなかったら読む価値なしの場合がほとんど
何故とほほが有名かというと、本当に正しく作らないと 困るような重要なWebプログラムは、そもそもPerl+CGIで 書かれないから。例外はいくつもあるけどね。MovebleTypeは Perlだっけ。 だから、PerlのCGIプログラムを探すと必然的にどうでもいい コードばかりザックザック出てくるわけですw ハカーに攻撃されても困らないからいい! ちょっと負荷が 掛かったらポシャルくらいは別に気にしない! プログラムの メンテナンスなんて不要! バグなんて知るか! そういう 場合はとほほ式のプログラムを作るといいでしょう。 あ、皮肉じゃあ無いですよ。適材適所ってことです。
×string ○strict
mod_perl使わない程度の開発案件とか 1年くらいで使わなくなる程度の案件なら 冗長(というかいい加減に)書くこともあるし 時と場合だよねぇ
>>623 > 以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」
> と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、
> さっぱりわかりませんでした。
知りたい側が成長しなきゃ理解できないことのほうが世の中多いんだよ。
「今の自分がどんなに未熟でも、説明のほうがちゃんとしていればどんな物事も理解できるはず」
っていう間違った信念持ってない?
>それぐらいもわからないのか これでどういう成長を期待してるんだかw
オフトピだが、>640に一言。 知らせる側がきちんと説明しないと理解してもらえないことの方が世の中多いんだよ。 「説明がどんなに酷くても、自分が正しければ相手は理解するはず」 っていう間違った信念持ってない? たいていの場合、どんなに正しくても、権限を持っているお偉いさんたちに、わかりやすく説明できないと、 予算が取れないのですよ。 逆に、どんなに間違っていても、わかりやすく説明して、納得してもらえると、あっさりハンコもらえる。 君も大きくなって、苦労したららわかると思うよ。
>>640 > 以前は「勉強しろ」「何年か使い続ければわかる」「それぐらいもわからないのか」
> と言った抽象的な精神論みたいなコトばっかり言われて、どこが悪いのか、
これで伸びる奴も居れば、辞める奴もいる。
まあ発奮させるにしても下手な煽り方ではあるな。
644 :
520 :2006/01/14(土) 05:40:07
>629
申し訳ありません、嘘ついていました。
perl -vで確認したところ、
This is perl, v5.8.6 built for MSWin32-x86-multi-thread
(with 3 registered patches, see perl -V for more detail)
Copyright 1987-2004, Larry Wall
Binary build 811 provided by ActiveState Corp.
http://www.ActiveState.com ActiveState is a division of Sophos.
Built Dec 13 2004 09:52:01
略)
Active State社のものでした。
さらに、パスは
/cygdrive/c/Perl/bin/perlでした。
私は、cygwinのperlでなく、Active〜のを使っていたようです。
それが原因か調査してみます。
645 :
640 :2006/01/14(土) 06:44:45
>>642 > っていう間違った信念持ってない?
持ってないよ。
ていうか、唐突にまったく関係ない話を始められても困っちゃうな。
646 :
640 :2006/01/14(土) 07:14:32
>>643 といっても仕方ないんだよな。
学習者の理解度より数段階先の話や、経験から思い知ったことへの対策の重要性を、
「現時点の学習者」に技術面で理解させ、納得させるのは至難だもん。
その辺は学習者にコツコツとステップアップしてもらうしかない。
ちなみに君のすぐ上に、主人公もゴールもまったく異なる話を始めて俺に噛み付いてる人が
いるんだけど、この人のラスト一行って、ものを理解するための必要事項として
「経験を積む」ことを挙げるという、俺の主張とまったく同じ内容になってるんだよね。
一体何に噛み付きたかったんだろw
647 :
523 :2006/01/14(土) 08:24:49
>580さん とほほ方式はココがダメ!と指摘されているのに、CGI.pm方式で書いても、 同じ問題が残っているように感じたので質問させてもらいました。 ・CGI.pmで書いても書き方によってはとほほ方式で指摘された問題が残る場合がある。 ・ただし、その問題解決のための関数は既に用意されている。 ということですね。 オススメの Perl 入門まで教えていただき、ありがとうございます。 (邦訳って...なにか、英語の原書を薦められてるような気も....) 週末、O'reilly 入門 Perl を買ってきます。 これまでの意見で一番参考になりました。ありがとうございました。
648 :
523 :2006/01/14(土) 08:28:08
>>640 成長しないと理解できないことが多いことは痛いほど承知してます。
ただ、2chで全く理由を示さないまま否定されても、
単なる煽りなのか、本当に問題があるのか判断できないのです。
たとえば、2chで
「Perl はダメだ。 Rakuda のほうがいい。理由? そんなの勉強すればわかる」
と言われて、Perlをやめて Rakuda を勉強する人は少ないと思うのです。
実際、まだみなさんの説明が完全に理解出来ているとは言えません。
でも、568 以降の書込はきちんと悪い理由を示してもらっているので、
煽りではなさそうだということがわかったし、なんとなくCGI.pmを使った
ほうが良さそうだとも思えるようになりました。
これからCGI.pmの使い方とか勉強していこうと思います。
いつか、理解できるようになったら、とほほ方式を頭ごなしに否定するのでなく、
「この点がこんな風に悪いんだよ」と説明できるようになりたいです。
スレ違いの上、チラシの裏ですみませんでした。
ん?なんだこの伸びようは まったりいこうよまったり
本人がまとめに入ったんだから 以後この話題続けた奴は荒らし決定な
> ただ、2chで全く理由を示さないまま否定されても、 > 単なる煽りなのか、本当に問題があるのか判断できないのです。 嘘を嘘と(ry
自分で煽りかどうかを判断できないなら、2chで 勉強しようとするなよw
はいはい次の質問どぞー♪
変なコテまで沸いてるし 末期だな
そう簡単に終わりなんて来ないよ 良い流れも悪い流れもアッサリ死ぬのが2ch
/ /-'― _/ ´―- 、ヽ ', ,′ i′ ヽ| l l l __ __ | l | | ィ´:::}' {:::::::l\ | | | ,|/弋ン ,. 弋_ソ l |. | |:.:.{ノ }⌒{ } -|.:.:. . .:. . l |:.:.ト---‐′ ヽ、_____,ノ |:.:.:.:.:.:.:.:.:.:.:.:.l . |:.:.', |:.:.:.:.:.:.:.:.:.:.:./ . |:.l:.\ ゚ |:.:.:.:.:.:.:.:.:.:./ l∧,ハ/')、 _,.|:.;.:.:.:.:.;.:.:./ ′ / /__ `7 _┬ _|Vj/∨∨ル′ / ´ -┤__ノ  ̄ ̄ \_ r| _┤: l:{ー ^ー ^ァ' ̄: :\
>>644 なら、それが原因だな。
とりあえず、cygwin perlで実行した結果を得たいだけなら
$ /usr/bin/perl 〜.pl
として明示的にcygwin perlを起動すれば良かろう。
もっとも、Cygwinのシェル内で実行したときには、cygwin perlが起動するように
pathを設定し直した方が良いと思うが。
これを期にCGI::Liteモジュールを使う形に移行しようかなと思ったのですが、 cpanにあるモジュールは再配布しても良いですか?
CGI::LiteはライセンスUnknownになっていて、作者もCGI::Liteを放棄して 行方不明とのことなのでいいんじゃないでしょうか。
661 :
デフォルトの名無しさん :2006/01/14(土) 18:22:18
C言語のプログラムからPerlのプログラムを呼び出すには どのような方法があるのでしょうか?
662 :
デフォルトの名無しさん :2006/01/14(土) 18:29:04
ヒアドキュメントで $a = <<UNKO; ・・・・・・ UNKO と $a = <<UNKO ・・・・・ UNKO ; って何か違いがありますか?
>>660 ライセンスあるよ。
>>659 のリンク先に書いてある。
>>661 呼び出して何したいかによる。
exec*、system、libperl、お好きなのをどうぞ。
665 :
661 :2006/01/14(土) 19:50:40
>>664 CプログラムからPerlプログラムを利用して得られた結果(文字列)を
Cプログラムで受け取りたいのですが、
このような場合にはどの方法が良いでしょうか?
>>665 受け取るだけ(対話的な Perl スクリプトじゃない)なら、popen() が簡単。
凝った事をしたいなら exec* を。
質問です。 perlに関しては、ver.4の頃の知識止まりで、最近の事を良く知らんのですが、 モダンなperlをサクッとエレガントに解説してくれるようなお勧め参考書ってありますか? cgiやら正規表現の初歩やら、スクリプトやOOPの何たるかをダラダラ書いてるような 本はNGってことで。
ありません
らくだ本
>>662 こう書けば分かりやすい?
$text = join "\n"x3,
<<_P_
1段落目
_P_
,
<<_P_
2段落目
_P_
;
$text = join "\n"x3, <<_P_, <<_P_;
1段落目
_P_
2段落目
_P_
違いと言えば、通常ありえないけど開始識別子の直後に複数行にわたるコードを書きたいときはセミコロンを後ろに持っていくしかないね
最近のらくだ本には、CTBCPPの話が載ってないんだよな。 CTBCPPの延長で、Perl5のチュートリアルがあればなぁ・・・。
>>672 SMART は駱駝本 2nd の劣化コピーに作者の偏った主張や
嘘を紛れ込ませたものという印象が強くて人には勧め難いな。
一見良サイトな分、余計にね。
河馬屋二千年堂にくらべればマシ
また微妙な
結局、良解説サイトはないのか?
>>676 「ズブの素人が取っかかりに読む」より上のものをお望み
なら、素直に駱駝本 or perldoc 、が正解だと思うよ。
変に噛み砕かれた説明で誤解して覚えるより、ほんの少し
苦労して正しく覚えた方が結局近道だしね。読み易い一次
情報なんだからそれ以上は望めないでしょ。
PerlわかるんならCPANモジュール見るのが良いんじゃない?
>>678 うん。実際のところ最近の流れで初めてCGI.pmを取っ掛かりに標準モジュールで
PurePerlなヤツ幾つか読んだけどスゲー勉強になった。星の数あるCPANから標準
になったものはPerlコーディングのお手本でもあるね。
やはりソースに勝る教科書はないな。
680 :
644 :2006/01/15(日) 12:56:47
>657 できました。 明示的にcygwinのperlを指定したら、 絶対パスで起動できました。 pathも切り替えます。 大変勉強になりました。 ありがとうございます。
>>670 そういう仕組みがあるんですね。知りませんでした
どうもありがとうございます
次の答えを教えてください。 以下のタグを結合したい。 (1)<M>hogeM</M><X>hogeX</X> → <X>hogeMhogeX</X> (2)<X>hogeX</X><M>hogeM</M> → <X>hogeXhogeM</X> (3)<M>hogeM</M><X>hogeX</X><M>hogeM</M> → <X>hogeMhogeXhogeM</X> ※<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeX</X> は結合しない。 <例> ※以下は一行で、\ は連結の意味です。 ......hoge.......<M>hogeM</M><X>hogeX</X>.....\ ........hoge......<X>hogeX</X><M>hogeM</M>.....\ .....hoge.........<M>hogeM</M><X>hogeX</X><M>hogeM</M>...\ .........<X>hogeX</X>................<M>hogeM</M>..\ ..<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeM</X> ↓ ......hoge.......<X>hogeMhogeX</X>.......\ ......hoge......<X>hogeXhogeM</X>..........hoge....\ .....<X>hogeMhogeXhogeM</X>............<X>hogeX</X>...\ .............<M>hogeM</M>...\ .<M>hogeM</M><X>hogeX</X><M>hogeM</M><X>hogeM</X> 正規表現でも、何でもOKなのでお願いします。
Perlでモジュールの勉強をするなら MorningMusume.pmのソースを読むべし。
読んでみたが 別に特にいいと思われる所は無かった smartので十分
恋してるんだろ
ん?どこが盲目なのん?もしかして作者さん? さらっと斜め読みしただけだから知らんけどね
また逃げんの速いな
俺も見てみたけど 別にぃ・・って感じ・・
あっ作者さんでしたか 失礼失礼^^;
モーオタかよ 勘弁してくれ
夜分遅くに質問すみません (Shift_JIS) $file = 'D:\picture\ニーソックス.jpg'; これを D picture ニーソックス.jpg に分割したいんですが split(/[\\\/:]/, $buf); こうすると ニーソックス の "ソ" の2byte目が "\" である事から D picture ニー・ ックス.jpg と、中途半端な所で切れてしまいます。 そこで split(/[^\x81-\x9f\xe0-\xef][\\\/:]/, $buf); と、Shift_JISの特性を考慮した所 \pictur ニーソックス.jpg となってしまいます。 何かスマートな書き方はないでしょうか。
696 :
695 :2006/01/18(水) 04:37:18
あ…あとスミマセン encodingプラグマは使わない方向でお願いします
splitじゃなくてキャプチャ使えば悩むことはない @list = $file =~ /((?:sjis|asciiから\と:を抜いた正規表現)+)/g
配列の中身をJcodeで変換したいのですが、 ループ毎に行うのしかないのでしょうか?
perlのメモリ管理についての質問です。 @hoge に1Gのデータが入ってるとして @hoge = (); と初期化したらメモリは開放されるのでしょうか?
700 :
699 :2006/01/18(水) 10:31:20
すみません。調べたらすぐに分かりました。 失礼しました。。。
漏れもしりたい。undef使ってるんだけどどうなの?
>>698 結局はループだが一行でどうだ
$_ = Jcode->new($_)->euc foreach @hoge;
mapを使っても書けるがこっちはメモリ効率が悪いからお勧めしない
@hoge = map { Jcode->new($_)->euc } @hoge;
>699-701 Perlは何やってもメモリ解放なんぞせんよ。 undefしても内部のメモリプールに返すだけ。 @hoge = (); はそれすらしない。 メモリ消費が心配だったら、その部分だけforkすればいい。
704 :
699 :2006/01/18(水) 11:59:11
>Perl は、ガーベジコレクションの機能を備えています。 だそうです。他のサイトも見たけど undef @hoge; は開放できて @hoge = (); は開放できないみたい。 ==== えと、すみません。 今度は調べたのですが分からないので また新しい質問させてください。 # a.pl $hoge = "a";1; # b.pl require "a.pl";print $hoge."\n";exit 0; で以下のように実行すると $ perl -w b.pl Name "main::hoge" used only once: possible typo at b.pl line 3. a $ と出てしまいます。この警告を消すことは出来ないのでしょうか? よろしくお願いします。
>>704 # b.pl
BEGIN { require "a.pl"; } print $hoge."\n";exit 0;
でもこのスレ的にはmy宣言してstrictなソースを書いたほうがいいかと
706 :
699 :2006/01/18(水) 12:10:12
>>705 ありがとうございます。とりあえず動きました。
BEGIN と strict についてはこれから調べてみます。
707 :
689 :2006/01/18(水) 13:42:30
>>702 ありがとうございます。こうしてみました。
my $jconv = new Jcode;
$_ = $jconv->set($_, 'sjis' )->euc foreach @hoge;
名前激しく間違えた
709 :
デフォルトの名無しさん :2006/01/18(水) 14:22:59
既出かもしれませんが、Perl5.8 で Encodeモジュールを使って UTF-8 -> ISO_2022_JP へ 文字コードを変換しているのですが、 全角チルダ(〜)が文字化けし、? に置き換わってしまいます。 Jcode を使うと正常に変換されているようなのですが、 今回勉強を兼ねて Perl5.8標準のEncodeを使用したく思っております。 何か解決策などありますでしょうか・・・?
>>704 >>Perl は、ガーベジコレクションの機能を備えています。
>だそうです。
そうそう。そのおかげでスクリプトを実行し終えると
使ったメモリはきれいさっぱり解放してくれるわけだよ。
実行中には解放なんてしないんだって。
実行中にメモリが足りなくなりそうだったら、動的に変数の生死を調べて 適宜解放するってのがGCだべさ 終了時に全解放されるのは当たり前
encodingプラグマが使えるPerlのバージョンは幾つからでしたでしょうか 後Encodeモジュールが標準搭載されたのもお願いします
716 :
709 :2006/01/18(水) 16:04:46
そうですか。。色々探してみたのですがわかりませんでしたので、 こんな感じで対応しておきました。 s/\x{ff5e}/\x{301c}/g;
質問させて下さい open関数はパイプや標準出力を開く事ができますが sysopen関数はファイルだけなのでしょうか? 宜しくお願いします
GCつーか参照カウンタだけどな まぁ、黒豹でも読んでくれ
>>703 > undefしても内部のメモリプールに返すだけ。
> @hoge = (); はそれすらしない。
@hogeの各エントリも返さない?
Perlで作ったデーモン走らせてるけど、ハッシュとかかなり大きく なることがあるので undef してるけど、ps 見る限り解放はされて ないような・・・ PerlのGCはメモリプールに返すためのものなのでは?
>>721 俺もそんなことあった気が。
誰か真相を教えてくれ。
>>701 気になったので、軽く確認してみた。ActivePerl 5.8.6
方法は、\@hogeの文字列値を使ってunpackのPで変数内を覗き見
@hoge=() では $hoge[0..$#hoge] が未アロケート状態に,
undef @hoge では加えてxav_array(配列管理用の領域)も未アロケート状態になった。
また、
・各要素($hoge[0..$#hoge])の文字列領域
・アレイ構造体のxav_array(中身はポインタの配列)
は開放時にメモリもfree(OSへのメモリ返却はライブラリに依存)されたが、
・各スカラーヘッダ構造体
・各スカラー構造体
はfreeされなかった。
xav_arrayの変化は、例えば
$#hoge=63; # xav_fill=63,xav_max=63
$#hoge=31; # xav_fill=31,xav_max=63;
@hoge=(); # xav_fill=-1,xav_max=63
undef @hoge; # xav_array=NULL,xav_fill=-1,xav_max=-1
といった感じ。
>>723 検証乙。Devel::Peek使うと楽だったんじゃないか?
725 :
721 :2006/01/19(木) 10:53:08
>>723 検証乙。
てことは、うちの環境がfreeしてもOSに返されないだけなのか。
どっちにしても、返されないんじゃ意味ないな・・・
知識が足りず理解しきれてないのですが、 ・undefしとけばfreeは呼ばれる。 ・freeで開放されるかどうかはOSに寄る。 ・()での初期化はfreeがよばれないので可能性すらない。 っていうことですか?
一般的なUNIXでは、free しても OS には返されない。
Perlでプログラミングするとき オブジェクト指向・デザインパターンバリバリ使ってる香具師いる?
my(@a,$a,%a); sub mem_check {print "$_[0],",`ps auxw|grep mem.pl|grep -v grep`;} $a = 'x' x 1000000;mem_check('scalar1'); $a = '';mem_check('scalar2'); undef $a;mem_check('scalar3'); $#a = 1000000;mem_check('array1'); @a=();mem_check('array2'); undef @a;mem_check('array3'); $a{a} = 'x' x 1000000;$a{b} = 'x' x 1000000;mem_check('hash1'); delete $a{a};mem_check('hash2'); undef %a;mem_check('hash3'); sub test1 {my @b;$#b=1000000;} test1();mem_check('test1'); sub test2 {my @b;$#b=1000000;undef @b} test2();mem_check('test2');
scalar1,***** 2693 0.0 1.3 9896 3324 pts/1 S+ 13:25 0:00 perl mem.pl scalar2,***** 2693 0.0 1.3 9896 3336 pts/1 S+ 13:25 0:00 perl mem.pl scalar3,***** 2693 0.0 0.9 8916 2360 pts/1 S+ 13:25 0:00 perl mem.pl array1,***** 2693 0.0 2.5 12824 6276 pts/1 S+ 13:25 0:00 perl mem.pl array2,***** 2693 0.0 2.5 12824 6284 pts/1 S+ 13:25 0:00 perl mem.pl array3,***** 2693 0.0 0.9 8916 2376 pts/1 S+ 13:25 0:00 perl mem.pl hash1,***** 2693 0.0 2.5 12836 6296 pts/1 S+ 13:25 0:00 perl mem.pl hash2,***** 2693 0.0 2.1 11856 5320 pts/1 S+ 13:25 0:00 perl mem.pl hash3,***** 2693 0.0 1.7 10876 4340 pts/1 S+ 13:25 0:00 perl mem.pl centOS 4.2上のperl 5.8.5でためしてみたのですが VSZもRSSもundefをしたところでへってるように見えます。
731 :
デフォルトの名無しさん :2006/01/19(木) 23:28:34
ここで質問して良いか疑問ですがどなたかご教授願います。 perlで認証付きサイトを構築しようと考えています。 まずlogin画面があり、認証後サイトを見れるという感じなのですが 認証後のサイトURL直入力などを防止する為にはどのような対応が良いのでしょうか? idとパスワードを画面遷移ごとにpostデータとして送るというのはなんか パスワードがソース内に表記されているという事で嫌な感じがしますが 一般的なのでしょうか? 最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない 方向で考えています。
print "1番目は[split(/,/, $aaa)]->[0]\n"; という文がうまくいかないので、 print "1番目は"; print [split(/,/, $aaa)]->[0]; print "\n"; としているのですが、何か他に良い書き方があるのでしょうか。 おねがいします。
>>733 カンマでいいじゃないか
print '1番目は', (split(/,/, $aaa))[0], "\n";
先日思いついたBad Tips
print "1番目は${\do{(split(/,/, $aaa))[0]}}\n";
print "1番目は${proc((split(/,/, $aaa))[0])}\n"; sub proc {\shift}
print "1番目は@{[[split(/,/, $aaa)]->[0]]}\n";
このスレの回答者はレベル高いね。 コードをいかに短くするかという点においては凄いと思う。 だけど、サーバのスクリプトには使いたくないな。 短さを求めるこれらの美学には、エラー検証・セキュリティ対策が抜け落ちてるから。 そんなわけで、C/Java風のコードになってしまう。お前らはそんなことない?
>>735 やはりperlfaq4とperlrefに同様の方法が載ってたか。すっかり見落としてた…
>>736 書き捨ては書き捨て、サーバの管理スクリプトは管理スクリプトでしょ
漏れはそういうのは結構エラー処理して書くよ。
しかし、それでもCやJavaっぽくなることはないと思うが・・・
短く書くことだけがPerlらしさではないと思うがどうかな
>>736 737の言うように短く簡潔なコードを書くこととエラー/例外処理を丹念に行うことは相反しない。
ただperlerは短く書くことそのものが目的になってしまいがちなのも事実。
Perlの場合、短さと簡潔さは両立すると限らない。
分かりやすくて短いのならいい コードを短くした上で結局コメントつけて解説するくらいなら、基本構文で書く
Cだと長くてエラー処理無しのコードも多いけどな Javaはエラー処理せざつを得ないから当たり前
そういや他の言語で書くときは絶対使わない三項演算子をPerlでは多用してしまう。 なんでだろ?
コーディングは文化
> 短さを求めるこれらの美学には、エラー検証・セキュリティ対策が抜け落ちてるから。 ヘボだからでしょ。
お前らって絶対難癖付けないと気がすまないタイプだよな
747 :
デフォルトの名無しさん :2006/01/20(金) 12:59:15
>>746 > お前らって絶対難癖付けないと気がすまないタイプだよな
頼もしいねえ。
749 :
デフォルトの名無しさん :2006/01/20(金) 13:04:35
クッキーについてですけどSet-Cookieで保存できる最大文字数ってどれくらいですか?
ブラウザの実装次第だけど大体は4096byte
実際 session id ぐらいしか食わせないけどな
754 :
733 :2006/01/20(金) 23:00:45
>>734 カンマですか、言われてみればピリオドでもいけますね。
気づきませんでした。ありがとうございます。
>>735 @{[[split(/,/, $aaa)]->[0]]}の @{[ ]} あたりがいったいどうなって
いるのか見当もつかないのですが、何を勉強すればよいのでしょうか。
「@[{」でぐぐってみたのですが、何も出ませんでした・・・
キーとなる言葉が御座いましたら御示唆くださいませ。
756 :
クロエ :2006/01/21(土) 00:00:14
【1】@〜Mまでユーザーが任意に入力した数値を総計 【2】☆・△・■ ユーザーが任意入力した3つの数値を総計 【2】÷【1】を結果として表示 以上の様なCGIをプログラミングしてもらおうと、代行屋さんに見積もりしてもらいました。17000円との事でしたが、普通のお値段でしょうか?カモられていないか心配ですw
え、オチは?
一ヶ月20日として、一人月50万なら、 一日2.5万円。 半日で1.75万円。 まぁ妥当なとこじゃねーの?
桁を一つ間違えているのかと思ったよ。
>>756 のような頭の足りない人間の相手をしなきゃならんし。
760 :
デフォルトの名無しさん :2006/01/21(土) 00:41:27
>>756 めちゃくちゃ安いな。
赤字でてるだろ向こうは。
>>756 地域によっても違うが、かなり安い。(正直、自分だったらこんな仕事受けない)
ただ、こんなところで聞いても何の役にも立たない。
心配なら他の業者に合見積もりをとること。
みんな優しいな。
そんなので金とれるんだ・・・おれでもできるな・・・ 学生だけど小使稼ぎと勉強がてらにコーディング出来るバイト探そうかな
>756 >763 みたいな素人が作るとしたらもっと安くできる。ただし出来は......
動きゃいいんだ・・・ちくしょう・・・
>>756 それ間違いなくぼったくり。作成時間5分。
my @k = (1..14, '☆', '△', '■');
my ($s1, $s2) = (0) x 2;
for (@k) { print "$_ は? "; (/^\d+$/ ? $s1 : $s2) += <>; }
print join('+', grep /^\d+$/, @k), " = $s1\n";
print join('+', grep !/^\d+$/, @k), " = $s2\n";
print "$s2 / $s1 = ", $s2 / $s1;
CGIなんだから入力用のページや結果出力用のページも作らないと。 1ページ辺りの相場は10000〜30000円程度、 CGIスクリプトはフルスクラッチで50000円くらい?
>>766 せんせえ、それCGIになってねえっす。
あ、ちゃくっとuse CGIで技術サイトにあるようなForm部品むき出しのようなの
取って付けても駄目っす。
みっともなくない程度に最低限のデザインもしなきゃクライアントに怒られるっす。
それに加えて、概要設計書、詳細設計書、仕様書、テスト設計書とテスト結果、
それにまつわる数回の打ち合わせ、瑕疵対応まで入れて半人日17,000円で
じゃキツいっす。(この規模だから概要設計書と詳細設計書は仕様書で代用
させてもらうとしても・・・)
どんな小さな、たとえ3行スクリプト作成10秒でもCGI一本\17,000は安いっすよー
俺SOHOで今仕事に困ってますけど、その値段ではCGI作成は受けられないですぅ。
>>766 そりゃ、こういう仕事やったことないなら、ボッタクリと思うかもしれんけどね。
CGIなんだから、それだけじゃ動かないだろ? フォームのHTMLの方も必要だし。
しかも
>>756 はどう見ても超ド級初心者なんだから、納品後に質問が来ることも
考えないといけない。「どうやって設置するの?」「FTPって何?」とか。
設置したサーバがメンテナンスに入っただけなのに、「動かない」と言ってくる
ことも考えられる。
(アフターサポート一切無しという契約でも、電話がかかってきて40分ロスするだ
けで、0.1人日くらいは損をする)
さらに納品書・仕様書や、請求書も作らないといけない。
打ち合わせなり納品時なりの交通費も問題だ。
そう考えると、
>>761 と同意見で俺は17000円では引き受けない。ペイしないもん。
フォームHTMLとセットで最低4-5万円はもらわないと。
>>767-769 まあ、実務経験者と趣味でやってる素人の違いということで。
今頃766は顔真っ赤にしてるだろうから、そろそろ勘弁したれw
世間知らずの学生とWeb屋はWebProg板逝け
$txt="abcabc"; print $1 if $t=~/(a.*?$)/; この場合、*? を使用しての最短一致なので abc となると思ったのですが、abcabc となります なぜでしょうか?
そりゃ終端へのマッチを要求してるからね。
ああ違うか。どこから一致させるかとかは門外漢なので他の人に。
>>772 初心者が嵌りがちなとこ。よって、あんたはまっとうな初心者。
今後もまじめにやる気があるなら、推奨書を買いなされ。
777 :
766 :2006/01/21(土) 13:51:45
778 :
デフォルトの名無しさん :2006/01/21(土) 14:23:22
Perlでhtmlファイルを書き出したいんですが、どこか解説サイトないですか? 分かりやすいサンプルでもいいのでお願いします。
open OUT, '>./out.html'; print OUT '<html>'; close OUT;
781 :
クロエ :2006/01/21(土) 16:34:45
板違いでしたね。ごめんなさい。 777さんありがとうございます。試してみます。
782 :
デフォルトの名無しさん :2006/01/21(土) 16:58:05
>>776 推奨書ってこれ?
http://www.oreilly.co.jp/books/4873111307/toc.html >>772 最短一致とか最長一致とかいう表現が悪いんだと思うよ。
非欲張りマッチと欲張りマッチって言うとまだマシ。
正規表現エンジンの気持ちになって考える。
1. abcabc に対して /(a.*?$)/ がマッチするか試し、NG なら次
2. bcabc に対して /(a.*?$)/ がマッチするか試す、NG なら次
3. cabc に対して /(a.*?$)/ がマッチするか試す、NG なら次
4. abc に対して /(a.*?$)/ がマッチするか試す、NG なら次
5. bc に対して /(a.*?$)/ がマッチするか試す、NG なら次
6. c に対して /(a.*?$)/ がマッチするか試す、NG なら次
で、1. でいきなり成功しちゃってるから。abcabc になる。
/.*(a.*?$)/ で欲張りマッチの方に余計なもの奪わせるといいんじゃね?
正規表現なんか使わない方が速そうだけど。
世の中はライブドアでそうぞうしいわけだが、 こうなるとPerlスレとしては小飼さんの様子が 気になるな。
な、なんだってー
ついにperl、情報処理試験のプログラム問題に出るようになりましたね^^ 今パンフレット見てて気づいた。
787 :
デフォルトの名無しさん :2006/01/21(土) 21:36:17
あげ
教育用言語としてPerlを出すのは如何な物かと思うが……
マジか!情報処理受けるからCやらなきゃと思ってた矢先に超ラッキー
でも、perlは高度区分で出題されるみたい
なんと言うか、そういう試験にいくらでも書き方があるPerlを使うのは間違ってる気がする brainfuckとまではいかないが、言語仕様が明確で簡潔な言語を使用するべきだと思う
Schemeだな
>>790 あれ? 高度区分は疑似言語しか出ないんじゃなかったっけ?
プログラミング言語自体が出題されるのは第二種(今の"基本")だけだったような
まぁ、はるか昔のことなのでもう忘れたが
このスレも流行っちゃいそうだな
いい事だ
Perlの「仕様」wwww
試験に申し込むとラクダ本がついてくるならうれしいな。
やべ、ラクダ本一時的に売り切れるかもしれんな 下巻今のうちに買っておこう
あと2,3ヶ月もすると春やねぇ
---hoge.pl--- use strict; my $hoge = require './abc.pl'; print $hoge->{a}; ------ ---abc.pl--- $VAR = { a => 123, b => 456}; ------ mod_perlの環境で動かすと2回目以降のアクセスで Can't use string ("1") as a HASH ref while "strict refs" in use at hoge.pl が出てしまいます。 これは1回目は$hogeには$VARが代入されるが2回目以降はコンパイル済みなのでrequireが1を 返すためだと思われます。 $INC{abc.pl}を意図的に消せば毎回読み直してくれますが他に良いアイディアはありませんでしょうか?
>>801 つdo './abc.pl';
ってかrequireの戻り値はエラーが発生したかどうか調べるためのものだから、
そういう風に使うのは避けたほうがいいかと思うが
doで解決しました。ありがとうございました。 Data::Dumperで出力した値をよくこの手法でデシリアライズしたりしていたのですが requireだとファイルに文法エラーや存在しなかったりするとエラーになるので doの方がいいかもしれませんね。エラー出さない方が良いのかは微妙ですけど。 このような目的では本来はData::Serializerを使うべきなんでしょうけどお手軽なので やめれません-_-;
それは人として正しいです
普通 Storable じゃね?store/retrieve 使えば手軽だし。
>>790 出題「この処理を実現できるモジュールを、CPANからみつけなさい」 とか
何が変わったのかしら わくてか
子飼氏、この間バタバタだからEncoding関係の改善は期待できんか
>>805 時にはファイルを手で弄りたいときもあるのです。
セキュリティ・速度よりも何よりも手軽さを優先したい時はDumperが便利!
後で他のシリアライザに変更するのもそれほど手間じゃないし。
webprog板おもすれー( ^ω^)
>>812 まぢで。おまえどのスレがおもすれー( ^ω^)のかおしえてけろよん
814 :
デフォルトの名無しさん :2006/01/23(月) 02:13:33
#! c:/perl/bin/perl
#カウントファイルの読み込み
open(IN,"<./count.dat");
$count=<IN>;
close(IN);
++$count;
#カウントファイル書き込み
open(OUT,">./count.dat");
print OUT $count;
close(OUT);
#鯖出力
print<<END;
Content-type:text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>アクセスカウンタ</head></title>
<body>
あなたは$count番目の訪問者
</body></html>
END
文法チェックでは通るんだが
[Mon Jan 23 02:07:40 2006] [error] [client 127.0.0.1] malformed header from script. Bad header=<!DOCTYPE HTML PUBLIC "-//W3C/: 3-3.cgi, referer:
http://127.0.0.1/tendaysmyself/3-3/ ってエラーが出ます。
Content-type:text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 1行空ける
>>813 低レベルすぎておもすれー( ^ω^)なのです
( ^ω^)あなたもわたしもVIPPER!(^ω^ )
818 :
デフォルトの名無しさん :2006/01/23(月) 06:53:07
>>815 ありがつございます。
ず〜っとコレで詰まってました。
助かりました。
>>818 こういうのはPerlに関する問題じゃないから、次からはCGIの質問はWebProg板行ってくれよ。
>>1 > CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
> WEBプログラミング板に行って聞いたほうが得ですよ。
820 :
デフォルトの名無しさん :2006/01/23(月) 09:11:17
perl で ビットの扱いに関する質問です。 ------- my $val = 10; my @result = &hoge( $val ); sub hoge{ my $val = shift; # 2進数に変換し、1がたっている箇所だけ10進数にして返す。 # (例) 10 => (1010) = 2^3 + 2^1 = 8 + 2 # return で (8,2) を Array で返したいです。 } ------- Perlだとこういう場合どういう風にするもんなんでしょうか?
>>820 自分が以前に作ったのはこんなん
65536 より小さい数しか扱わないことがわかってたから
for 文での開始数を 16 にしてるけど増やせばまだ大丈夫と思う
sub hoge {
my $val = shift;
my @ret = ();
for (my $i = 16; $i >= 0; $i--) {
my $power = 2 ** $i;
if ( int ($val / $power) != 0) {
$val %= $power;
push (@ret, $power);
}
}
return @ret;
}
もっといい方法あったら教えてください
>>820 何に使うのか知らないけどそれ遠回りしてる気がするなあ
sub hoge {
my $val = shift;
my @ret = ();
my $flag = 1;
do{
$val & 1 and push @ret, $flag;
$flag <<= 1;
}while( $val >>= 1 );
return reverse @ret;
}
>>822 pushしてreverseならunshiftでいいんじゃないのだろうか。
824 :
デフォルトの名無しさん :2006/01/23(月) 10:39:21
825 :
デフォルトの名無しさん :2006/01/23(月) 10:49:02
sub hoge($){ my $val = shift; my @retval; while ($val != 0){ my $ntz = $val&(-$val); unshift @retval, $ntz; $val -= $ntz; } return @retval; }
826 :
デフォルトの名無しさん :2006/01/23(月) 11:22:22
sub hoge { my $val = shift; my $n = 2**32; map { $n/=2; $_ ? $n : (); } split(//,unpack("B32",pack("N",$val))); }
どうもこうも無いよ氏ね
入力ストリームの一行読み込み処理で、一行の区切りを \n でなく、 %0A 区切りにして一行ずつ読込みたいのですが、 調べたら「$/」に区切り文字入れろって書いてありました。 ただ、これだと入力ストリーム全部が%0A区切り読み込みになってしまうので困ります。 ストリーム個別に読込区切り文字を指定する方法がないでしょうか? $/='%0A'; #←ストリームを指定したいができない print $_=<DATA>; # aiueo%0D%0Aを出力 __END__ aiueo%0D%0Akakikukeko%0D%0Asasi(ryaku
その個別のストリームとやらを使用する前に$/に毎回入れてやればいいんじゃ
見せてもらおうか、ストリーム前の$/の使い方とやらを!
は?
>>829 必要なところで local を使って代入するか、
IO::Handle->input_record_separator() を使うか。
perldoc perlvar に書いてあるサンプルを読めば、普通は思い付くと思うんだが…。
坊やだからさ
無駄に煽るのもこのスレの特徴、と
お前だけだバーカ
なんかこのスレレベル低下してる気がする 変な奴はwebprog行けよw
さぁ殺伐としたふいんきになって参りました
840 :
デフォルトの名無しさん :2006/01/23(月) 17:22:24
殺伐としたこのスレに珍走団が!! ___ /孕/二 パラリラパラリラ 。 / ̄ − 。 − 。 。 。 − __ o孕o三 @孕@三 o孕孕孕o三 /孕/ 。 − 。 − / ̄ ̄ o孕o三 o孕o三 _/ ̄ ̄\_//=3 ___ 。 − ━┷-○ー○ー┘三 /孕/二 o孕o三 。 − 。 / ̄ − 。 − @u@三 。 − o孕o三 o孕o三 ワーワー @孕@三
いやつまんないから・・・
新宿にPerlだかpearlっていうバーがあったけどオフやるときはここでやろうぜっ! あとプロピアもバーの近くにあるからラリーも呼んで。
843 :
831 :2006/01/23(月) 18:50:18
そろそろWebprog版へ帰ります。探さないで下さい
WebProg931実装キボンヌ
俺様だけ賢いと思い込んでいる厨がいらっしゃるようでつね。
846 :
829 :2006/01/24(火) 01:50:42
>>833 キタコレ!調べてみる!サンクスおにいさん!
>perldoc perlvar に書いてあるサンプルを読めば、普通は思い付くと思うんだが…。
坊やだからさ。サンクスおにいさん!
って、あんだよ!input_record_separatorのソース見たらまんま
>>830 じゃねーか
スレッドとかmod_perlとかに弱そうだったからグローバル変数での切替はイヤだったんだよ!うんこ!みたいな。
sub input_record_separator {
my $old = new SelectSaver qualify($_[0], caller);
my $prev = $/;
$/ = $_[1] if @_ > 1;
$prev;
}
このソース見る限り、ストリームごとに個別に設定は無理そうですね。
ありがとうございます。
847 :
829 :2006/01/24(火) 01:53:11
そしてWebprog版へ帰ります。行ったこと無いけど。
>>842 そんな名前のバーは世界中にありそうな気がする。
そんな名前の楽器会社もありそうな気がする
こんなスレ見てないで仕事しろ
>>850 まさに今仕事中に見ている俺に、そんな注意をするおまいは俺の上司か!?
それとも俺のディスプレイ見つめてる後ろの席の奴か!?こわいわ!
sysopen 使って Argument "O_RDONLY" isn't numeric in sysopen at HOGE.pl in line 31. というエラーが出てくるのですが O_RDONLY ってあってますよね。。。 どなたかこうなる理由に心当たりあるかたお願いします。 # HOGE.pl line 31 sysopen IN, $file, O_RDONLY, 0400 or die "Can't open '$file' : $!";
853 :
852 :2006/01/24(火) 18:13:24
『質問すると自己解決できる』の法則。。。 すみません;;
>>852 法則?
普段からよく調べもせずに質問するからそうなる。
>>853 > 『質問すると自己解決できる』の法則。。。
> すみません;;
質問しようとすると問題点を頭の中で整理するため、
答が見えることがあるわけです。
ほんとこいつらは難癖付けないと気が済まないんだなw 他人事だと思ってもイライラしてくるわw 周りから嫌われてそう
たぶん、先輩とかにやられた過去があるんだよ。多くの人に。 最初はみんな不快だったはずだ。 が、この業界はこんなもの、と慣れてしまった。 そして同じ事を平気でするようになる。
任意の10進数を16 bitの二進数データに変換したい場合について質問させてください。 下のように記述しても、何故か8bit分の文字列しか帰ってきません。 お手数ですが御教授頂けないでしょうか。 $data = 72; $out_data=unpack("B16",pack("C*",$data)); $out_dataに、"0000000001001000"が戻ってくることを 期待しますが、"01001000"が戻ってきます。
>>860 pack() の型指定子に 'C' 使ってるから
$out_data = unpack("B16", pack("s*", $data));
以下、perlfunc から引用
s A signed short value.
S An unsigned short value.
(This 'short' is _exactly_ 16 bits, which may differ from
what a local C compiler calls 'short'. If you want
native-length shorts, use the '!' suffix.)
>>863 様
御教授ありがとうございます。
重ねて質問をよろしいでしょうか。
教えて頂いた方法で、例えば
"$out_data = unpack("B16", pack("s*", 511)); "
10進"511"は、2進"111111111"(1x9個)ですので、
出力が
で、実行してみますと、
"1111111100000001"が出力されます。そこで、教えて頂いた事と
エンディアンを考慮してpack()の型数に"n"を使用してみました。
"$out_data = unpack("B16", pack("n*", 511)); "
すると出力は"0000000111111111"となり、所望の結果となりました。
ですが、今度は24bit"000000000000000111111111"で出力させようと思い、
"$out_data = unpack("B16", pack("N*", 511)); "
で実行すると、"000000000000000000000001"と出力されてしまいます。
これを,"000000000000000111111111"と出力させるには如何したらよろしいでしょうか。
御多忙の折に申し訳ありませんが、御教授頂けましたら幸いです。よろしくお願いいたします。
>>860 = 863 です。以下、訂正です。
>> 862 様
御教授ありがとうございます。
重ねて質問をよろしいでしょうか。
教えて頂いた方法で、例えば
"$out_data = unpack("B16", pack("s*", 511)); "
10進"511"は、2進"111111111"(1x9個)ですので、
出力がは"0000000111111111"を期待します。
で、実行してみますと、
"1111111100000001"が出力されます。そこで、教えて頂いた事と
エンディアンを考慮してpack()の型数に"n"を使用してみました。
"$out_data = unpack("B16", pack("n*", 511)); "
すると出力は"0000000111111111"となり、所望の結果となりました。
ですが、今度は24bit"000000000000000111111111"で出力させようと思い、
"$out_data = unpack("B16", pack("N*", 511)); "
で実行すると、"000000000000000000000001"と出力されてしまいます。
これを,"000000000000000111111111"と出力させるには如何したらよろしいでしょうか。
御多忙の折に申し訳ありませんが、御教授頂けましたら幸いです。よろしくお願いいたします。
865 :
デフォルトの名無しさん :2006/01/25(水) 02:32:30
substr(unpack('B*', pack('N', 511)), 8) 但しNが32ビットである場合のみ有効。 N は big-endian で unsigned long ということは保障されていても unsigned long が 32 ビットであることは保障されていない。
$data = 72; $bit = 24; #表示させたいビット数 foreach(1..$bit){ if($data & 1 << $bit - $_){ print "1"; } else{ print "0"; } } これじゃだめか?
867 :
デフォルトの名無しさん :2006/01/25(水) 09:12:07
Perlで書かれたHTTPDってどこかにありますか? inetdから起動される簡単なものでいいんですが・・・
>>865 いつからかはわからないですが今は32bitであることが保証されています。
5.8.7のperlfunc(1)のpackの項から抜き出したものですが、最後のカッコ内
に注目。
n An unsigned short in "network" (big-endian) order.
N An unsigned long in "network" (big-endian) order.
v An unsigned short in "VAX" (little-endian) order.
V An unsigned long in "VAX" (little-endian) order.
(These 'shorts' and 'longs' are _exactly_ 16 bits and
_exactly_ 32 bits, respectively.)
>>867 > Perlで書かれたHTTPDってどこかにありますか?
HTTP::Daemon とか。
> inetdから起動される簡単なものでいいんですが・・・
こっちはしらね。
>>868 あ、本当だ。32ビットは保証されていたのか。
やっぱ互換性を保ちたいということかな。
(そういや昔は Perl バージョンアップしたら
動かなくなるスクリプトあったな…)
>>869 ローカルのドキュメントを表示するだけのものが欲しかったんですが、
これだけでOKでした・・・
#!/usr/local/bin/perl
$METHOD=<STDIN>;
$PATH=$1 if $METHOD=~/GET (.+) HTTP/;
if(! -f $PATH){exit}
undef $/;
open FH,"$PATH";
$document=<FH>;
close FH;
print STDOUT $document;
これと/etc/inetd.confに下の一行を追加して、
http stream tcp nowait root /home/junya/bin/httpd.pl httpd.pl
ブラウザからこんな感じで
http://localhost:80/usr/share/doc/... つか、これならシェルで十分すね・・・
>>871 それ、
"GET /etc/passwd HTTP/1.1"
とか送り付けられたらヤバくね?
>>872 /etc/hosts.allow,/etc/hosts.denyで規制してるし、どうせローカルでしか使わないし。
でもあんまり良くないかな。
>>860 >任意の10進数を16 bitの二進数データに変換したい場合について質問させてください。
sprintfを使え。
つーか、これまでそう言った人がいないのは、どうしたわけだろうか?
>>874 「○進数を×進数に…」の質問は散々既出なので、sprintf の %b を
知ってる間は質問を読みもしない。
876 :
デフォルトの名無しさん :2006/01/25(水) 12:54:56
すみません教えてください setenv CLASSPATH… が羅列されたcshファイルを シェルのsourceのように perlの中から読み込んで、環境変数CLASSPATHに設定すること は出来ますか?
>>876 $ENV{CLASSPATH} = `csh -c 'source $csh_file >/dev/null ; echo -n \$CLASSPATH'`;
出来ました! ありがとう! 先ほどsage忘れました、ごめんなさい
880 :
デフォルトの名無しさん :2006/01/25(水) 20:49:29
Perl初心者です UNIXコマンドでのwc -lのようにファイルの中の行数を 出力するにはPerlでどうすればできますか?
>Perl初心者です あっそ、だから何
>>880 print `wc -l foo.txt`;
人間としての器の差だなw
>>880 ファイルを開いて
open my $fh, 'file' or die "Can't open file: $!";
後は数える。
my $c = 0;
$c++ while <$fh>;
富豪的解法
my $c = scalar @{[ <$fh> ]};
閉じるのをお忘れなく
close $fh;
おまけのワンライナー
perl -ne 'END { print $. }' < file
>>881 「初心者」を振りかざして免罪符にしようとするのであれば確かにそれは間違っているが、
あまり詳しくないことを初めに言っておくことは質問方法として重要なことだと思うが?
まあこの場合は質問内容からそれが解るし、自らはどのようにやってみた等が欠けてはいるけど。
この回答でも「Perl初心者です」という一言があるからこそ、
ファイルの開き方を軽く説明しているつもりだし。
( ´д)ヒソ(´д`)ヒソ(д` )
もうこのスレwebprogと併合しろよ
5.9.3はいつでるの?
889 :
860 :2006/01/25(水) 23:08:21
865,866,874様 御教授ありがとうございました。 sprintfに "b"があるとは知りませんでした。 866様の例も勉強になりました。 大変ありがとうございました。
>>884 に同意。
何かこのスレ潰そうってかperlを貶めようってかしてる椰子が
1個流れてるな。
891 :
860 :2006/01/25(水) 23:14:07
・・・。 >>」881 氏ねや ゴミはよ!
ぎゃっはっは 初心者を煽るのを含めて楽しもうぜ
VIPでやれ
vip以外でvipでやれっていうの始めてみた
まんこぉー
何なんだこの荒れようは…
WebProgのPerl貶しスレ辺りから変なのが沸いてきたんじゃないかな。 長い間いい感じで進行してたのに残念ですな。
なんでもかんでもWebProg板のせいにする奴が出てきてから荒れてきた
その前に難癖厨が・・
一部残っていた卵がふ化したんだろう
902 :
デフォルトの名無しさん :2006/01/26(木) 17:06:37
hashを書いたファイルを作成して、requireで読み込んでそのまま使おうとしています。 --------------------- ・ファイルの中身 %s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a)); --------------------- ・ソース if (ろぐいんok) { require ふぁいる; %mainhash = %s; } --------------------- 普通に使えていたのですが、use strictを入れたらフォーカスがあいまい?だと怒られた為、 --------------------- ・ソース if (ろぐいんok) { my %s; require ふぁいる; %mainhash = %s; } --------------------- のようにしたのですが、これですとエラーは出なくなるのですが、 my %sとrequire内の%sが別扱いになってしまうのか、hashが空で読み込まれるようになってしまいました。 requireを使う前提で、なにか解決策などありますでしょうか。 ファイルのデータ構造を変えて普通にファイルとして読み込んでからハッシュに格納するようにすればいいんでしょうが、 こういう使い方ができないのかどうか激しく疑問です。。 以上、ご教授よろしくお願いします。
>>902 our %s=〜 で明示的にグローバルにするか、
ハッシュの中身を返すサブルーチンに替える。
>>902 %mainhash = require ふぁいる;
っていけないのかな?
試してないけど。
>>902 この場合は require を使う方が面倒が起きるんだけどな。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq8.html#what_s_the_difference_between_require_and_use ---------------------
・ファイルの中身
{'id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a)};
---------------------
・ソース
if (ろぐいんok) {
my %mainhash = %{ do ふぁいる };
}
---------------------
>>903 ありがとうございます。
ourは気持ちわるいっすね。。
サブルーチンに変えるというのはこういう解釈で問題ないでしょうか。
---------------------
・ファイルの中身
sub fileread() {%s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a));}
---------------------
>>904 それは試したんですが、無理でしたです。
すみません、説明不足でした。
>>906 訂正
---------------------
・ファイルの中身
sub fileread() {my %s; %s=('id',q(1),'name',q(40),'logouttime',q(2006-01-26 15:38:36),'m',q(1),'rowsize',q(10),'s',q(7f02f000320007d0106a)); return %s;}
>>905 ありがとうございます、できました!
動いてた頃よりもソースが美しいっす!
>>903-905 ありがとうございました。
our より、 > hashを書いたファイルを作成して、requireで読み込んでそのまま使おうとしています。 の方がキモいけどなぁ。
Visual Perlってもう手に入らないんですか? インストーラ自体はFTPにあったのですが、インストールしても ライセンスがないというダイアログが出てはじかれてしまうんですよ。 オフィシャルの b) provide unlimited licenses for the current 2003/2002 plug-ins; ってのはKomodoのライセンス持ってる人にだけってことでしょうか?
Perlなんてエディタで書けよ・・・
TMTOWTDI
すいません、質問です。 ある2つの配列のハッシュ(%A, %B)で、各 key に対する値が、A, B ともに あったら、それを A から削除したいのですが、よい方法ありますでしょうか。 今、思いつくのはこんな感じです・・・ foreach $key ( keys %A ) { foreach $i ( 0 .. $#{ $A{$key} } ) { if ($A{$key}[$i] = $B{$key}[$i]) { ここで削除処理 ? } } }
delete $A{$_} for keys %B; とか?
914 :
912 :2006/01/26(木) 21:24:40
>>913 ありがとうございます。
でも、それだと、key ごと消えちゃったりしますよね。
key に対する重複する値だけ消したいっす。
deleteのかわりにundefにしたら?
916 :
913 :2006/01/26(木) 23:36:23
>>914 あ、すまんす。値が配列になってるのね。ちょっとうまい方法が思いつかないなあ。
>>912 そういう時は一旦ハッシュに入れてみるのが常套手段
my %A = ( hoge => [1, 2, 3, 5], fuga => [50] );
my %B = ( hoge => [2, 3, 4], piyo => [] );
foreach my $key (keys %B) {
next if !exists $A{$key};
my %e = ();
$e{$_} = 1 foreach @{$B{$key}};
my @newA = ();
$e{$_} or push @newA, $_ foreach @{$A{$key}};
$A{$key} = \@newA;
}
>>912 通りすがりの初心者です。間違っていたら指摘よろです。
foreach my $key(keys %B){
$A{$key} = [undef] if($A{$key} != undef);
}
919 :
918 :2006/01/27(金) 01:09:03
連書きすいません。 $A{$key}=[undef] じゃなくて $A{$key}=[] でした。
>>918 仕様が要件を満たしているかどうかは置いておくとして、
$A{$key} != undefの所はdefined $A{$key};と書かないと。
-wやuse warningsを使うと、そういうことを結構教えてくれるから使ってみることをお勧めする。
while (my $key = each(%A)) { if (exists($B{$key}) { delete($A{$key}); } }
>>921 each の途中で、delete ってしていいの?
(・∀・)イイ!!わけない
924 :
912 :2006/01/27(金) 07:09:21
>>912 です。
みなさん、ご助言ありがとうございます。
昼間に試してみて、夜にでも結果報告をします。
感謝感謝です。
>>922 一般にはダメだが、eachが最も最近に返した要素のdeleteだけは
安全。perlfunc(1)のeachのとこに書いてある。
If you add or delete elements of a hash while you're
iterating over it, you may get entries skipped or duplicated,
so don't. Exception: It is always safe to delete the item most
recently returned by "each()", which means that the following
code will work:
while (($key, $value) = each %hash) {
print $key, "\n";
delete $hash{$key}; # This is safe
}
今 $ perl hoge.pl -i input_file または $ perl hoge.pl < input_file のように使うスクリプトがあって 引数に -i があるときはファイルを開いて 無いときはSTDINからデータを読んでるのですが $ perl hoge.pl とどちらも忘れたときにSTDINで止まってしまって 強制終了以外で止められません $ perl hoge.pl[enter] I can't find input file! $ のようにする方法をずっと考えているのですが 結局思いつきません。。。 どなたかいい方法をお願いします。
>>926 よく使われる手は -t STDIN で標準入力がttyかどうか調べる、だな。
リダイレクトで明示的にttyを標準入力につないだときに誤判定するが
それはアキラメで。
>926 STDINが、コンソールか、ファイルかなんて、 C言語でも、かなりOSに依存したコード書かないといけないと思うからperlだと難しいんじゃないかな。 一応、seek(STDIN,0,0) してみたら、 コンソールの場合は、0が返ってきて、 ファイルの場合は、1が返ってきたので、 これで判断できると思うけどOSに依存するかもしれん。
929 :
928 :2006/01/27(金) 11:26:16
930 :
928 :2006/01/27(金) 11:34:10
package が存在する(定義されている)か判定する方法がないでしょうか? print "defined PackageName" if defined(PackageName); ↑でできるかなと思ったのですが、 defined("PackageName")としていることが まったく同じような気がするので常に1が返ってきて無駄でした。
>>926 馬鹿だなオマエ。そういう時は「引数に何も付けなかった時は
標準入力から入力する。」という仕様にしてしまえばいいじゃ
ないか。実際その方が便利だぞ。
932 :
926 :2006/01/27(金) 11:51:25
>>927 -t STDIN
を利用して
$ perl hoge.pl -i input_file
$ perl hoge.pl < input_file
$ cat input_file | perl hoge.pl
で期待通りに動作しました!ありがとうございます!
それと
『リダイレクトで明示的にttyを標準入力につないだとき』
なのですが、というのが分かりません。。。
どういうことでしょうか。。。?
933 :
926 :2006/01/27(金) 11:53:42
>>931 あ、本来の仕様は
perl [-i input_file] [-o out_putfile]
なんでそれは無理です。
質問のために省略しました。
ただ、その方法も確かに簡単でいいですね!
とりあえずここで・・・ (*Windows版) 紫色を透明色にしたいんだが何か間違ってる? use Image::Magick; $image = Image::Magick->new; $image->Read('test.bmp'); $image->Set(transparent=>'Purple'); $image->Set(colorspace=>'Transparent'); $image->Set(matte=>'True'); $image->Write("test.png");
>>932 $ perl hoge.pl < /dev/tty
>>934 1. ○○がしたい
2. 自分はこうやった
3. 結果は××になってほしいが△△になってしまった
3 が抜けてて返答のしようがない。
ppmでHTML-FormatTextが見つからないのですが、 CPANで拾うとppdが入っていません。かなりググりましたが他に 見つかりませんでした。 自動でインストールできるものはどこで入手できますでしょうか? あと、みなさん普段どこからモジュールを手に入れてますか? オススメのリポジトリとかあれば教えてください。
ppm とか ppd って何? cpan -i HTML::FormatText で普通に入るけど。
Active Perl5.86で既になかった 古い5.81ので拾った記憶が 既に入らなかった。あきらめたけど ppmでオフラインで入らないのは古いから対応してないよ警告なんだと思う。 namazuでもそうだったし 野良で使えるとは思うけど もしかしたらアーカイブ鯖からppmで入れられるのかね? 5.81アーカイブに繋いで入れられるのかな? 不明
940 :
937 :2006/01/27(金) 20:23:47
ありがとうございます。CPANでインストールできました。 こんなのがあったんですね・・・(ppmの立場は!?) いままでppmを使っていたので、モジュールのインストールによく躓いていました。 perlのモジュールって,統一感がある様で結構バラバラな感じですね。 Image::Magickもppmでは入りません。DLLのインストーラでオプション指定 しないといけない現状です。 ウエブにあふれてる解説が古いままなのが、躓く原因だと思います。
お前は何を言っているんだ?(画像ry
>>940 > ppmの立場は!?
ActivePerlで確実に使えるパッケージである。
コンパイル済みなので、コンパイラを持っていないユーザーでも使える。
小飼弾て朝生に出てるんだな。今知ったよ。
な、なんだってー またでんのかよ
さて、情報処理申し込みにオフィシャル行ってくっか
@list=glob("*.c"); $val=$list[$#list] これを一文でやる方法はありますか? あるリストの最後の要素を取得する方法が知りたいです。
サンプルなどで foreach my $key( @list) { print "$key", "\n"; } という書き方がよく行われていますが my $key; foreach $key( @list) { print "$key", "\n"; } とすべきではないのでしょうか?
ヒント: foreach my $key( @list) { print "$key", "\n"; } print "$key", "\n"; my $key; foreach $key( @list) { print "$key", "\n"; } print "$key", "\n";
>>946 $val=[glob("*.c")]->[-1];
とか?
>>946 便乗しての質問なのですが、なぜ
@list=glob("*.c");
$val = pop(@list);
は出来るのに
@list = pop(glob("*.c"));
はType of arg 1 to pop must be array (not null operation) というコンパイル
エラーになってしまうのでしょうか?
>>946 こうじゃね?
$val=(@list = <*.c>)[-1];
もっとも、俺なら後から見てワケワカメになるので、こうするけどな。
my @list = <*.c>;
my $val = $list[-1];
あと、deprecated というわけじゃないようだが、glob() じゃなくて
File::Glob か <> 演算子を使っとけ。
>>950 pop() は引数を与えた場合、与えられた配列を変更するので、変更できない
(lvalue じゃない) サブルーチンの返り値やリテラルを渡すとエラーになる。
[-1]が使えたんですね。アリガトウございます.
unlink (sort glob "*.c")[-1]; ところでこのソートって必要だと思いますか? >as the standard Unix shell /bin/csh would do. /bin/cshはファイル名でソートしてくれる仕様なのかな、どうなんだろ。
unlink +(sort glob "*.c")[-1]; こうだった。
>951 >あと、deprecated というわけじゃないようだが、glob() じゃなくて >File::Glob か <> 演算子を使っとけ。 なんで?
>>956 File::Glob の方が細かく制御できるから…と思ったけど、
:globally なら glob() にも <> にも影響あるんだな。
これはスマンカッタ。
>>953-954 unlink() かよ。
すみません Windowsで言う『切り取り→貼り付け』、UNIXで言う『mvコマンド』みたいな事をしたいんですが モジュールとかありますか?
>>958 モジュールって…
rename() でええがな。
>>958 あえてモジュールを使いたいならFile::Copyにmvがある。rename直でいいと思うが。
ところでこのスレでPerl6の質問ってしてもOK?
まだ質問があるわけじゃないんだけどさ
ポインタって?
>>963 ありがとうございました!
>>962 すみません、どう表現したらいいのかもよくわかってなくてニュアンスで書きました。
>>960 ここいってくらさい。
次世代Webプログラミング言語の大本命Perl6/Parrot [WebProg]
Jcode.pmの [@match = ] $j->m($pattern, $opt); を使って、以下1行のSJIS文 あいうえお/かきくけこ/さしすせそ を/でsplitするにはどうしたらいい?
>>959 >>960 renameは同一ファイルシステム内でしか移動できないので、
ファイルシステムまたぐ可能性があるならFile::Copyのmvを
使うべし
my @list; my $rec = { title => '11', genre => '77', }; push(@list, \$rec); &test(\@list); sub test(\@) { my ($lst) = @_; foreach my $aaa (@$lst) { # ここでデリファレンスする方法をおしえてください。 print $aaa->{title}; } } よろしくお願いします。
print %$aaa->{title};
ハッシュのリファレンスのリファレンスをpushしてしまってるから push(@list,\$rec) を push(@list,$rec) にするとかは?
971 :
960 :2006/01/29(日) 01:36:31
>>965 りょーかいです
>>967 ファイルシステムを超えて移動したことなかったので知らなかったorz
やっぱり一般的な関数もちゃんとドキュメントは読まないと駄目ね・・・
>>968 >>969 書き間違えてますぞい。
print $$aaa->{title};
それだとNot a HASH reference といわれてしまうのですが・・・
973 :
968 :2006/01/29(日) 01:45:57
ありがとうございます。print $$aaa->{title}; で表示できました。 my @list; my $rec = { title => '11', genre => '77', }; push(@list, \$rec); これ「ハッシュのリファレンスのリファレンス」になってしまうのでしょうか?
974 :
968 :2006/01/29(日) 01:51:43
理解できました。ありがとうございました。
975 :
969 :2006/01/29(日) 02:17:19
おいちょっと待て、 print $$aaa->{title}; これだと Not a SCALAR reference になるんだが
976 :
969 :2006/01/29(日) 02:18:31
俺の勘違いだったすまん
リファレンスのリファレンスって何か嬉しいことあるの?
>>967 Winの場合は、rename で内蔵HDDから外付けUSB HDDに移動できたけどな。
え?
>>978 それはファイルシステムとは言わないような気がするんだけど気のせい?
>>981 アホみたいに煽るだけじゃなくて実のあること書いてよw
FATとかNTFSのことじゃないの?
うちでもやってみた。(内蔵IDE HDD→外付けUSB HDDへの rename) Linux Perl の場合:無効なクロスデバイスリンク と出て失敗。 Win98SE(ActivePerl)の場合:正常に移動できた。 デュアルブートのマシンなので、ハードウェアは全く同じ環境。 誰か理由を説明できる人、よろしく。
内部で使ってる関数が違うだけの話じゃないの?
windowsは知らんけど、linuxとかのmvもデバイスをまたぐ時は 内部でcpとrmを実行してなかった?
Linux-2.4,Glibc-2.3.5で試したけど、 mvで違うファイルシステムにファイルを移動しようとしたら、 renameでエラーを検出した後に、read/writeでファイルをコピーしてる。
>>985 その通り。
まず rename を試み、失敗したら自分で移動処理してる。
ActivePerlのrenameは、そういうコードが入ってるってことかな?
rename(2)とMoveFileExの挙動違いじゃないのかな。 Windowsの関数の方が親切だよね。
MoveFileExじゃない、ただのMoveFileか。 MoveFileExならフラグの制御でUNIXと同じ動作にも 出来たんだろうけど、あえてMoveFileを使う辺りが適当というか。 ユーザーにとっては便利だけど。
>>989 Win9xでも動くようにするためじゃない?
>>990 MoveFileExってNT系にしかないのか…
朝っぱらから小飼弾の喋りはつらいですね
誤爆した
もう次スレの時期か…また立ててくる
ふふっ、くすぐったいですか? それは、すみません。 でも、ゆっくり味わいたいと思います (身をよじるはやてに微笑をむけながら) ふふ、可愛らしいですね……、大人になったらするんですから…… はやてちゃんの場合でしたら、したいって相手がいっぱい居ると思いますよ? ですから、あまり恥ずかしがらないでくださいね。 (そう話しかけながら、胸の蕾を指で転がしている) ん、ふ……ちゅ、ぺろぺろ…… (乳房の輪郭を、手で探りながら、胸の蕾を舌先で転がす) ふふ、どうですか……? んちゅ……、ちゅ…… (はやての身体に跨り、首筋に顔を伸ばして唇を這わせる)
んふ………っ (ペニスが下腹部に当たると、身体を浮かして) もう、したいんですか……?ふふ、まだ早いですよ。 (はやてちゃんの胸を揉みながら、微笑む) んふっ……ぺろっ…… (胸から鎖骨へとゆっくり舌を這わせながら、身体を浮かす) それでは、私のを、はやてちゃんの唾液で濡らしていただけますか? (そう言うと、69の体勢になるため、お尻をはやてへ向け 身体をペニスの方へと寝かせていく) ……………… (ペニスを掴んで扱きながら、はやてからの愛撫を待っている)
ひぃぅん……あっ……ん…… (ペニスを扱かれて、腰が動く) シャマル………うち…頑張る…… ちゅ……ん…… (ペニスへの刺激に耐えながら、懸命にシャマルのアソコをチロチロ舐める)
ふふ、腰が動いてますよ、気持ち良いですか…? ぁん……、はい、頑張ってくださいね…… ちゅ……ん…、ちゅっ…… (嬉しそうに腰を振りながら、 ペニスの先端を舌先でくすぐる) ふぁ……ぁ、ん……… (秘部をはやての唾液を、自分の愛液で濡らしながら、腰を揺らす) ちゅ、ぺろ……ふ、ぁ…… (咥内にペニスを含み、ペニス全体に舌を絡め唾液で濡らす) ふふ、これは、どうでしょうか…… (上半身を軽く浮かし、はやてのペニスを豊満な胸で挟む) (そして、挟んだまま胸でペニス扱く)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。