1 :
デフォルトの名無しさん :
2005/12/12(月) 03:55:48 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/12/12現在の最新版: 5.8.7
● 2005/12/12現在の開発版: 5.9.2
リンク集は
>>2-3 過去スレは
>>4-5
舞-乙
まあ確かにURLだけ貼るだけで放置なら無意味だよな テンプレにあるサイトくらい回るのが当然だし 質問者はそれでも分からないっていってるんだろうから …蒸し返してごめん。一乙
無意味ではないし。 回答したいやつが勝手に回答すればいいだけのこと。 質問者が分からないならお前が回答してやれ。
はいはい、しつこいよ。
まあ質問スレでの無意味な書き込みは荒らし同然だからなあ。 埋まった質問は掘りだされることないし。
これから回答者が注意すれば良いだけじゃない 何ムキになってるんですか?
⊂二二二( ^ω^)二⊃
>>12 まあまあ落ち着いて。
にしても……こういう時に限って質問無いんだよな。
use Hoge qw/abc def/; use Hoge qw(abc def); use Hoge qw{abc def}; どれが一番クールですか
>>15 qw// はリストコンストラクタだから、通常の ( ... ) と合わせて
qw( ... ) と書くのが一番「自然」。他の演算子やマニュアルの
凡例との整合を取るなら qw/ ... / 。B::Deparse の出力では
qw[ ... ] をよく見る。それ以外の文字を使う理由は寡聞にして
知らないし、好みの問題で優劣は無い。
Perl6の資金がないとかいって収集した金を誰が浪費したの? もしかして僕らのヒーロー、ラリーヲールたん?
どこの話?
ここでする質問する内容なのかわからない上にわかりにくい説明で恐縮なのですが if ($in{'command'} eq "start") { $first = 5; } elsif ($in{'command'} eq "next") { $first ++; } startボタンを押したらnextボタンが表示されるようにしてあります。 nextボタンを押したら $first に1加えるようにしたいのですがうまくいきません。 どうすればうまく動くようになるのでしょうか?よろしくお願いします。
エスパーさーーーん
セッションを使え。
それだけはいやです。
>>19 よりわかりやすく説明できるように整理しよう。
・やってみたこと
・出た結果
・期待した結果
をそれぞれその場にいない人にも伝わるように日本語に直してみよう。
現場で現象を見ているあなた自身で「わかりにくい」と思う説明では誰にも理解できんです。
また整理しているうちに、それだけで解決してしまうケースも多々あるのよ。
if ($in{'command'} eq "start") { $first = 5; } elsif ($in{'command'} eq "next") { $first ++; } print "$first"; 最初startボタンを押したときに $first の値として 5 が表示されて、 次にnextボタンを押したら $first の値として 1 が表示されました。 startボタンを押したあとnextボタンを押したときに、 $firstに代入された5という数字に1を加えた6を表示させたいと思ってたのですがうまくいきませんでした。
エスパーさーーーん
ルーク、フォースを使え。
27 :
デフォルトの名無しさん :2005/12/12(月) 23:23:43
$firstにはstartボタンを押した時点で5が代入されてるので、 その次にnextボタンを押したら前に代入された5に1を加えた6が代入されるのではないかと思いまして。 そのように動作させるためにはどうすればよいのでしょうか?
>>27 何所から説明したものか…とりあえず…それCGIか?
CGIならWebProg板に移動してもらおうか。
CGIならCGIで根本的な動作原理すらわかってないようだし…
>>27 $firstもしくは"5"が伝わってない以上仕方ねえよ。webprog行ってくれ
普通に Perl/TK じゃないの?
>>30 Perl/Tkで$inとか出てくるかな
まあその可能性も無いわけじゃないから一応CGIかどうか訊いた訳だが
32 :
デフォルトの名無しさん :2005/12/12(月) 23:44:33
ホームページ上で動くものなのでCGIなのでしょうか? スレ違いでしたらすいませんでした。
HPから印刷のダイアログを出さずに直接ダイレクトで印刷したいのですが方法はありますか?
ユーがブラウザ作っちゃいなyo
マチルダさーーーん
37 :
デフォルトの名無しさん :2005/12/13(火) 07:47:38
やっぱムリですか 印刷のダイアログ自体のデザインを 変えたりなんかは出来るんでしょうか
38 :
デフォルトの名無しさん :2005/12/13(火) 08:19:12
Perlの質問(笑)
相手すんなよ。
40 :
Lavi :2005/12/13(火) 11:38:03
sendmailについて質問させてください。
現在、メールフォームを作っておりまして、
regist.cgiでファイルにログ書き出しと同時に
&send_mail();という具合でsendmailを呼んでいるのですが、
うまく指定したアドレスにメールが送信されません。
原因はわかりますでしょうか?以下ソースです
# sendmailのパス
$path_sm = '/usr/sbin/sendmail';
$MailTo = '
[email protected] ';
$MailFrom = 'hoge Official';
41 :
Lavi :2005/12/13(火) 11:38:33
つづき sub send_mail{ foreach $key (keys %FORM){ $MAIL_FORM{$key} = &jcode::jis($FORM{$key}); } @r = ("男性", "女性"); $MAIL_FORM{'sex'} = &jcode::jis($r[$MAIL_FORM{'sex'}]); open(MAIL, "|$path_sm -t"); my $tpl = new CGI::FastTemplate("./cgi-bin/template/"); $tpl->define(main => "mail.tm"); $tpl->assign(NUMBER => $count); $tpl->assign(DATE => $date); $tpl->assign(SEND_ADDRESS => $MailTo); $tpl->assign(NAME => $MAIL_FORM{name}); $tpl->assign(ADDRESS => $MAIL_FORM{address}); $tpl->assign(SEX => $MAIL_FORM{sex}); $tpl->assign(AGE => $MAIL_FORM{age}); $tpl->assign(TEL => $MAIL_FORM{tel}); $tpl->assign(EMAIL => $MAIL_FORM{email}); $tpl->assign(TEXT => $MAIL_FORM{text}); $tpl->parse(RESULT => main); print MAIL $tpl; close(MAIL); } おねがいしますm(__)m
CGI::FastTemplateオブジェクトのリファレンスを そのままsendmailのパイプにprintしてもどうにも ならんと思うが。 CGI::FastTemplateのマニュアルのfetchの説明 あたりをよく嫁。
43 :
Lavi :2005/12/13(火) 11:55:00
>>42 重大なヒントありがとうございます!
マニュアルよく読んでまた きます。
45 :
Lavi :2005/12/13(火) 14:07:14
46 :
Lavi :2005/12/13(火) 14:10:36
うーん。なんか勘違いしてますよね,俺; メールの書式にtemplate使いながら、 他のCGIでsendmailを呼び出して,送信すること自体 無理なんですかね orz
最近Perlを勉強しだした超初心者なのですが コマンドラインから引数nを一つとって n=3なら ◆ ◆◆ ◆◆◆ ◆◆ ◆ n=4なら ◆ ◆◆ ◆◆◆ ◆◆◆◆ ◆◆◆ ◆◆ ◆ nが文字列ならエラー表示して終了といったスクリプトを for文一回のみ、配列は無し、if文も無しで1行で組むということは可能でしょうか?
>>45 どこをどう読んできたんだお前は(;´Д`)
50 :
Lavi :2005/12/13(火) 14:36:47
sub send_mail{ ━━前略━━ $tpl->parse(RESULT => main); $mail_data = $tpl->fetch("RESULT"); #print MAIL $tpl; print MAIL $mail_data; close(MAIL); } 考えてみたのですが、もしかしてこういうことでしょうか;
51 :
Lavi :2005/12/13(火) 14:50:18
アルぇー うごかね orz
>>50 どうしてそこまでいって間違えるかね...
print MAIL $$mail_data;
だろ。
あとコマンドに食わせる奴がうまくいかないときは、
まずファイルに書いてみて期待した通りの出力に
なってるか確認する、とかしてみるのがセオリー。
53 :
Lavi :2005/12/13(火) 15:14:16
うあああ
動きました。ありがとう(ノД`)
みんな、ほんとにありがとうです。
>>52 はい、これからはそのセオリー遵守します。
>>47 perl -e 'die if (($n = shift) ne $n+0); print "◆" x ($n-abs($n-$_)),"\n" for (1..$n*2-1)' 3
スレ違いだったら許してくれ。 ActivePerl をインタプリタとして組み込みたいんだが PerlEz(限定インタフェイス) perl58.dll 参照 以外にお手軽に組み込める、COMインタフェイスとか存在しない? なければ自分で作ろうと思うのだけど、できれば perl58.dll が見つからなくても動くバイナリを作りたい。 PerlEz を使ってみたけど、機能的に限定されすぎてるし、 実行形式が perlez.dll を要求するようになっちゃう。
簡単にファイルロックできるモジュールってありませんか できれば標準モジュールで
ありますね
>>56 えーと、staticにリンクしたいってこと?
>>62 うんにゃ
手元では、perl.h のダイナミックリンクは成功してるけど
インポートライブラリを使いたくないのだ。
ActivePerlない環境でもそれなりに動いてほしいので。
環境は BCB
>>63 普通にLoadLiblary & GetProcAddressはだめなの?
>>64 それを(ある程度)勝手にやってくれる方策を探してたのだけど
あきらめて自分で作りまつ
ヘッダ&インポートライブラリから定義抜き出してラップすんのマンドクサッ
いいものができたらBCB&デルスレに貼るyp
67 :
デフォルトの名無しさん :2005/12/14(水) 17:52:27
要素の中身から添え字番号を調べる方法教えてください。 $hoge[0]='あああ',$hoge[1]='いいい',$hoge[2]='ううう',$hoge[4]='えええ'' があるとしたら、'ううう'という言葉から$hoge[2]の2という数字を知りたいのです。
>>67 そういう用途には逆マップのハッシュを使え。
もちろん要素は重複しないのだな?
%reverse_map{@hoge} = (0..$#@hoge);
69 :
デフォルトの名無しさん :2005/12/14(水) 17:59:04
>>68 ありがとうございます。
ディレクトリのファイル名を読み込んで、使いたかったんです。
>>70 ありがとうございます。
使い方よく見てみます。
for (0..10000) って1マンコの配列返してたんだ…知らんかった… for($i=0; …を書くのめんどいから使いまくってたよアヒャ
>>73 そうなんだぁ、最適化解釈されてて大丈夫なんだ。ありがとうございます。
この中にperlコードを携帯アドレスにしてる子はいねーがーー
最もPerlらしさを表すコードってどんなの
つ[ comp.lang.perl.poems ]
>>76
pinrt_@docomo.. で配列展開…
>>68 この展開ってできるんですか?! いろいろテストしても書式エラーになってしまう...
いままで逆マップはforで作ってたけどこれやりたい
微妙に間違ってね? my %reverse_hash = (); my @hoge = qw(a b c); @reverse_hash{@hoge} = (0 .. $#hoge);
>>81 打ち間違い。わりいわりい。
@hash{@a} = 0..$#a;
そろそろベンチマーク厨の出現
85 :
81 :2005/12/14(水) 20:04:41
>>79 その配列、確か先日5000万突破してんねんで。メチャメモリ喰ってんぜ
オラにTieしてあとはがんがれww
ActivePerlで階乗の計算をさせてたら、 171!で1.#INFという結果になってしまいました もっと大きい数を扱うにはどうすればいいですか?
解決しますた newだけでいいのか、楽だ
5.8以上の環境があるならbigintプラグマ使う手も use bigint; まあ、中身はMath::BigIntだけどね
最近なんか流行ってるフレームワークとかある?
質問させて下さい C言語のcharのように文字を操作したく、現在 @chars = split(//, $string); こんな事してるんですが、もっと効率のいい方法ってありますか よろしくお願いします
>>93 逆説的だがC言語のようには操作しないのが一番。
Perlならもっと高級な文字列操作ができるのでうまく使え。
95 :
デフォルトの名無しさん :2005/12/15(木) 10:32:06
と言っても1文字ずつじゃないと出来ないことだって多いだろ
>>93 1文字ずつに分解するのはそれが楽。
でもCっぽくってことならunpackとpackを使った方がいいと思う。
そうでなければsubstrとかでいちいち文字列の長さを使って操作することになる。
それにしてもわざわざC風に扱いたくなるPerlの文字列処理ってなんだろう?
そんなに無い。
98 :
93 :2005/12/15(木) 11:15:47
皆さん回答どうもありがとうございます 物凄い複雑な正規表現を使うより、 C風に扱った方が後々メンテする人が楽だと思いました。 すみませんでした。
>>98 ケースバイケースだけど、多くのロジックは正規表現を上手く使えば、
C 風の文字列処理よりずっとスッキリする。複雑だな、と感じるのは
正規表現に対する理解が足りないからじゃね?
メンテナンスする人間も正規表現(ひいては Perl)に対する理解が浅いと
いうことが今の時点で分かりきってるなら、開発言語を変えることを勧めるよ。
100 :
56 :2005/12/15(木) 12:09:18
>>64 遅レスだけど遅延ロードはOSの実装ではなく
ヘルパライブラリの実装であることに気付いた今日この頃。
いまターゲットにしているBorlandでも
遅延ロード&インタプリタ駆動はできました。
あとはライブラリが見つからなかった際のエラーハンドリング。
Perl5.6でも標準でEncodeモジュールって入ってたっけ
102 :
デフォルトの名無しさん :2005/12/15(木) 12:48:18
ActivePerlにはWindowsのDLL関数をロードできるモジュールがあるけど UNIXのPerlにはsharedLibraryの関数を直接ロードできるモジュールってあるの?
あるあるwwww ねーよwww
ものすごい複雑な正規表現をC風に扱ってメンテし易いとは思えないずら。 近頃は佐藤くんや鈴木さんでもエディタの検索窓で正規表現使えるんだから。
いるよね。変数に$を付けただけの C みたいなスクリプト書くヤツ。 C に無い関数はほとんど使わない。 正規表現やハッシュを一切使わない。 for とかも for $val ( @array ) { print $val } じゃなく for($i=0;$i<$max;$i++){ print $array[$i] } みたいに必ず添字付きだし。 自分には理解しづらくてメンテしにくい。 人それぞれだからかまわないんだろうけど... 自分の書いたスクリプトも、そいつにしてみたらすごく変に見えるんだろうなぁ。
>>108 > いるよね。変数に$を付けただけの C みたいなスクリプト書くヤツ。
Cに移植する可能性も考えて試験的実装をしてみるというケースもあるけどな。
>>108 C言語使える人の数 >>>> Perl 使える人の数
そもそも Perl わかりにくい。
なんで変数に$を付けないといけないんだ?
読みにくくてしかたない
ここはPerlスレなんだからそんな事言うのもどうかとw
Perlで関数を動的に呼び出すにはどうしたらいいですか? &call("&disp();"); sub call(){ my $func = shift; eval $func; } sub disp(){ print "Hello!!"; } ってなことをやりたいんですが、もう少しエレガントな方法はないものかと。。。
>>113 ふつうに eval( "disp()") しない理由は何?
$func_name = 'test'; &{$func_name};
116 :
113 :2005/12/16(金) 00:10:41
117 :
デフォルトの名無しさん :2005/12/16(金) 00:49:50
正規表現に適していない解析処理を無理矢理正規表現で 書かれるとコメントがついていても意図が汲み取れない ケースが出てくる 何でも正規表現で書こうとするのは病気
>>117 そもそも、そういうケースって Perl で処理するのに向いてるのか?
具体例を示さないと。
>>113 動的ってのが、文字列からプサブルーチン名を得ないと
イケナイノならeval なのだけど、
たいていのケースではサブルーチンのリファレンスで事足りるのでね?
しばらくperl手がけてて、久しぶりにCに戻ったら 変数に$付けたくて仕方なし
122 :
デフォルトの名無しさん :2005/12/16(金) 13:13:18
>>122 <a href="hoge.html"><img src="hoge.gif"></a>
というリンクを含んだコンテンツを食わせて$mech->links()で
WWW::Mechanize::Linkオブジェクトをとりだしてみたが、
imgタグを特定できるような情報がないので今のままじゃ
どうにもならないと思われる。かろうじてimgがふくまれていた
というのが[IMG]でわかる程度だな。
$VAR1 = [
bless( [
'hoge.html',
'[IMG]',
undef,
'a',
bless( do{\(my $o = '
http://example.jp/foo.html ')}, 'URI::http' ),
{
'href' => 'hoge.html'
}
], 'WWW::Mechanize::Link' )
];
ハッシュを使ったときにキーの部分検索をすることは出来ますか? $hoge{'aaa'} = 0; $hoge{'bbb'} = 1; $hoge{'cac'} = 2; $hoge{'ddd'} = 3; でキーに'a'を含むもの $hoge{'aaa'} = 0; $hoge{'cac'} = 2; を取り出すように。
keysでキーだけ取り出して、条件に合っていたらやりたいことをやる。
>>126 「効率的に」ってことであればデータ構造の持ち方を考えるしかない。
単純にってことだったら grep keys なんかでいいんでは?
@hoge{grep(/a/, keys %hoge)
モジュール使うときそこで使いたい機能(ユーティリティ的なモジュール群と思ってください…)があり、 そのモジュールにある他の関数などを使わない場合、 use Hoge qw( 使う関数 ); を使うとモジュールの読み込みは早くなりますか?
>>130 モジュールの実装にもよるが通常はExportしてるだけだからならない
逆に言えばなる物も有り得る
>>128 ちょっと見てみました。
なんかできそうです。今から試してみます。
ありがとうございます!
書き込みと評価システムがくっついたような、amazonの評価システムみたいなcgiはperlでできますか?
もちろん出来るが藻前にはできん スレ違いもしくは板違い
cgiスレで聞いてきます。
137 :
デフォルトの名無しさん :2005/12/17(土) 05:17:56
perlで積分させる方法を教えて下さい。 式は自分で書けます。
138 :
デフォルトの名無しさん :2005/12/17(土) 06:46:57
139 :
デフォルトの名無しさん :2005/12/17(土) 19:54:43
Matlabを使うしかないのでしょうか。そもそもモジュールの使い方も理解しているわけではないのでで、 他の方法があったらおながいします。
理解しろ
141 :
デフォルトの名無しさん :2005/12/17(土) 20:41:01
HTML::Parserでハンドラの中でフラグを立てて、他の ハンドラでそれを参照したりしたいのですが、 グローバル変数を使う以外の方法はないでしょうか?
質問というか、思いついたお題を一つ。 ある二つの正規表現がある。 ただし限定条件として、どちらも/^foo$/の形式を取る。 両方の正規表現にマッチする文字列を一つ見つけるか、 もしくは一つも存在しないことを示したい。さてどうする?
日本語でおk
145 :
デフォルトの名無しさん :2005/12/18(日) 01:17:53
>>143 とりあえず ?{ } や ??{} が登場したら解くのをあきらめて逃げる。
146 :
デフォルトの名無しさん :2005/12/18(日) 02:35:23
日付や時刻を扱うモジュールってないんですか?
147 :
デフォルトの名無しさん :2005/12/18(日) 03:22:34
>>146 標準モジュールもさがせないんですか?
低脳な質問はWebProg板でしてね。
ここはPerlのプロフェッショナル専用のスレだから
148 :
147 :2005/12/18(日) 03:23:27
誤爆スマソ
149 :
デフォルトの名無しさん :2005/12/18(日) 03:29:22
150 :
146 :2005/12/18(日) 04:58:48
いえ、聞いてみただけです。
151 :
デフォルトの名無しさん :2005/12/18(日) 13:46:10
>>149 時刻オブジェクトの保持と、strptime()やstrftime()を
効率良くやりたいんです。POSIX.pmはstrftime()しか
無いしリソースを食うので…
んー、Time::Pieceとか?
漏れの好みはTime::Formatだな。 ところで、%{パッケージ::}というハッシュにアクセスすると、 そのパッケージ内の変数・関数・子パッケージすべて列挙できるんだな。 さっき必要性があって調べたら、こんな方法とは目から鱗だった
155 :
デフォルトの名無しさん :2005/12/18(日) 19:19:20
#動かない。 &{ my $sub= sub{ print $_[0]; $sub->("再起\n"); }; }("初起\n"); #動く。 &{ my $sub; $sub= sub{ print $_[0]; $sub->("再起\n"); }; }("初起\n"); コンパイル時でのmyとsubの認識の順番が原因と思ったのですが、正解でしょうか? 代入演算子が右側から処理していくため、コンパイル時も右からの認識と言うことでしょうか?? もしそうだとしたら、コンパイルは静的にレキシカルであってほしい。 見た目とスコープが噛み合わないのはいかがなものだろう。 よって、この処理結果を改善してほしい。
>>155 順番じゃなくてスコープの問題。
myが左辺で使われた時、右辺はmyのスコープ外。
my $a = $a; で、左辺の$aと右辺の$aは別の変数。
my $sub = sub {...;$sub->...;}; でも同じ。
左辺の$subと右辺の$subは別の変数。
そっか、ありがと。 右辺に{}があるときは実行時にその定義を変更してほしいですな。 実行そのものは、リファレンス代入のほうが先にされるわけだし…。 これは順番が噛み合わなくなって変になる仕様だ。
>>157 その方が仕様として整合性が取れないじゃないか。逆に直感的じゃなくなるよ。
159 :
デフォルトの名無しさん :2005/12/19(月) 04:37:51
>>151 localtime とか time とか use Time::Local して timelocal 使うとか。
文字列に変えたり文字列から値を切り出したりするのは perl だから
自分で作っても大差ないような気がする。
Unix(Linux)でユーザの管理を行いたいんですが それに適したモジュールや解説ページなどはないでしょうか
PAM/LDAP でまずは組むってのはどう?
なぁ・・ $buf eq 'hoge' より $buf =~ /^hoge$/ の方が早いのはなんで・・?
>>162 たぶん、測定時の$bufが、パターンが成立可能な文字列長よりも短かったから。
164 :
デフォルトの名無しさん :2005/12/20(火) 00:13:29
htmlの特定タグを削除したいのですが <html>・改行・・改行・</html> 途中で改行があると、動作しません。改行をはさんだ削除はどうすればいいでしょうか? 改行あると動作しないソース #!C:/perl/bin/perl $file="a.txt"; $outfile="result.txt"; open (IN, $file) ; open (OUT, ">$outfile") ; while (<IN>) { s/<.*?>//g; print OUT $_; } close (IN); close (OUT);
>>164 メモリに余裕があるなら1行ずつじゃなくて一度に全部読み込めば簡単。
どうしても1行ずつ処理したければ状態をもって頑張れ。
HTMLを1行ずつ処理するのは間違ってる
つか、タグの削除やるんならそういうモジュールなかったっけ? 普通に正規表現でやると結構失敗するよ。
html::TagFilter かな
というか BEGIN〜ENDの間を削除したいだけなんですが。もう5時間ググったけどまだ分からん。 検索で出てくる例は while( 使ったものばかりで複数行だと使えないし・・・ 置換コマンドは分かるんです s/<image(.|\n)*>//ig <image..改行・・改行・・>を削除できる 実際に動くスクリプトが作れなくて。 BEGIN aaa sd ?? END BEGIN〜ENDを削除したい。
>>169 ・$/(入力レコードセパレータ)をundefとか、local $/してから読み込む
行で読んでから@htmlをjoinするのもいい
htmlまとめてスカラ変数に入ったらsオプションつけて置換実行
・どうしても1行ずつやりたい時はflagを1個使えばいい
while(<HANDLE>){
$flag and s!.*END!! ? $flag=0 : next;
s!BEGIN.*END!!g;
$flag = s!BEGIN.*!!;
print;
}
171 :
デフォルトの名無しさん :2005/12/20(火) 06:59:16
例えば 30C2 → (30*29)/(2*1) を mCn の形でmとnを入力して実行させたい場合、どのような式にすればいいのでしょうか。
>>170 ありがとうございました。キーワードいただいたらすぐにできました。
while (<IN>) { の前に undef $/; を一行足すとできました。
#!C:/perl/bin/perl
$file="a.txt";
$outfile="result.txt";
open (IN, $file) ;
open (OUT, ">$outfile") ;
undef $/;
while (<IN>) {
s/BEGIN(.|\n)*END/BEGIN\r\nEND/ig;
print OUT $_;
}
close (IN);
close (OUT);
#! /usr/local/bin/perl
require "jcode.pl";
require "cgi-lib.pl";
require "apply.pl";
の呼び方だと動くのですが、
cgi-binディレクトリの中に、これら3つのplファイルを入れて
require "./cgi-bin/jcode.pl";
require "./cgi-bin/cgi-lib.pl";
require "./cgi-bin/apply.pl";
のように、呼んだとたん、以下のようにエラーが出てしまいます。
Premature end of script headers: confirm.cgi, referer:
http://localhost/official/demae/menu.html Can't locate ./jcode.pl in @INC (@INC contains: C:/usr/local/lib C:/usr/local/site/lib .) at ./cgi-bin/cgi-lib.pl line 2.\r, referer:
http://localhost/official/demae/menu.html Compilation failed in require at C:/Program Files/Apache Group/Apache2/htdocs/official/demae/confirm.cgi line 5.\r, referer:
http://localhost/official/demae/menu.html File does not exist: C:/Program Files/Apache Group/Apache2/htdocs/favicon.ico
どうしたら、よいでしょう?
cgi-bin に入れたら動かんじゃなかったっけ?
>>173 エラーメッセージを読んで、どんなエラーか理解すればいいよ。
以下は、エラーメッセージが理解できない人向け。
require './cgi-bin/jcode.pl';
$INC{'./jcode.pl'}=$INC{'./cgi-bin/jcode.pl'};
require './cgi-bin/cgi-lib.pl';
念の為、こんなの普通は使わないからな。
テンプレートについて質問です。 perlのテンプレートの種類にTemplate Toolkitがありますが、 foreachなどもっと楽に記述できるテンプレートはないですか? template toolkitの場合 [% FOREACH temp=list %] [% temp %] : [% END %] これを [% foreach @a{ $a; } %] みたいな、perlそのままでかけるような感じのテンプレートはないでしょうか?
まちがえた…$a;でなく$_ですね
>>176 Template Toolkitなら
[% PERL %]
...
[% END %]
でいいんでねーの。オプションで使えるようにしとく必要はあるが。
> [% > foreach @a{ > $a; > } > %] テンプレート使ってる意味ないし。
181 :
デフォルトの名無しさん :2005/12/21(水) 00:38:00
>>164 全部繋げろや。HTMLはread()で塊全部読め。
それから s/\s+/ /g; だ。これやると <pre></pre> の中が失敗するが、気にするな。捨てろ。
182 :
デフォルトの名無しさん :2005/12/21(水) 05:49:16
あるライブラリがそのperlに含まれているかどうかを調べるにはどうしたらいいんでしょうか。
自力で探すとしても if( grep { -e "$_/Hoge.pm" } @INC ){ # モジュールがあった }
対象のサーバに接続して、サーバのSSL証明書の有効期限を 表示するスクリプトを作成しています。 Crypt::SSLeayはほぼLWPでのHTTPSアクセス専用みたいだったので、 Net::SSLeayを使えば出来そうだと考え、試しに、 use Net::SSLeay; ($reply, $err, $server_cert) = Net::SSLeay::sslcat('ほげほげ.jp', 443, '/'); print Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($server_cert)) . "\n"; などとしたところ、証明書のサブジェクトが表示されました。 同様に有効期限も取得できると思い、 print Net::SSLeay::X509_get_notBefore($server_cert) . "\n"; print Net::SSLeay::X509_get_notAfter($server_cert) . "\n"; などとしましたが、なんだか良く分からない数字が出てきます。 (アクセスするごとに違う(増えたり減ったりする)ので、これは時刻ではなさそうです。) opensslのソースを見てみましたが、私はCが分からないため、 意味不明です。 具体的にどのようにすれば有効期限を取得できますか?
>>185 戻り値がASN1_UTCTIMEとかいう形式なので、
Net::SSLeay::P_ASN1_UTCTIME_put2stringを通せばいい
Net::SSLeay付属のQuickRefというファイルに書いてあるよ。
いまいち不親切なドキュメントだが。
$asn1_utctime = Net::SSLeay::X509_get_notBefore($x509);
$asn1_utctime = Net::SSLeay::X509_get_notAfter($x509);
$x509_name = Net::SSLeay::X509_get_subject_name($x509);
$x509_name = Net::SSLeay::X509_get_issuer_name($x509);
Return information from a certificate.
$string = Net::SSLeay::P_ASN1_UTCTIME_put2string($asn1_utctime);
Convert a asn1_utctime structure to a printable string.
モジュールでEXPORTに設定されてない関数を my $hoge = HOGE::not_export_function( $tmp ); のように呼び出すことができるのですが、これはアリなんですか? EXPORTとlib hoge qw( ... )は使用関数を明示したりするためだけにあるのでしょうか? 速度的にかわったりしますか?
エクスポートって単なる namespace の問題でね?
189 :
デフォルトの名無しさん :2005/12/21(水) 21:11:11
質問です。 $a=['任意のstring'] のとき $a->[0] として print させたいのですが、 この場合はいいとして、$a=[{}] のとき、$a->[0] として表示させると、 HASH(0x??????)というアドレスが入ってしまいます。 表示させる前に、$a が ['任意のstring'] か [{}] かチェックしたいのですが、 うまいチェックの仕方がないでしょうか? お願いします。
>>189 ref $a->[0] で判定できるお
できました。ありがとうございます。 ただ、$a=['string'] の場合は、ref の戻り値がありませんね。
>>191 'string'はリファレンスじゃないから
193 :
デフォルトの名無しさん :2005/12/21(水) 22:36:43
ある処理の開始時にダイアログボックスを表示させ、処理が終わった時にダイアログボックスを消したいのですがどのようにすれば良いでしょうか? ダイアログを表示した時点でメインの処理が止まってしまうので困っています。 ダイアログはPerl/Tkで表示しています。
マルチスッドレ!
前スレにも似たような内容あったな。 threadは無理だったはず。
>>193 最初に $dialog->update; で表示して、最後に $dialog->destroy; で破棄。
処理の最中は定期的にDoOneEvent(0); の呼び出し。
197 :
デフォルトの名無しさん :2005/12/22(木) 16:43:04
こんにちは、トムです。 ファイルのタイムスタンプを取得したいのデスが、 どうするのが一番簡単でしょうか。 年月日時分秒 までほしいところデス。
はじめまして、トム。 わたしはエミリー・ブラウンです。 Perlスレへようこそ。
モジュール内におけるBEGINの処理について質問です use Exporter; use vars qw( @ISA @EXPORT ); @ISA = qw( Exporter ); @EXPORT = qw( sub1 sub2 ); と use Exporter; use vars qw( @ISA @EXPORT ); BEGIN { @ISA = qw( Exporter ); @EXPORT = qw( sub1 sub2 ); } の違いが分かりません。 あえてBEGINにするのには何か意味があるのですか?
よほど最初に実行させたいとか
>>199 トムです。
おかげでタイムスタンプが見事にゲットできたデス。
ありがとう。お礼に姉さんを紹介するよ。
Hi! スーザンよ。 弟がお世話になったわね。 ところで私も質問があるの。 UNIX時間を適当にフォーマットしたいけれど どうするのが一番簡単かしら。 "date +'%Y/%m/%d %H:%M:%S' --date '" . localtime($sec) ."'" とかをopenで実行してたみたいだけど、ダサいのよね
#!/usr/bin/perl use strict; my $mode = $ARGV[0] || $ENV{QUERY_STRING}; print "Content-type:text/plain\n\n" if exists $ENV{QUERY_STRING}; print $::{$mode} ? $::{$mode}() : "undefined\n"; sub aaa { "im aaa\n";} このスクリプトをsetuid+CGI経由で実行すると Can't coerce GLOB to string in cond_expr at hoge.cgi line 5. と怒られてしまうのですが何かグッドアイディアはありませんでしょうか。
>>203 use POSIXしてstrftimeを使うのがまあ楽といえば楽かな。
>>204 "Taintモード" でgoogle検索ってのはどうだ?
204みたいな場合だと、
my $mode;
my $m = $ARGV[0] || $ENV{QUERY_STRING};
for my $s qw(aaa) {
$mode = $s if $m eq $s;
}
print $::{$mode} ? $::{$mode}() : "undefined\n";
sub aaa { "im aaa\n";}
あたりでの汚染除去が無難という気がする。
>>206 検証過程で
($mode) = $mode =~ /(.*)/;
としても改善しなかったのですが再度検証したら
別の部分で間違ってたらしく自分の勘違いでした。
ありがとうございます。
>>203 $time_string = sprintf('%6$4d/%5$02d/%4$02d %3$02d:%2$02d:%1$02d', (@temp=(localtime $sec)[0..5], $temp[5]+=1900, $temp[4]++));
>>208 どう見ても POSIX::strftime() を使うべきです。
本当にありがとうございました。
210 :
デフォルトの名無しさん :2005/12/24(土) 07:26:19
慌てて
>>203 とマジレスしたのですが、どうみても既出です。
本当にありがとうございました
C言語でのファイル操作ができるようになったので、次はperlを覚えたいのですが 入門にはオライリーの『はじめてのPerl』が良いのでしょうか? それとも駱駝の本の方が後々手元に置いておくには良い本なのでしょうか
書棚に並べておくには駱駝本のほうが格好いいね。
PerlはWeb上の情報だけで十分かと
わーい明日はクリスマスだぁ
215 :
デフォルトの名無しさん :2005/12/24(土) 16:36:19
>>211 どうするのが一番良いのかは、君の才能の程度によって変わってくる。
217 :
デフォルトの名無しさん :2005/12/24(土) 20:50:36
あー全部お前を食べるためだよ
219 :
211 :2005/12/25(日) 03:13:25
cpan.jp最近広告ふえて鬱陶しいです。 クリックしてもらえるとおもってるんですかね?
思ってるから付けるんでしょうね
やー別にいいじゃん。 つか、復活してるの知らなかったヨ。
223 :
デフォルトの名無しさん :2005/12/26(月) 02:23:17
メール送信CGIを作っているんです
Perlチェック(Kent WEBで配布されているもの)ではえらーなしなんですが、なぜか設置すると500エラーになってしまいます。
何が原因か分かりますでしょうか?
ちなみに設置場所はland.to
#!/usr/bin/perl
use strict;
use CGI;
require"./jcode.pl";
my $mailPath='/usr/sbin/sendmail';
my $fromAddress='
[email protected] ';
#引数を取り込む
my $cgi = CGI::new();
my $address = $cgi->param('address');
my $subject = $cgi->param('subject');
my $body = $cgi->param('body');
#エンコード
my $enc_sub = &Base64Encode($subject);
&jcode'convert(*body,'jis');
if($address !~/^.+@.+$/){ &error('Input Error','addressを入れてください。');}
if($enc_sub =~/^\s*$/){ &error('Input Error','SUBJECTを入れてください');}
if($body =~/^\s*$/){ &error('Input Error','BODYを入れてください');}
>>223 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
226 :
デフォルトの名無しさん :2005/12/26(月) 02:29:15
#続き if(open(SENDMAIL,"| $mailPath")){ print SENDMAIL<<"EOM"; From:$fromAddress To:$address Subject:$enc_sub MIME-Version:1.0 Content-Type:text/plain; charset="ISO-2022-JP" $body EOM close(SENDMAIL); } else { &error('System Error','システムエラー'); } print<<"EOM"; Content-type:text/html <html><head> <title>Submarine mail</title> <META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=Shift-JIS"> </head> <body> 送信完了 </body></html> EOM
227 :
デフォルトの名無しさん :2005/12/26(月) 02:30:53
#続き2です sub Base64Encode { my ($target) = @_; my ($base) = "ABCDEFGHIJKLMNOPQRSTUVWXWZ" ."abcdefghijklmnopqrstuvwxyz" ."0123456789+/"; my $eStr =""; &jcode'convent(*target,'JIS'); my $pStr = unpack("B*",$target); for (my $i = 0; my $cStr = substr($pStr,$i,6); $i+= 6) { $eStr .=substr($base,ord(pack("B*","00" .$cStr)),1); if (length($cStr) ==2) { $eStr.="==";} elsif (length($cStr) ==4) { $eStr.="=";} } return("=?iso-2022-jp?B?$eStr?="); } sub error { my ($mes,$com) =@_; print<<"EOM"; Content-type: text/html <html><head><title>$mes</titie> <META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=Shift-JIS"> </head><body>$com</body></html> EOM exit; } exit; 1;
ウザイ
プログラミングの前に、人としての礼儀と気配りを学びましょう。
230 :
デフォルトの名無しさん :2005/12/26(月) 02:55:49
すみませんでした。。。
別スレで誘致されたので
>>1 を見もせず、書き込んでました
迷惑かけて申し訳ありませんでした
フォーム解析の為だけにクソ重いCGI.pm使ってる人ってまだ居るんだ・・
クソ重い Perl 使っててよく言うよ
つ mod_perl
perlの入門書を探してるんですが Windowsでperlを学ぶなら 初めてのPerl Win32システムと 初めてのPerl 第3版 お薦めなのはどちらでしょうか?
ネット検索で十二分
両方買え。全部読め。 以上。
237 :
デフォルトの名無しさん :2005/12/26(月) 12:58:36
http://i-111.hp.infoseek.co.jp/sakuramochi/ すみません。ユニックスかわからないんですが、ここのカウンターが変になってしまい、困っています。
多分、最後の画像結合処理が上手くいってないと思うんですが、
print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる
exit; #処理終了
ここの、、、初心者なので全然わからないんですが、誰か教えてたも。
238 :
デフォルトの名無しさん :2005/12/26(月) 12:59:17
間違えました。Perlです。
>>239 誘導乙.
でも、237はアニメGIFの各Disposal Methodが2(表示前の状態を復元する)に
なっているのが原因だから、CGI設置だと解決しない気もする。
Perl上で誤魔化すなら s///g 一撃なんだが、「初心者なので全然わかんない」
という相手に誤魔化しを教えるのも気がひける。
〇チだろ
242 :
237 :2005/12/26(月) 19:51:49
>>240 どこが悪いのかわかっているなら教えていただけませんか?
それとも、初心者に説明するのは難しいですか?
初心者ってのは免罪符になるのか?
ユカイな釣りか?
245 :
237 :2005/12/26(月) 20:57:10
#!/usr/local/bin/perl $file = "./data.txt"; #変数file=./datta.txtの中身 $gif_file = "./image/"; #GIFファイルまでのアドレス(GIFファイルの入ったフォルダ) #ファイル読み込み open (FP,"$file"); #$file=data.txtを開く $data = <FP>; #変数$dataに<FP>を格納 close(FP); #ファイルを閉じる #カウント $data = $data + 1; #$dataに1プラスする処理 #ファイル書き込み open (FP,">$file"); #変数$fileに$data=<FP>を格納 print FP $data; #$dataの表示 close(FP); #FPを閉じる
246 :
237 :2005/12/26(月) 20:57:41
(@dat) = split(//,$data); #$dataファイルの中身を一文字ずつ分割する処理 for($i=0 ; $i <= $#dat ; $i = $i + 1 ) { $dat[$i] = "$gif_file$dat[$i].gif"; } #ループ($iに0を代入;$iが$#datに入った3桁以下だったらループする;#iに1プラスする)$datを$dat{$i}.gifに置き換える #HTML表示 #print "Content-type: text/html\n\n"; #おまじない print "Content-type: image/gif\n\n"; #おまじない require "./gifcat.pl"; #gifcat.pl読み込み binmode(OUT);#おまじない print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる exit; #処理終了 こうなっているのですが、どこが悪いのでしょうか?
頭
248 :
デフォルトの名無しさん :2005/12/26(月) 21:12:10
use strict; と use warnings; がないところ
KヨNT臭もする悪寒♪
Windows2000(IIS5)上で、Perl-CGIを動かそうと 思ったのですが一台もありません。 Windows2003(IIS6)に思い切ってCGIを設置し ブラウザーで動作確認したのですが HTTPヘッダーが出力された瞬間に上司に見つかりました。 慌ててソースを修正したと言い訳したのですが どう見ても精子です。 本当にありがとうございました。 IIS6に移行したら、クッキーの設定内容がブラウザー 表示されているのを見て・・・・・オワタ OTL
×Windows2000(IIS5) ○Windows2000(IIS6) ×Windows2000(IIS6) ○Windows2000(IIS7) もうだめぽ
正直、何を言いたいのか全然わかりません
Windoz-XP のIISでCGI動かしたら、content-type: text/html とか IEで表示されちゃうってことじゃね。 Javaにしろ、Javaに
本当にありがとうございました。
255 :
237 :2005/12/27(火) 05:13:23
>>247-248 #!/usr/local/bin/perl
use strict;
use warnings;
$file = "./data.txt"; #変数file=./datta.txtの中身
$gif_file = "./image/"; #GIFファイルまでのアドレス(GIFファイルの入ったフォルダ)
#ファイル読み込み
open (FP,"$file"); #$file=data.txtを開く
$data = <FP>; #変数$dataに<FP>を格納
close(FP); #ファイルを閉じる
#カウント
$data = $data + 1; #$dataに1プラスする処理
#ファイル書き込み
open (FP,">$file"); #変数$fileに$data=<FP>を格納
print FP $data; #$dataの表示
close(FP); #FPを閉じる
256 :
237 :2005/12/27(火) 05:14:29
(@dat) = split(//,$data); #$dataファイルの中身を一文字ずつ分割する処理 for($i=0 ; $i <= $#dat ; $i = $i + 1 ) { $dat[$i] = "$gif_file$dat[$i].gif"; } #ループ($iに0を代入;$iが$#datに入った3桁以下だったらループする;#iに1プラスする)$datを$dat{$i}.gifに置き換える #HTML表示 #print "Content-type: text/html\n\n"; #おまじない print "Content-type: image/gif\n\n"; #おまじない require "./gifcat.pl"; #gifcat.pl読み込み binmode(OUT);#おまじない print &gifcat::gifcat(@dat);#関数を実行して、カウンターの画像をひとつの画像にまとめる exit; #処理終了 これでいいのでしょうか?
最近は文頭に自分のURL書くのがはやってるの??? strictつけたら、そのソースじゃうごかないしとりあえずエラーログ見ようね。 あとおまじない多すぎ。binmode(OUT)ってOUTなんか使って無いじゃん。 あと、きになるのは、ファイル読み込み〜ファイル書き込みの間に 複数人のアクセスあったらどうなっちゃうんだろう。
どう見てもCGIです。 本当にありがとうございました。
見るに耐えないので書き直してみるテスト use strict; use warnings; use IO::File; use File::Spec; my $datafile = './data.txt'; my $gif_dir = './image/'; my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|; flock $fh, 2; my $count = <$fh>; truncate $fh, 0; seek $fh, 0, 0; print $fh ++$count; undef $fh; my @dat = map { File::Spec->catfile($gif_dir, "$_.gif") } split(//, $count); # 以下CGIのため略 いや、問題の解決にはなってないけどね
>>1 > CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
日本語も読めないアホは帰れよ。あぁ、冬休みですか、そうですか。
>>259 > my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|;
$! マジオススメ。perlvar(1) 参照。
261 :
259 :2005/12/27(火) 08:51:41
>>260 確かに詳細が含まれているであろうシステムエラーのメッセージを使うべきですね。
今後は$!を使って吐く事にします。指導thx
open関数ではなくIO::Fileモジュールを使うのはなぜですか?速くなったりしますか?
263 :
デフォルトの名無しさん :2005/12/28(水) 03:41:08
オブジェクト嗜好
至高ですな。
シコシコー
シコルスキー
>>267 >>259 みたいに書くなら use Symbol; して gensym() 使うか
>(最近はopen($fh,'filename')でも解決できるが)
で充分だと思うんだ。わざわざ IO::File を使う理由としては
説得力に乏しいな。
どうでもいいけど my $fh = new IO::File $datafile, 'r+' or die q|Can't open datafile.|; よりも、 my $fh = IO::File->new($datafile, 'r+') or die "Can't open datafile: $!\n"; のが好み。
open my $fh, 〜 で十分
俺は open(FH 派
どっちでもいいけどグロブ方式だけはやめた方がいい 何もいいこと無い
274 :
デフォルトの名無しさん :2005/12/29(木) 13:17:01
小数点第2位まで表示するにはどうしたらいいんですか?
276 :
デフォルトの名無しさん :2005/12/29(木) 20:18:55
小数点3位を四捨五入して2位まで表示する方法も教えてください
( ´д)ヒソ(´д`)ヒソ(д` )
俺の出番だなヽ(´ー`)ノ
>>276 %..2fがそうなんだって
printf "%.3f -> %.2f\n",$_,$_ for( 0.004, 0.005, -0.004, -0.005);
0.004 -> 0.00
0.005 -> 0.01
-0.004 -> -0.00
-0.005 -> -0.01
282 :
デフォルトの名無しさん :2005/12/30(金) 16:04:01
round は perl にはねえか。 こうか? $n = int($n * 100 + 0.5) / 100;
int($n+.5)じゃダメなの?
負のときどうするの
int($n<0?$n-.5:$n+.5)とか?
>278 のリンク先に、「int()関数は単純に小数値を取り除き、整数部を戻すので」とありました。 perldoc -f int には「You should not use this function for rounding:」とあります。 四捨五入するため 0.5 を足す場合は int を使っても問題ないのでしょうか? 問題があるとしたら、 int(6.725/0.025)の結果が 268 になるといったような具体例を教えていただけないでしょうか?
は? 小数計算して最後にintで切り捨てれば何も問題ないと思うが。 というかやってみれば一発でわかることジャン。
>268 278 が例に出しているように print (6.725/0.025) → 269 print int(6.725/0.025) →268 になるのはやってみれば一発でわかる。 切り捨てにintを使うのはやめておいたほうが無難。
291 :
290 :2005/12/31(土) 00:26:17
スマソ 番号がめちゃくちゃだ。290 の最初二行は >289 288が例に出しているように が正しい
むー。perlfaq4 にあったや。
Q. Does Perl have a round() function? What about ceil() and floor()? Trig functions?
> Rounding in financial applications can have serious implications, and
> the rounding method used should be specified precisely. In these
> cases, it probably pays not to trust whichever system rounding is
> being used by Perl, but to instead implement the rounding function you
> need yourself.
(IEEE 754 的に)正しい結果が得られたかったら自前で実装するしかないようだ。
>>290 ということは、int($n + 0.5) ではなくて floor($n + .5) がいいんかね?
大人しく Math::Round::round() を使った方がいい気はする(笑)。
>>292 >(IEEE 754 的に)正しい結果が得られたかったら
コンピュータ言語はすべて小数演算は自前でごまかすものと思ってたけど、
そうでない言語もあるってこと?
294 :
293 :2005/12/31(土) 03:13:28
COBOLは昔から言語側が用意してたね。
>>293 意味がわからん。なんのためにCPUにFPUがあったり、OSでエミュレートしたり、
ライブラリ(libm)があると思ってんだ。
>>295 あんたの言ってることのほうがおれには意味不明。
>>293-294 もちろん、自前の勝手な方法ではなく、(IEEE 754的に)厳密な方法で
行えるモノ(言語とは限らない)もあるよ。
汎用的な複数行置換ロジックが欲しいす。
>>170 にあるようなスカラーにまとめ読みは
10万行くらいのtextには手も足も出ないし、置換するtextのブロックごとの目印を
もとに読み込むやりかたはロジックの使いまわししずらそうでめんどいし。
複数行置換をサポートしたテキストエディタの正規表現置換みたいな使い方ができる
汎用的な複数行置換ロジックがほしいす。
s/<image.*>//igs; じゃだめなの?
だめっす。たとえばcal 119988ヶ月分の結果を以下のように整形したいとします。
置換前「\n[0-9]」置換後「」
自分がつかってるエディタの複数行置換だとこれそのまま置換に使うことができるですが
これと同じことをperlでやろうとすると$_がどの行読んでて、ある行にくるまでスカラーに
行をためこみつつ置換して、ある行にきたらprintしてスカラーを解放するみたいな
めんどくささがあってやなのです。
ちなみにおれ
>>169 じゃないっす。
>>300 Tie::File を使うといいかもね。
302 :
デフォルトの名無しさん :2005/12/31(土) 21:49:29
cgi初心者です。 もしスレ違いでしたら誘導お願いします。 perlでパスワード認証cgiを作っています。 認証された人のみサーバーに隠しもっているドコモの着メロ(MLD)が ダウンロードできるようにしたいのですが、 PCでうまくいっても、携帯だとうまくいきません。 どなたか、お知恵をお貸しくださいませ □cgiの内容 #!/usr/local/bin/perl open( IN, "<./test.mld" ); my @data = <IN>; close(IN); print "Content-type: application/octet-stream\n"; print "Content-disposition: filename=\"test.mld\"\n"; print "Content-length: @data\n\n"; print @data; □,htaccessファイルの内容 <Files ~ "\.(mld)$"> deny from all </Files>
うしヽ(´ー`)ノおれにまかせろ
>print "Content-length: @data\n\n"; @dataの要素数がプリントされる気がするが
305 :
302 :2005/12/31(土) 22:51:17
すいません 変に簡略化したソースのせてしまいました。 実際は open( IN, "<./test.mld" ); my @data = <IN>; my $data_len = (-s IN); close(IN); として、Content-lengthにdata_lenを使ってますます。
明けちゃった♪
ここはCGIスレじゃないので
明けましておめでとう 今年もよろしく
WebProg板で訊くとよさ気 …で良いんだっけ
ネット関係カテゴリのWebProg板へどうぞ
314 :
302 :2006/01/01(日) 13:03:09
みなさま、誘導感謝です スレ汚し大変しつれいしました ついでに あけおめ
さてはて新年最初の質問は何になることやら
型グロブとは何ですか? 同じ変数名のスカラー、配列、ハッシュとかをまとめるものじゃないですよね(><)
もうそれでいいよ
319 :
デフォルトの名無しさん :2006/01/02(月) 02:30:44
CGIの神にお聞きしたいです。 $|=1; これは何を意味するのでしょうか? (変数に代入?)
>>319 syntax的には $| = 1;。 |= ではない。
意味は man perlvar すれ
>>320 調べたら|(縦棒)は定義済み変数なんですね。どもです!
$| 0 以外に設定されると、その時点で選択されている出力チ
ャネルに write や print を行なうごとに、強制的にフラ
ッシュします。 デフォルトでは 0 となっています。
STDOUT は通常では、端末への出力時には行バッファリン
グ、それ以外ではブロックバッファリングであることに注
意してください。 これは、Perl のスクリプトを rsh 配
下で実行して、実行状況を確認したい場合のように、パイ
プに出力するときに特に便利でしょう。 (記憶法: パイ
プをホットな状態にしておくために使う。)
他人のプログラムを読んでるのですが 下の一行が何をしてるのかわかりません。 教えてください。 print join("\n", @{ $self->{captions}->{$i} });
$self->{captions}->{$i} には恐らく配列へのリファレンスが入ってるのだろう それを \n でjoinして出力してるだけ
324 :
322 :2006/01/02(月) 12:13:04
>323 わかりました。ありがとうございました。 助かりました。
325 :
デフォルトの名無しさん :2006/01/02(月) 16:31:09
ActivePerl(5.8.6)です。 メイン処理実行中にWin32::MsgBoxを使用して別スレッドでメッセージボックスを表示しています。 メイン処理がある程度すすんだところでメッセージボックスを消したいのですがどのようにすればいいでしょうか? スレッドはThreadモジュールを使用しています。
設計を見直す
327 :
デフォルトの名無しさん :2006/01/02(月) 17:21:52
設計見直しかなぁ。標準だとWin32のDLL直に叩く方法もわからないし。 追加でモジュール入れないでWM_DESTROYとか投げつける方法ないですかね? いや、それでうまくいくかはわからないですが。
328 :
デフォルトの名無しさん :2006/01/02(月) 18:43:58
@lines = <STDIN>; をDOSウィンドウで実行した場合に、入力の終わりを伝える方法が分かりません。 初めてのperlという本ではコントロールZと書かれていたのですが、その方法では 上手くいきませんでした。どなたかお教え下さい。 環境は Windows XP ActivePerl 5.8.7です。
>>328 Ctrl+Z 押すと ^Z って表示される
と思うけどその状態で Enter じゃムリ?
>>330 ありがとうございました・・・簡単な事だったのですね。
332 :
デフォルトの名無しさん :2006/01/02(月) 22:33:46
perl+SQL(or XML)でBLOGを作成しようとしているのですが、 それを成し遂げるためにはどのような本はどれを読むといいだろうか? この質問はwebプログラム逝き?
日本語でおk
>>332 WebProg板だな。書籍スレもWebProgにある。
ひょっとしたらBlog板に関連スレがあるかも。
>>332 > perl+SQL(or XML)でBLOGを作成しようとしているのですが、
> それを成し遂げるためにはどのような本はどれを読むといいだろうか?
なぜ本? なぜそんな遠回りを?
あえて困難に挑戦しようというのか?
cygwin + perlで使っていきたいと思うのですが、windowsでは普通active perl でやってくもんなんでしょうか? というのはcygwin perlはcpanモジュールのインスコにことごとく失敗するのです(Tkはmakeで失敗。 ほかもいろいろインスコしたけど、しょっちゅうmake testに失敗する)。 cygwin上のこまわりのきくスクリプトってな感じにつかいたいのでactive perlは つかいたくないっす。みなさんどんな環境でperl使ってますか?
普通にCygwin Perl使ってるよ。 失敗するっつっても特殊な環境だから動作確認されて ないモジュールが多いだけでしょ。バグレポートする しかないわな。それが嫌ならそもそもCygwin使うの やめたほうがいい。Perlに限らずそのままビルド できないもの多いから。
WinXP+ActivePerlだ 最初から色々入ってるから便利やわ
339 :
デフォルトの名無しさん :2006/01/03(火) 03:11:20
Perlプログラムを書くとき 環境依存を防ぐために一行目の#!/usr/bin/perl を省略したいのですが、可能でしょうか? 毎回パスが変わるたびに何百ものファイルを置き換えるのは非効率で面倒でして。 パス変更という環境依存は避けたい所存で御座います 「#!/usr/bin/perlを省略」ぐぐっても「Perl パスを省略」 でググッても即座に省略する方法が簡単に見つからないのですが これについて調べるにはどんなキーワードが適切でしょうかね?
>>339 漏れの場合は、その#なんたらの1行目はまったく書いてないヨ。
俺も書いてないな。 つーかパスが変わるってどういう状況だ?
#!./perl とでもしておいて 環境ごとに ln -s するとか
ln -s /usr/local/bin/perl /usr/bin/perl の方がましじゃね
普通 #!/usr/bin/env perl
>>344 envは必ず/usr/binにあるの?
>>336 他のログ読まずに書き込み
winならcoLinuxが激しくお勧め
詳しい事はぐぐるとよろし
何言ってんだこいつ
>>345 Cygwin, Linux, FreeBSD, Solaris で/usr/binにあった。
(バージョン・デストリ依存はあるかもしれんが。)
最近CygwinからcoLinuxに移行したけど凄く便利だと思うよ
>336 おめでとう。perl-Tk は cygwin 本家から配布されるようになりました。Cygwin/X 版だけどね。 っつーか、環境依存の激しそうなもん(Tk なんてその最たるものかと)をビルドするんだったら、 自前でパッチを当てるくらいの気合いがないと苦しいかと。 ちなみに Active Perl と Cygwin Perl の両方を使ってる。
352 :
デフォルトの名無しさん :2006/01/03(火) 11:26:39
#!/usr/bin/env perl と use lib と FindBin 以外になんか気をつけることある?
353 :
デフォルトの名無しさん :2006/01/03(火) 14:00:12
>>341 OSがLinuxからBSDにかわったとき、
同じLinuxでもディストリビューションが変わったとき、SolarisやCygwin
に変わったとき、などです。
#!/usr/bin/perl を #!/usr/local/bin/perl や #!/usr/sbin/perl
などに変えないとうごかないときがあります。
>>340 今Eclipseの E.P.I.C. Perl プラグイン + Cygwinを使っているのですが
書かなくてもPerl5.8.xでは動くのですか?
どのPerl入門サイトにもPerlのソースコードの戦闘には
必ず#!/usr/bin/perl 書けと書いてありまして。困惑しております。
354 :
デフォルトの名無しさん :2006/01/03(火) 14:02:26
>>350 coLinuxは便利そうですね。しかしエミュレータのように
重たそうなところやある程度のハンデを背負いそうなところが恐いですね。
何か副作用はありましたか?
スレ違い
>>353 #!を書けば、perl hoge.plじゃなくて、hoge.plだけで実行できるようになるだけのこと。
Windowsのコマンドプロンプトならあってもなくても関係ない。
で
>>344 は見たか?
357 :
デフォルトの名無しさん :2006/01/03(火) 14:17:54
見てないですけど何か?
過去ログ読むのを強制するような奴は答えなくていいよw
スレ違いかもしれないけどcoLinuxきになるなー。 Windows上のファイルとかクリップボードとかプロセスとか その他もろもろCygwinとおんなじ程度には扱えるんかな。 扱えるんなら導入してみてー。
はいはい
正月からあまり俺を笑わさないでくれ
362 :
デフォルトの名無しさん :2006/01/03(火) 20:59:10
>>356 読みましたが、
#!/usr/bin/env perl は書いたほうがパフォーマンスに
プラスといった効果があるのでしょうか?
何で突然パフォーマンスの話が? コマンドラインから実行するときに、わざわざ頭に perl を付ける必要がなくなるだけのこと。
>>359 samba入れてwinのドライブにマウント
365 :
デフォルトの名無しさん :2006/01/04(水) 00:03:04
>>362 shebang について勉強してください
以下のプログラムを作ってみたのですが どうもうまく動きません。 testUndefined subroutine &Test::MyClass::new called at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 6. と表示されます。 コンストラクタとして使用するnew()メソッドはすでにTest::MyClass定義済みのはずなのですが。 //ファイル名Main.pm package Test::Main; print 'test'; $a = Test::MyClass::new(); #my $a = Test::MyClass->new(); $a->test(); //ファイル名MyClass.pm package Test::MyClass; sub new { print "Hello world!!\n"; my $pkg = shift; my $hash = { name => shift, weight => shift }; bless $hash, $pkg; } sub test(){ print "Hello TEST world!!\n"; }
367 :
366 :2006/01/04(水) 13:10:23
双方のファイルの場所は C:\Documents and Settings\ユーザ名\workspace\PerlTest3\Test に存在。 IDE : Eclipse 3.1 * epi Perlplugin cygwin Perl5.8 Eclipse内でのプロジェクト名 : PerlTest3 EclipseのプロジェクトではPerl IncludePathを C:\Documents and Settings\ユーザ名\workspace\PerlTest3 に設定済み。 です。
use MyClass;
369 :
デフォルトの名無しさん :2006/01/04(水) 17:26:03
>>368 Can't locate MyClass.pm in @INC (@INC contains:
/cygdrive/c/documents and settings/ユーザ名/workspace/perltest3
c:/usr/local/apps/eclipse/3.1/eclipse/plugins/org.epic.debug_0.2.0/
/usr/lib/perl5/5.8/cygwin
/usr/lib/perl5/5.8
/usr/lib/perl5/site_perl/5.8/cygwin
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/site_perl/5.8
/usr/lib/perl5/vendor_perl/5.8/cygwin
/usr/lib/perl5/vendor_perl/5.8
/usr/lib/perl5/vendor_perl/5.8)
at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 3.
BEGIN failed--compilation aborted
at C:/Documents and Settings/ユーザ名/workspace/PerlTest3/Test/Main.pm line 3.
そのくらいのエラーメッセージの意味もわからないようでは 先は暗いな...
371 :
デフォルトの名無しさん :2006/01/04(水) 17:30:36
>>370 つまりincludeパスに入っていないということですか?
いやMyClassは入っているはずですが
372 :
デフォルトの名無しさん :2006/01/04(水) 17:35:22
use MyClass;をuse Test::MyClass; に変えてみましたが エラーの変えたヶ所で赤線が現れています。 吹き出るエラーメッセージは Test/MyClass.pm did not return a true value at - line 3. BEGIN failed--compilation aborted - line 3. です。 メソッドでtrueを返さないと? ということはMyClass::new()メソッドで 戻り値としてreturn TRUE; と書けばよいと。 以下のように書き換えてみましたが全然ダメですよ。 sub new { print "Hello world!!\n"; my $pkg = shift; my $hash = { name => shift, weight => shift }; bless $hash, $pkg; return TRUE; } いったいこれは・・・・・・・
┐(´ー`)┌
375 :
デフォルトの名無しさん :2006/01/04(水) 18:06:07
376 :
デフォルトの名無しさん :2006/01/04(水) 18:08:12
>>374 そこで
use Module VERSION LIST
がでてくる意味がわからないのですが。
377 :
デフォルトの名無しさん :2006/01/04(水) 18:11:32
>>374 意味がわからないのですが、
とりあえずuse v5.6.1;
を追加してみましたがまったく事態はかわりませんでしたよ。
一体何がいいたいのでしょうか?
378 :
デフォルトの名無しさん :2006/01/04(水) 18:37:02
use v5.6.1; をuse v5.8; に変更しても事態は解決しませんね
想像のみでPerlの仕様を突き止めようとしている超越知性が跋扈するスレはここですか?
380 :
デフォルトの名無しさん :2006/01/04(水) 18:42:57
>>370 まて、お前はEclipseを使ったことがあるのか?
Perl厨って傲慢だね
382 :
デフォルトの名無しさん :2006/01/04(水) 18:47:47
ところでみんなは Perlでパッケージ宣言するとき パッケージ名にドメイン名ちゃんと割り当てているの? たとえば2chだったら net::2ch::www::test::package1::ClassName; みたいな
384 :
デフォルトの名無しさん :2006/01/04(水) 18:49:10
Perlでデザインパターンってどうやって実装するん?
>>383 1;を書いてuseの問題は突破しました。
とりあえず一旦、どうもありがとう御座いました。
386 :
デフォルトの名無しさん :2006/01/04(水) 19:29:07
冗談を言ってるの?
Perlの基本的な事を知らないのにイクリプスとか使うなよ… 他の大抵の言語でも、最初はエディタ+コンソールでやるだろ…
Perlでイクリプス使ってる奴はどのくらいいるんだろうか...
390 :
デフォルトの名無しさん :2006/01/04(水) 22:04:44
>>388 いや、今までにEclipseでC,C++,PHP,Java開発をやっておりまして。
その影響でEclipseを使ってPerlの世界でオブジェクト指向、デザインパターンを
実践することに挑戦しているのです。
Perlでどれほどオブジェクト指向を実践できるかがわかったら
次はRubyの出番です。
PHPでオブジェクト指向を実践しようとしましたが名前空間が使えず
>>386 のようなやり方しかできずに非常にがっかりしました。
しかしPerlならそんな心配もせずパッケージが使えるので期待できそうですね。
しかし気になるのはメソッド引数の型を指定できるかどうかですね。
PHP5からは多少は指定できるのですがPerlではどうもそうでもなさそうですかね。
それにPerlも双方ともC++やJava, C#, Dのように戻り値の型を指定できない
のでしょうか。PHPではそれができずに姑息な手段を使わなければならずがっかりしました。
Perlが、ちゃんとDesign By Contractに乗っ取った開発手法をどこまで実現できるか
もっと知りたいと思ったためにPerlに手を出してみました。
391 :
デフォルトの名無しさん :2006/01/04(水) 22:09:07
>>388 Perlにはtelnetプラグインやsshプラグインがあります。
とはいってもクライアントサイドでやってみたいというのがありまして
cygwinを使ってやっています。
私もはじめはPerl以外の言語を使うとき、エディタ+SDKという組み合わせでやっていました。
最近ではEclipse + Apache Ant + Apache Maven + 各種Eclipseプラグインという
組み合わせで開発を行っております。
perlをよりC++やJavaのような言語と同じような言語として扱えるようになるために、
Perl6が出て欲しいですが、開発資金を私用につかったとかで揉めて
その期待もしばらくの間はかなり薄いままでしょうかね。
PHPをC++やJavaのように使いたかったのですが、あらゆる面でPHPには失望しました。
Perlならその失望感をぬぐってくれるでしょうか?
私は、Perlでオブジェクト指向をどこまで実践できるかもっと知りたいのです。
>>389 Eclipse+epicでしばらくやってみた。
ペンタM1.5GHz(Let'snoteY2)/768MBでさえ重くてやめた。
P4-2.6GHz/1.5GBでやっと実用ぎりぎりって感じかな。
で、俺は
Unixではvi、WindowsではEmEditor、MacではJeditでガリガリ書いてる。
秀丸やterapadはUnicodeの扱いが半端なので( ゚Д゚)マズー。
IDEまではいかないけど補完とか欲しければ
Emacs+Perlplus、Macならmi、Windowsではez-HTML。
oopやるならこっちのが若干便利。
>>390 >しかし気になるのはメソッド引数の型を指定できるかどうかですね。
>PHP5からは多少は指定できるのですがPerlではどうもそうでもなさそうですかね。
多少なら指定できるよ。「Perl プロトタイプ」でググること。
>それにPerlも双方ともC++やJava, C#, Dのように戻り値の型を指定できない
>のでしょうか。PHPではそれができずに姑息な手段を使わなければならずがっかりしました。
これは指定できない。Perl でもがっかりすることに決まったね。
>>390 戻り値の型は……
あ、wantarrayでscalarと(ARRAY|HASH)は切り替えられるよ。
あと、OO-Perlなメーリングリストがあったハズなので、入ってみると良いかも。
Perlを触っておいて型指定できなくてがっかりって すごいな。初めて触った言語がJava+Webアプリだったり するとVMとコンテナの中で世界が完結するからこんなに モノリシックな思考回路になるんだろうか… 変にPerlのプロトタイプなんて教えたらメソッド呼び 出しではプロトタイプが効かないぞ!って発狂しそうだなw lispとかSmalltalk触らせたら何て言うんだろう。
>>393 いや、「メソッド引数」の型は指定できません。
もっとも、必要はあまり感じないですが。
$foo->bar( array => \@array, hash => \%hash )
とかすればいいわけだし。
あるいは$foo->bar( \@array )と$foo->bar( \%hash )で挙動を変えたい場合は
refとか使えばいいわけで。
それがダサいってのはわかるけど。
>>390 引数の型指定はプロトタイプで可能。
ttp://www.rfs.jp/sb/perl/02/07.html あたり山椒。
戻り値指定は出来ないつうかやらないのがPerl流。
メソッド呼び出し元のコンテキストを解析して引数の型に応じて
「同一名称で引数の異なる複数のメソッド」でなく、「ひとつのメソッド」で
戻り値を変えるようなこともやるのでね。
というか恐らく貴方が言っているC/Java的なプリミティブな「型」はそもそも
Perlには存在しないんだな。多次元配列もないし。(厳密には「リスト」は
あるが「配列」さえない)
この根本部分が他の言語と大きく違うので、他の言語をマスターしてPerlに
入ってくる場合注意して勉強したほうが良い。
逆にPerl使いが多用する柔軟で手軽なハッシュ、リスト、リファレンス回しが
出来る言語はほかになかなか見当たらないな。まあバグの温床でもあるしな。
>>393-397 結論からいうと型指定はできそうだが
メソッドのオーバーロードができぬってか?
どこをどうしたらその結論になるのか 「PerlやPHPのOOPは後付けであり、オブジェクト指向言語ではない」 これだけ覚えておけば結構
型が好きな人はMLかHaskellでも使ってなさい。
401 :
デフォルトの名無しさん :2006/01/05(木) 00:52:31
>>399 なに、オーバーロードができると?
同じ名前のメソッドを同一クラス内で
複数定義できると?
まさか。
Perlのオブジェクト指向機能の有無についてひとつひとつ 語ること自体がナンセンスだわ。継承でさえ単なるハックなのに。 コンパイル時のおまけチェックを型指定と言ってみたり。 ところでuse overloadってあるんだなw いわゆるオーバーロードじゃないけど
最初からOOPLとして作られたRubyだって 変数の「中身」には型あるけど 変数や引数自体には型無いぞ Perlだけでなく、いくつかの言語では 型指定が無いのがむしろ利点だったりするんだがな 私はDelphi以来、型指定には飽きたよ
実用性やPerlのスタンスは別として、関数のオーバーロードはフィルタ等を駆使すれば そう言う機能を提供するモジュールを作るのも不可能では無いと思うがどうだろう。 勿論Perlには型が無いから例えばマッチングを行なって振り分ける事になるが。
Perlの機能は何もかもマッチングとさぶるーちん呼び出しで作られている
マッチングまちこ先生の出番です
マッチングまちこ先生をふるちんで呼び出す ってどういうことやねん
まいっちんぐ・・
PerlでGenericsやTemplateも使ってみたかったりする。 型指定が大前提だが Java SE 5 Tigerでいうところのこんな感じのをPerlで実現する方法 知りたかったり。 (ListオブジェクトにはString型以外の型を入れることは許されない、という指定) List<String> list = new ArrayList<String>();
>>409 だから、C的な意味の「型」なんてないって、みんな言ってるでしょ。
$foo = 333;
とすれば、$fooは「333」という数値でもあるし、「333」という文字列でもある。
$fooに対して数値演算もできれば、文字列操作もできる。
OOPの前にPerlの基本的なことを勉強汁。
>>409 は、プログラマじゃなくタダの言語ヲタクだなw
型がないからそもそもperlプログラミング=Genericsプログラミングともいえる。
413 :
デフォルトの名無しさん :2006/01/05(木) 17:00:33
Perl5.8.7+Spreadsheet::WriteExcel 2.15について質問です。スレ違いの場合は誘導ください。 上記環境サーバ(RedHat9)にてExcelシートを作成しています。 日本語出力はUnocode::Stringにてeuc→utf16変換し、write_unicodeメソッドにて書き出しています。 2バイト文字の"−"を出力する際に、半角"-"と全角"−"の中間位のサイズの、コード "&#8722;"(ギリシア文字のマイナス。コードは実際は半角)に置き換わってしまいます。 そのため、このシートをCSV形式に変換しますと、置き換わった部分が?となって出力されてしまいます。 これを回避し、全角の"−"(ハイフン)を出力する方法はありますでしょうか? クライアントはWindows98/2000/XPです。よろしくお願いします。
>>413 化ける余地がありそうなところがeucからutf16に変換するところとwrite_unicodeの
2箇所あるので、どっちかぐらいは切り分けてから質問した方がいいと思われる。
最初の変換で化けているならSpreadsheet::WriteExcelが云々というのは全く無駄だし、
write_unicodeで化けているならUnocode::Stringで変換したとか曖昧なことを言わずに
化けるutf16文字の文字コードをきっちり書くべきだ。
>>413 − は − 。U+2212 は MINUS SIGN なので正しいと
言えば正しい。U+FF0D (FULLWIDTH HYPHEN-MINUS) に変換したい
という話なら、確認した限りでは Unicode::Japanese がそう変換してくれる。
http://search.cpan.org/~hio/Unicode-Japanese-0.32/ #!/usr/local/bin/perl -w
use Encode qw(from_to);
use Unicode::Japanese;
my $str1 = "\xA1\xDD"; # EUC-JP の '−'
my $str2 = Unicode::Japanese->new($str1, 'euc')->utf16;
from_to($str1, 'euc-jp' => 'UTF-16BE');
print unpack('H4', $str1), ',', unpack('H4', $str2); # 2212,ff0d
__END__
>>414 というわけで化けてるのではなく Unicode のマッピングの話。
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/
オライリーの砂ネズミ本買ったひといますか?
>>415 ありがとうございます。お陰で解決しました。
調べたところ、Unicodeコンソーシアムがテキトーに文字設定しちゃったからこんな状態に
なってるようですね。勉強になりました。
下の動かすとtell(IN)の戻りは10になるものだと思っていたのですが infoseek、tok2、uuhpのレン鯖では0になり、まいっちんぐです。 自分では確認していないのですがniftyも0になるらしいです。 ほかに0になる環境のやついますか? #!/usr/local/bin/perl print "Content-Type: text/html\n\n"; # 検証用の 10 バイトの test.dat を作成 if (open OUT, '>test.dat') { print OUT '0123456789'; close OUT; } else { print $!; } if (open IN, '+>>test.dat') { # eof(IN)が1のはず print "os:$^O<br>\n"; print "perlver:$]<br>\n"; print 'tell():', tell IN; close IN; } else { print $!; }
TemplateやGenericsの話をするときにC++よりもJ2SE 5が先に 出てきてしまうあたりがJava厨の悲しさ…
>>418 Perl の open() の ">>" は C ライブラリの fopen() の append
mode に対応している。少なくとも POSIX における append mode の
定義は「ファイルの seek 位置に関係なく末尾に追記する」こと
なので tell() で 0 が返されるのはおかしくない。
標準 C の規格は手元にないけど、レンタルサーバならほとんど
UNIX だから POSIX 準拠だろう。
>>418 ここ、ム板だから。一応。
>>1 #!/usr/local/bin/perl -w
open OUT, '>' . './test.dat' or die $!;
print OUT '0123456789';
close OUT;
open IN, '+>>' . './test.dat' or die $!;
print tell IN, "\n";
__END__
ActivePerl Build 522 (5.005_03) on Win98SE → 0
ActivePerl Build 815 (5.8.7) on Win98SE → 10
5.005_03 on FreeBSD 4-STABLE → 10
5.8.7 on FreeBSD 4-STABLE → 10
5.8.5 on RHL 7.3 (glibc 2.2.5) → 10
5.6.1 on RHL 7.3 (glibc 2.2.5) → 10
ファイルの読み込み&出力の効率化について質問です。 現在perlでhtmlの出力をしております。 この内、<body>の内容は データファイルに丸々保管されています。 この為、処理自体はprintで htmlヘッダ/ファイル/htmlフッタ という単純な出力で正常に動作しています。 そこで、このbodyファイルの出力についてですが、現在は open(FILE, 'hoge.dat'); print <FILE>; close(FILE); とありきたりに出力しているのですが、これは別の書き方で更に高速化 する余地はあるでしょうか? p.s. データファイルをいじってlocationで飛ばす方法は、URLが変わって しまう為、断念しました。
>>422 syscallでsendfileシステムコールを呼ぶ
そんなに単純ならCで書け
print <FILE>;よりprint while(<FILE>);のがいいんじゃ?
>>427 428ではないが、前者は一度全部メモリに読み込んでから書き込みになるが、
後者だと読み込みと書き込みが交互に行われる。
速度的にどっちが有利かは場合によりそうだが、メモリ消費は後者が圧倒的に
少ないと思われる。
430 :
デフォルトの名無しさん :2006/01/06(金) 14:18:42
print "犬を英語でなんという?"; $aaa=<>; chomp($aaa); if ($aaa eq "dog"){ print "オマエヤルナ"; } else{ print "逝け"; }
chomp($aaa = <>), print $aaa eq 'dog' ? 'オマエヤルナ' : '逝け';
>>422 >更に高速化する余地はあるでしょうか?
この動物を英語で何というか解れば、高速化できる。
∧∧ ∧∧ A_A
(*゚ー゚) ミ*゚ー゚ミ (*゚ー゚)
〜(,,,uu) @ミ__ミ 〜(,,,uu)
kitten
434 :
デフォルトの名無しさん :2006/01/06(金) 16:32:59
Perlのメモリ使用量を得るにはどうすればよいですか? CPU負荷はBenchmarkで計れますが、そのメモリ版です。 WinXP ActivePerl5.8.7
437 :
435 :2006/01/06(金) 18:16:16
メ、メンチマークw ありがとうございます。Devel::Sizeしか見つからなくてまいっちんぐでした。 Winでは動かないようなので、ぶっ壊れたRedHatが返ってきたら試してみます。
>>422 system('cat hoge.dat');
これがいちばん速いだろう
439 :
デフォルトの名無しさん :2006/01/07(土) 00:03:58
>>422 こんなのは?
open(FILE, "hoge.dat");
while ($len = sysread(FILE,$buf, 1024)) {
syswrite (STDOUT, $buf, $len);
}
close(FILE);
メモリ使用量は1024を変えて調整。
440 :
439 :2006/01/07(土) 00:11:16
あげてすまん。ちなみに誰かprintとsyswriteを混ぜることに問題があるかどうか知ってる? printはバッファリングするのかな?それともいちいちflushしてる?
441 :
デフォルトの名無しさん :2006/01/07(土) 00:37:24
print <> =~ /^dog$/ ? 'オマエヤルナ' : '逝け';
use Foo::Bar; my $obj = Foo::Bar->new(module => $hoge, %hash); 上のように呼び出して、Foo::Bar::$hogeってモジュールの newメソッドを呼び出すようにしたいんだけどFoo::Bar.pmをどう書けばいいか教えてくれ 具体的には、$hoge = 'Hoge'だったら実際に呼び出すのはFoo::Bar::Hoge->new(%hash) $hoge = 'Piyo'だったらFoo::Bar::Piyo->new(%hash)
eval "Foo::Bar::${hoge}->new()";
445 :
デフォルトの名無しさん :2006/01/07(土) 02:23:37
配列を昇順にソートしたいんですけど @list=(20,1,3); @result = sort { $a <=> $b } @list;を実行すると 配列は(1,20,3)のようになってしまいます 昇順だから(1,3,20)にならなければだめなのに どうしたらちゃんと昇順にソートできるんですか?
>>445 > 配列を昇順にソートしたいんですけど
> @list=(20,1,3);
> @result = sort { $a <=> $b } @list;を実行すると
> 配列は(1,20,3)のようになってしまいます
少なくともこっちではならない
目を皿のようにして自分のプログラムをチェックしなさい
>>444 ->演算子の左辺が文字列のときはクラス名と解釈されるので、
evalを使うまでもなく
"Foo::Bar::$hoge"->new(%hash);
とか書ける。
449 :
443 :2006/01/07(土) 06:57:44
>444,447 ありがとう、助かった。 そっか、そんな簡単なことでよかったのか。
450 :
418 :2006/01/07(土) 07:23:36
>>420-421 遅漏ですみません。
あれから他のレン鯖10箇所以上でも確認してみたのですが
OS依存でもなければPerlのバージョン依存と言うわけでもないという結論に至りました。
+>>で開くときは追加してから読み込むはずなので嵌る事は無いと思いますが
篠沢教授に1500点くらいの微妙さなので気をつけたほうがよさそうですね。
ありがとうございました。
perlで自分のIPアドレスを調べる方法はありませんか。 CGIではないので、$ENV{'SERVER_ADDR'}とかは使えません。 できれば、eth0とかeth1とかbr0とかNICを指定して調べられると良いのですが…
453 :
デフォルトの名無しさん :2006/01/07(土) 13:35:55
↑書き込むスレ間違えました。
455 :
デフォルトの名無しさん :2006/01/07(土) 14:08:59
perlって一桁の数字しかちゃんとソートできないのか 使えない言語だな
ワロス
package hoge; の全変数名と値を出力したいのですがよい方法ありますでしょうか。
上の方で出てなかったか
460 :
デフォルトの名無しさん :2006/01/07(土) 20:04:40
perlのsort関数は一桁の数字しかちゃんとソートできないんでしょうか?
>>460 どうせ、1 10 11 12 2 3 4 …になる、と言いたいんだろ?
“文字列”と“数値”の違いについて、一から勉強し直せ。
自作自演
>>462 また馬鹿を一匹発見。今日は収穫多いなw
sortごときでマニュアルも読めない奴はサポート付きの言語を使ってなさい
465 :
デフォルトの名無しさん :2006/01/08(日) 02:52:09
今までC言語で書いていたフォーマット変換プログラムをperlで書いてみた。 1/4のステップで同じものができた。 コーディング時間も大してかからなかった。 正直うれしかった。 そしてperlの強力さを知った。
466 :
デフォルトの名無しさん :2006/01/08(日) 04:01:52
シャチ泳ぎがすきです
>>465 言語の質はともかくステップ数の少なさだけならRubyも使ってみな
>>467 言語の質はともかく、ステップ数の少なさ
ならPerlのが上では?…分野によりけりか
469 :
デフォルトの名無しさん :2006/01/08(日) 06:19:28
>>468 CPAN があるので Perl の方が上
perlの文字列処理は強力だもんなぁ。 Cで同じ事しようと思ったら、考えただけでうんざりする。
>>470 うんざりすることに対しては、
たいていの場合、
うんざりしないようにしようという努力が傾けられている。
472 :
デフォルトの名無しさん :2006/01/08(日) 11:38:58
ただの配列のソートはできるようになりましたが @lines=("番号<>名前<>得点","1<>aaa<>600","2<>bbb<>500","3<>ccc<>800"); のようなデータベース配列で得点の高い順にソートして @lines=("番号<>名前<>得点","3<>ccc<>800","1<>aaa<>600","2<>bbb<>500"); のような配列にするにはどうすればいいんでしょうか?
>>472 <>でsplitして得点でソートすればいいよ。
475 :
デフォルトの名無しさん :2006/01/08(日) 13:08:49
>>475 @lines=("番号<>名前<>得点","3<>ccc<>800","1<>aaa<>600","2<>bbb<>500");
list(\@lines);
@lines = sort {(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]} @lines;
list(\@lines);
sub list{ my $a=shift; print $a; print join("\t",(split '<>',$_)),"\n" for (@$a);}
今日はまだ質問ないのか ちゅまんね
>>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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。