1 :
デフォルトの名無しさん :
05/03/17 13:45:32 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/03/17現在の最新版: 5.8.6
● 2005/03/17現在の開発版: 5.9.1
2 :
デフォルトの名無しさん :05/03/17 13:52:12
3 :
デフォルトの名無しさん :05/03/17 13:52:21
4ね
6はまだですか?
7 :
デフォルトの名無しさん :05/03/17 16:01:02
初心者です。教えてください。 Webのあるボタンを押したら、Perlのプログラムが走行するように したいのですが、やり方がよく分かりません。 HTMLの"onclick="コマンドを使えばいいのでしょうか。 onclick="xxxx/xxxx/funyafunya.pl" てな感じでしょうか? 教えて〜〜〜!
9 :
デフォルトの名無しさん :05/03/17 16:19:59
ううむ。 それさえ、よくわからん・・・。 でも、教えてくだされ〜〜!
('A`)
11 :
デフォルトの名無しさん :05/03/17 18:37:06
まだですか〜〜!
シリアルキー解析集「ALTEA」
大好評発売中!
http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960? 市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。
これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。
解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。
シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;
WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。
オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。
もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
ブラクラ?
14 :
デフォルトの名無しさん :05/03/18 07:28:30
13桁の数字だけにマッチさせるような正規表現はできますか?
>>14 length $hoge == 13 and $hoge !~ /[a-zA-Z_]/
こうか?
/\d{13}/
>>17 1234567890123abcde = 真
perlでディレクトリ内の最新のファイルを取得したいのですが、どのようにすればよいでしょうか。 ディレクトリ内には20050318.pngのように日付をファイル名とするファイルがあり、その中で最新のファイルのファイル名を取得したいのです。
>>19 いや・・・
普通に、もっとも数の大きいファイル名を選べばいいだけじゃないの?
ファイル名一覧を取得してソートしてさ・・・
21 :
デフォルトの名無しさん :05/03/18 11:47:24
>>20 最大のものをピックアップするだけでしょ。
だな。キーワードも揃ってんだし、後は自分で試行錯誤するべきだな。 ソース提示はこいつのためにならん
質問です <key>kNumber</key> <integer>6</integer> 上のようなxmlファイルの一部分の書き換えをしたいと思っています。 最初に書いたスクリプトは以下のようなものです use strict; my $pref = "file.xml"; my $i = 0; my $text; open PL,"+<$pref" or die; while (<PL>){ if (/kNumber/){ $i = 1; next; } if ($i == 1) { s/<integer>\d+<\/integer>/<integer>0<\/integer>)/; $i = 0; } } continue { print PL; } close PL; <integer>に囲まれてる"6"を変更しているのですが、 標準出力だと成功しているにも関わらずファイルに書き込むと うまくいきません。 この場合どのようにすればいいのでしょうか?
`ls -t *.png|head -1`
>>23 まず別の一時ファイルに書き出してから rename で置き換えるようにしる。
もしくは、一旦 XML の内容を変数にためてファイルを truncate してから書き出すか。
ありがとうございます。 同じファイルを書き換えるのは結構大変なものなんですね・・・ 変数にためてtruncateをやってみたら先頭に^@が山ほどついた ファイルが出来上がってしまいました。 my $pref = "file.xml"; my $i = 0; my $text; open PL,"+<$pref" or die; while (<PL>){ if (/kNumber/){ $i = 1; next; } if ($i == 1) { s/<integer>\d+<\/integer>/<integer>0<\/integer>)/; $i = 0; } } continue { # print; $text .= $_; } truncate(PL,0); #system("/bin/echo > $pref") ; print PL $text; close PL; ゴミを除いた結果と標準出力の結果は良好なんですが、 どうもファイルに書き込む際に先頭にゴミが入ってダメでした。 truncateはきちんと動作していました。 ありがとうございます。目先を変えてXML::Simpleを試してみます。
サブルーチンに複数の連想配列を渡すやり方を教えてください。 ----- $A{'A'}=100; $B{'B'}=200; &view(%A,%B); sub view() { my (%x,%y)=@_; print "1:$x{'A'}\n"; print "2:$y{'B'}\n"; } ----- 結果は 1:100 2: となります。呼び元の連想配列Bのキーを変えて $B{'B'}=200 ⇒$B{'A'}=200 とすると結果は 1:200 2: となり、sub view内での第1引数の値が変わっているように見えます。 view内での受け取り方my(%x,%y)=@_の問題のように思えますが、 第1引数と第2引数を別々に受け取るにはどうしたらいいのでしょうか。
29 :
デフォルトの名無しさん :05/03/18 14:33:07
>>28 > サブルーチンに複数の連想配列を渡すやり方を教えてください。
$A{'A'}=100;
$B{'B'}=200;
&view(\%A,\%B);
sub view {
my ($rx,$ry)=@_;
print "1:$rx->{'A'}\n";
print "2:$ry->{'B'}\n";
}
30 :
デフォルトの名無しさん :05/03/18 14:34:37
>>28 > となり、sub view内での第1引数の値が変わっているように見えます。
> view内での受け取り方my(%x,%y)=@_の問題のように思えますが、
> 第1引数と第2引数を別々に受け取るにはどうしたらいいのでしょうか。
サブルーチンの引数は、べろんとリストに展開されて渡されるだけ。
>>29 リファレンスで呼び出すんですね。
スカラーならリファレンス指定しなくてもいいのに
連想配列だと必要とは。。。いまいちすっきりしないです。
>>30 それは理解できるんですが、キャストのイメージが
他言語に比べ自由すぎて理解しづらいのです。
この例でも連想配列で渡したのだから連想配列変数に
直接代入できてもよさそうなものですし。
32 :
デフォルトの名無しさん :05/03/18 15:50:14
>>31 それには伝統的な理由(ry
引数に指定された連想配列は 配列に展開されてサブルーチンに渡されるらしいんだが、
この方式には問題があってな……引数をどこで区切ったらいいか、perl は分からなくなるんだ。
まあ、そこが可愛くも(ry
>>27 すまん、言ってなかったが seek(PL, 0, 0); してから truncate してちょ。
へんてこな仕様だとは思う。 Cで可変長引数の関数をベタベタに書いたときみたいな感じ。
前ヌレ消費しろよ
けっこう長いことPerlを使ってたが、 リファレンス先の変数が消滅しても領域が解放 されないことを、今日初めて知ったよ・・・ 今まで、Cのポインタみたく使ってたよ・・・ ショックだ・・・もうPerlやめよう・・・
どうぞ
>>37 たしか、いつ開放するかはPerlさんまかせだったと思う
必要になったら、Perlさんが開放してくれる
undefは破棄する関数だけどメモリを開放するとは限らないと。
質問させてください。 0〜10までの数字入力で、 10を超える数字や、文字を入力したりするとエラーとする処理はできるのですが、 入力で、01とか、00000とか入力されると、そのまま処理されてしまいます。 先頭の余計な0を削る方法はないでしょうか?
>>39 嘘教えるなよ。ちゃんとmyを使ってれば不要になった時点(リファレンスカウントが0になった時点)で破棄される。
俺はこれがRubyとの最大の違いだと思ってるくらいだ。
循環参照にさえ気をつければマークスイープのGCより遥かに強力だぞ。
メモリ領域の開放の話だろ >マークスイープのGCより遥かに強力だぞ 何故?
>>43 はいはい。悪ぅございました。
ちゃんと調べてきたよ。
ちなみに、マークアンドスイープアルゴリズムは今後のPerlに実装されるかもしれないってさ。
>>44 調べたのは感心だが、GCの動作の違いから
コードの書き方にどれだけ決定的な違いが生じるか、
ってのを感得しないと意味がないぞ。
Perl認定試験みたいなもんでもありゃ、用語覚えは役に立つかもしらんが。
(・∀・)Perl認定試験 ものすごい変態コードを読み解くパズルみたいな試験なのだ!。
ソースの暗号化をするソフトは知っているんですが。 記述によってソースを暗号化することは出来るのでしょうか?
うん
その方法を教えてください。
何故?
同じサーバ使ってる人にソース見られちゃうよー (つд⊂)エーンって感じだったりして。
暗号化したところでほとんど無意味 (実行時には展開されなくてはならないため) バイトコードに変換した方がよっぽど効果的だろうな
バイトコードもコンパイラが単純だとすぐ ソースに戻されちゃうからね。 ソース状態でも常人には読めない暗号の ようなコードが最強。
qrpff.plみたいなのか
XORHTMLみたいなのって 簡単にするとどういう手順で暗号化されているのかな? 出力する全文をそれと同じ手順を踏ませりゃいいのかと思いきや。
すみません、誰かアドバイスくれる方いませんか・・・
/^[^\D0]\d*$/
>>57 > 先頭の余計な0を削る方法はないでしょうか?
それなら
$var =~ s/^0+//;
でできるが、その前に
> 0〜10までの数字入力で、
> 10を超える数字や、文字を入力したりするとエラーとする処理はできるのですが、
> 入力で、01とか、00000とか入力されると、そのまま処理されてしまいます。
このエラー処理がすでに間違っている。
>>58 ありがとうございます。
文字列として処理しないといけないんですね・・・・
ってか、コンソールから文字を受け取る時点で数字も文字列扱いになるんでしょうけど・・・
>>59 ありがとうございます。
エラー処理が間違ってる・・・
うーん、どの部分でしょうか?
>>60 エラー処理の考え方が間違っているってこと
まず、自分がどんな処理をしたいのかを考えて、
それから、そのためにはどんな入力である必要があるかを考えてみてごらん。
0とか書いてるのが最大のエラーだな
>>60 > うーん、どの部分でしょうか?
どの部分も何も
> 10を超える数字や、文字を入力したりするとエラーとする処理はできる
のなら、
01は数値としては1だし、00000は数値としては0なんだから、
そのエラー処理とやらにひっかかるはずだと言っているのだよ。
>>63 の言ってる意味がわからないのは俺だけか?
>01は数値としては1だし、00000は数値としては0なんだから、
これは意味がわかる。
>そのエラー処理とやらにひっかかるはずだと言っているのだよ。
なぜだ?
0〜10の数字なら処理するように作りたいんだろ?
で、数値として、1やら0がエラー処理にひっかかるんだ?
>>64 > 入力で、01とか、00000とか入力されると、そのまま(エラー)処理されてしまいます。
では?
とりあえずその気色の悪い全角数字を止めれ
もしかして全角数字を入れたらエラーになるって事?
もういいよ、これやるから質問者も回答者も落ち着け $num =~ /^(?:[0-9]|10)$/
69 :
デフォルトの名無しさん :2005/03/21(月) 21:59:57
require 'foo.pl'; とした時に、foo.plが存在しないと即↓のようなエラーが出てしまうのですが、 Can't locate foo.pl in @INC (@INC contains: /etc/perl /usr/lib/perl5/site_p erl/5.8.5/i386-linux /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_per l /usr/lib/perl5/vendor_perl/5.8.5/i386-linux /usr/lib/perl5/vendor_perl/5. 8.5 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.5/i386-linux /usr/lib/per l5/5.8.5 /usr/local/lib/site_perl .) at bar.pl line 1. このエラーメッセージを任意のメッセージに変更する事などはできますか? それとも、 unless (-e 'foo.pl') { print "何か気の効いたエラーメッセージ\n"; } こんな感じにしないといけないでしょうか??
eval{ require "foo.pl"; }: if($@) { die "うんこ漏れそう"; }
s/:/;/;
eval で囲んどくとか。
ありゃ。出遅れまくり。すまん。
74 :
69 :2005/03/21(月) 22:21:54
>>70 >>72 ありがとうございます
これでいけそうです
ちなみに、参考までに聞いておきたいんですが、
requireのエラーをevalで捕捉する、っていうやり方はごく一般的なものなんでしょうか?
二人中二人が同じ方法を提示したからねぇ?
eval で囲んで if ($@) でキャッチするのは、 Perl での例外処理のイディオム。
77 :
69 :2005/03/21(月) 22:40:01
了解です ありがとうございました。。
クックブック12.2によると、モジュール読み込みが実行時じゃなくて コンパイル時に行なわれるよう、evalをBEGINのブロックでくるんで やるのがおばちゃまモアベターよ、とありますな。
すみません、以下の動作の違いがわかりません。 何について調べたらよいかアドバイスをいただけないでしょうか。 #!perl my @aaa = (1,2); my $bbb = 'aaa'; print $$bbb[1]; -----結果 出力無し #!perl @aaa = (1,2); my $bbb = 'aaa'; print $$bbb[1]; -----結果 2 よろしくお願いします。
シンボリックリンク、シンボルテーブルで検索
81 :
79 :2005/03/22(火) 19:42:24
>>80 ありがとうございます
今リファレンスの勉強をしてたんですけど、myがつくだけで結果が変わるのもシンボリック〜関係なんでしょうか?
該当部分をなかなかさがせません…
今更だけどクックブック第2版の内容は 初版にXMLとmod_perlが加わっただけ? 他にも加筆、修正があるなら買いたいな
>>81 myじゃない変数はシンボルテーブルに登録される
シンボリックリンクはシンボル名から変数を参照する機能
○シンボルテーブルから変数を参照する機能 ×変数を参照する機能
~$ perl -e '@aaa = (1,2); my $bbb = 'aaa'; print ${$bbb}[1], "\n";' 2
~$ perl -e 'my @aaa = (1,2); my $bbb = 'aaa'; print ${$bbb}[1], "\n";'
じゃあ、
>>85 tと
>>86 の違いはなんと説明すればいいのかしら。
(; ´д`)???
88 :
デフォルトの名無しさん :2005/03/22(火) 22:52:33
junoscript-perl-6.4I0ってやつが、たとえ正常にインストールしたとしても cpan>install 別のモジュール する度に毎回インストールされるのでうっとうしい。 1.これは何のためのもの? 2.こいつに何が依存している?(何のせいでインストールされている?) 3.インストールを拒否する方法(またはjunoscript is up to dateにする方法)は? お願いします。
89 :
79 :2005/03/22(火) 22:58:02
シンボル〜とかstrict 'refs'とか知らないのがまだまだ出てきたんで解決はしてませんが ヒント(答え?)もらって助かりました。 アリザイマシタッ!
つーか、Perlの例外処理はError.pm使っていこうぜ。
Perlで画像解析(指定した画像にある画像と同じ物が含まれているか。)をしたいのですが、 そう言うことをするのに便利なモジュール、あるいはサンプル等ないでしょうか? やはり自前でBMPを解析していくしかないのでしょうか?ご教授お願い致します(_ _)
92 :
デフォルトの名無しさん :2005/03/24(木) 15:41:27
質問します。 $QUERY{'COM'}に < が存在したときにエラーとしたいのですが 下記の正規表現ではつかまえることはできません。例えば、< をtestに変えると testという文字を検出できるのですが、< だとできません。 \をつけてもだめでした、教えてください if ($QUERY{'COM'} =~ /(.*)<(.*)/) { &error('<は使用できません'); }
>>92 <の前後の文字列をキャプチャーしようというのでなければ
その正規表現は無駄で/</で十分だが、そのままでも<が
含まれていればマッチはするはずなので、$QUERY{'COM'}の
中身の方があやしいな。
とりあえずややこしいプログラムのままではわけわからん
ので、適当に$QUERY{'COM'}を表示してみるとか、if文の
直前でテスト用の値を代入するとかして切り分けた方が
いいんじゃないかね。
94 :
デフォルトの名無しさん :2005/03/24(木) 16:37:09
>>93 ごていねいにありがとうございます
やってみます
<にエスケープされてるとか
96 :
デフォルトの名無しさん :2005/03/25(金) 15:18:37
linux でperl5を使っていますが、 PC上での開発は、メモ帳を使っています。 デバッグとかpc上でできたり、色わけできたら開発しやすいのですが、先生方が使っているツール 教えてください。 perlをはじめよう というソフトをダウンしてつかってみましたが、windows用で動作する環境を想定して いるので使い物になりませんでした orz
Linux板のくだ質でもスルーされそうな質問が来てますが
>>98 そうやってかまってしまう君は面倒見良過ぎ。
102 :
デフォルトの名無しさん :2005/03/26(土) 03:02:52
perlでsocks proxyを作りたいのですが、どうやって作ればいいかわかりますか? サンプルコードとかが落ちてるなら、それへのリンクでも結構です。
103 :
デフォルトの名無しさん :2005/03/26(土) 03:07:01
RFC 1928, RFC 1929.
104 :
デフォルトの名無しさん :2005/03/26(土) 03:10:28
年月日を(S46/07/01)などのような書式で統一されたテキスト文書を 1971(S46/07/01)と西暦を附加するにはどうしたらいいでしょうか。 とりあえず昭和のみです。
>>106 '(S46/07/01)'のパターンを捕捉して、'1971(S46/07/01)' に置換します。
>>106 $aho = "(S46/07/01) べべべ \n べべべ (S12/12/23) べべべ \n (S64/01/12)\n";
$aho =~ s{(\(S(\d{2})/\d{2}/\d{2}\))}{1925 + $2 . $1 }eg;
print $aho;
>>107 すいません。
具体的にパターン書いてもらえませんか。
$aho
111 :
デフォルトの名無しさん :2005/03/26(土) 10:39:16
Eclipse+EPIC でどうだ?
>>111 そんなやつにエディタを使いこなすのは無理がある
terapadはWindows専用で、有名なソフト
vimはUNIX使ってるなら知らないとおかしい
Kateが素人にはお薦めかな?
Emacsのほうがいいとは思うが
漏れは、へてむるクリエイタ〜、Terapad、Vim(Win,lunix両方)併用
115 :
デフォルトの名無しさん :2005/03/27(日) 10:14:52
おれは、机上マシン、押し入れマシン、ホスティングサイトの全プログラムを、 机上マシン上で動かしているemacsで、trumpを使って遠隔読み書きして メンテナンスしてる。 emacs者でまだtrumpを使ってない人がいたら、すぐに使いはじめることを 強く推奨する。 最近めっきり見なくなった、ネットワーク透過性という言葉を思い出させてくれるぜ。
ぱぱらっちー
118 :
デフォルトの名無しさん :2005/03/27(日) 15:12:42
恥!!
>>115 ごめんなさい。
入れるのが面倒くさいのでange-ftpで済ましてしまっていました。
120 :
デフォルトの名無しさん :2005/03/27(日) 20:54:25
俺もange-ftpなんだがそんなにtrampは良いものなのかね。
121 :
デフォルトの名無しさん :2005/03/28(月) 01:01:25
実行したときにコンソールに表示する文字を hogehoge.pl > foo.txt 見たいにしています。 プログラム中で標準出力先がコンソールかファイルかを判別させるには どうしたらよいでしょうか? やりたい事はコンソールだとカラー表示、ファイルへの出力だと エスケープ文字を出さないようにしたいだけです。 よろしくお願いします。
POSIX::isatty
sub UNIVERSAL::attr : ATTR(CODE) {} …な時に、 package A; sub test : attr {} …ってやって eval('use A'); …ってやると、attr : ATTR(CODE) が実行されないんだけど、これって仕様?
125 :
デフォルトの名無しさん :2005/03/28(月) 20:46:09
それはそうと、誰でも読めるコードを書きましょうの会
>>124 サブルーチンに対するアトリビュート付加はコンパイル時に行われる。
use attributes;
attributes->importL(__PACKAGE__, \&test, 'attr');
で、いけるかな。よくわからんけど。
gdbのラッパをperl(5.6.0)で書こうとしています。 gdbにかぎった話しではないのですが、対話型のインタフェースを持つ プロセスに対してラッパを書くのはどうしたらいいのでしょうか? gdbへの入力と、gdbからの出力の双方を得る方法で 悩んでいます。 さらに困ったことに、CPANからライブラリを入手できない環境です。
プロセス間通信
perlスクリプトを、送るメニューから使えるようにするにはどうしたらいいでしょうか? win32 , active perlです。 SendToフォルダにスクリプトを入れても何も起きませんでした。
送るメニューってなんですか
右クリックをしたときに出てくるコンテキストメニューの中の”送る”の項です
>129 open()ではうまいこといかないですよね。 IPCというわけでもないようですし。 双方向というのが肝だと考えています。 gdbに対して入力するFileHandleを作ってから、 ( "| dbx $argments" ), そこからforkして 別プロセスにし、その標準出力を名前付き パイプに吐かせて、親プロセスで受ける、 という方法を試してみました。これは失敗。 どこがまずいのか、どのようにすれば うまくいくのか、それとも根本的に 発想が間違っているのでしょうか。
IPC::Open2は?
>>129 batファイルにしてそれのショートカットをSendToに置く
>>129 perl2exeでexe化したのを送るに登録する
常用するようなスクリプトは俺そうしてるよ
parでうまくいきました。
Perlが手元にあるのなら、pl2batで十分なのだが。
139 :
デフォルトの名無しさん :2005/03/29(火) 14:24:42
>>127 > さらに困ったことに、CPANからライブラリを入手できない環境です
CPANでなくても、どこからかDevel-GDBを見つけてきて
使うなり見るなりすればいいじゃん。
>>126 どうもです。
試してみたんですが、sub test : attr {} の時と同じように、
CHECK と INIT フェイズが実行されませんですた。
コンパイル時にアトリビュートの付加が行なわれるので、
eval {} から require すると BEGIN/END しか実行されないのは仕方ないですね。
諦めます(´・ω・`)ショボーン
141 :
デフォルトの名無しさん :2005/03/29(火) 19:48:49 ID:
ワロス
Perlがモザイク生成言語だったとはw
>>144 おまえもなー。って、もしかして自分も変かな?
Perlでncursesは使えますか?
147 :
デフォルトの名無しさん :2005/03/30(水) 11:53:07
perlでは、行単位でテキストを読みながらちょこちょこ編集したいときに、条件節で使うのは、 /foo/ のような単純なマッチと、( index($_, 'foo') >=0 ) とでは、どちらが速いですか? 自分のCGIでベンチマークしても、どちらも2msぐらいで終わってしまうので、チラシの裏にテスト用の コード書こうかと思ったんですが、ここで訊いてからにしようと思って。
use Benchmark;
以前気になってベンチとったけどindexのがエロかった
151 :
デフォルトの名無しさん :2005/03/31(木) 00:16:48
常に0〜79のいずれかの状態である変数$Aを条件として、80ある関数のうちの一つに分岐します。 この80の関数のどれか一つに進んだら残り79の関数には進みません。 で、この分岐を上手い具合にやる方法は無いですかね? if($A==0){ FUNC0(); }elsif($A==1){ FUNC1(); }elsif($A==2){ FUNC2(); }elsif($A==3){ FUNC3(); ………………… }else{#エラー } と書いて行くのも素敵ですが、こう上手い具合に格好よく。ヒーローみたいな何か。
152 :
151 :2005/03/31(木) 00:19:33
追記。 関数名は何でもいいです。 つまり、変数名自体を関数の一部として使ったり、 関数事態を配列にするような、そんな夢ドリームなファンタジーがPerlにあったりしませんか?ってこと。
153 :
その1(Perl6の場合) :2005/03/31(木) 00:25:04
switch ($A) { case 0: FUNC0(); break case 1: FUNC1(); break case 2: FUNC2(); break case 3: FUNC3(); break default: 処理3; break }
154 :
その2(その他の場合) :2005/03/31(木) 00:27:25
SWITCH : { a==0 && do {FUNC0(); last SELECT; }; a==1 && do {FUNC1(); last SELECT; }; a==2 && do {FUNC2(); last SELECT; }; a==3 && do {FUNC3(); last SELECT; }; その他の場合(); }
155 :
デフォルトの名無しさん :2005/03/31(木) 00:28:03
あ、
>>153 の処理3;はその他の場合();の書き間違い。
こんなんでどうだ。
156 :
デフォルトの名無しさん :2005/03/31(木) 00:28:44
157 :
デフォルトの名無しさん :2005/03/31(木) 00:29:26
さらに抜本的な解決になってないわ。スレ汚しスマソ
関数へのリファレンスを配列につっこんどけば? sub boo { print "boo" } sub foo { print "foo" } sub woo { print "woo" } my @list_of_func = (\&boo, \&foo, \&woo); $list_of_func[1]->(); #=> foo
sub FUNC1{return 1}; sub FUNC2{return 2}; $A = 2; print &{"FUNC$A"};
160 :
151 :2005/03/31(木) 00:47:42
とりあえず>158で行ってみたいと思います。皆様ありがとうございました。
呼ぶ方はそれでいいとして80個の関数の定義はやっぱり だらだらと並べて書いてあるんだろうか? とふと疑問に 思った。
80もの分岐を作るなんて普通じゃない もっと分岐を分割できるだろ?普通。
163 :
デフォルトの名無しさん :2005/03/31(木) 02:51:48
だったら80より増えんじゃんw
>>163 何か勘違いしてないか?
たとえば、何かのアプリのメニューバーを見ろ。
ファイルだの表示だのってメニューがあるだろ?
ファイルを選べば、そこからまた分岐する。
80分岐してるなら、
最初に8分岐させる。
1だったら、1〜10を
2だったら、11〜20を・・・
こんな感じにすれば、一番下まで評価していったとしても18回
80回も評価してたら重いし負荷大きいし、
ダラダラまとまりなくソース長いし。
で、それのどこが「分岐の分割」なんだ?
>>165 理解して貰えなくて残念だ。
これ以上語る事などない
>>158 のやり方なら 80回も評価しないと思うが、
>>166 には理解してもらえなくて残念だ。
これ以上語る事などない
>>166 分岐が100だろうと1000だろうとたいした問題にならない回答はすでになされてるだろ。
あんたがアホウだということしかわからんよ。
>>167 ああ、そうだな。
80回も評価しない。
が、80ものルーチンをコンパイルしてメモリに常駐させておくつもりか
そんなのも現実的じゃない。
そりゃ、print文一行程度ならいいかもしれんが。
いかに軽く負荷がかからないようにするかを考えるのが醍醐味だろ?
そんなダラダラ書くのなんて誰だってできるだろ・・・
>>169 おお、自分が間違ってたら今度は論旨のすり替えですか。
頑張ってくださいね。
>>168 いや、負荷かかってもいいからって言うなら問題ない。
そりゃ俺がでしゃばったな。
悪い事した。
>>170 80も一度に評価させるのも、
80もルーチン常駐させるのも、
普通はそんな不器用な事しないって事。
悪かった悪かった。
151の話では、ルーチンを配列で扱いたいって事なんだな。
158の回答で正解。
ここにいる人達はただ動けばいいと思ってる日曜プログラマーだから スピードなど2の次
アホかい。 スピードやリソースの狭小さがシビアなときにPerlなんぞ使ってられるかっての。
>>172 じゃあその80の関数を圧縮する器用で普通で現実的な方法とやらを教えてくれよ。
>>174 たとえPerlでもいかに処理が早くできるか否かを考えるのは普通
ってか、自然と考える
それを考えれないヤツは他の言語使っても同じだって事に気づけ
>>177 perlでは
>>168 のやり方が最善だ。
それがわからんのはあんたが無知の知ったかだから。
>>179 それが最善とわかるのは普通
ってか、自然とわかる
それを自然とわからないヤツは他の言語使っても同じだって事に気づけ
>>180 ・・・それが最善とわからないでよかったと思うw
なんか伸びてると思ったら・・・
166 :デフォルトの名無しさん sage :2005/03/31(木) 03:01:38
>>165 理解して貰えなくて残念だ。
これ以上語る事などない
----
いつまで語ってるんでしょうかね^^;
>>179 うるさいなあ。テメエで時間はかってみりゃいいだろ。
早く
>>176 に答えて!
まさかコード出さずに空論振り回してるだけの無能?
>>183 俺がレスしたのは・・・
>>172 からは、
>>181 だけだな。
>>172 に俺のやり方をレスしようかと思ったけど、
途中で面倒になってやめた。
考え方が違いすぎるから。
いくら最適化したのを見せた所で話が終わらないと見た。
動けばいいと思うならそれも一理有りだ。
もう何も言わないよー寝るからー
>>185 悪い悪い、もういいかなって思い出してきてるし・・・
忘れてくれ、俺が悪かったって事で。
おやすみー
>>158 ハンドラ関数などでよくあるパターンで、ハッシュに入れるというのもありますよね。
my $func_table = {
0 => \&boo,
1 => \&foo,
2 => \&woo,
};
$func_table->{1}->(); #=> foo
/foo/とindex()のベンチやってみたけどマッチのほうが速かったよ。
http://www.gnu.org/software/emacs/manual/emacs.html ↑このでかいhtmlをダウンロードしてテスト。
-->
This is perl, v5.8.6 built for cygwin-thread-multi-64int
Input: ../../Web_Archives/emacs.html
Lines: 41879
BaseTime: 66 ms
Nullpo-match: 118 ms (x1.771)
Nullpo-index: 157 ms (x2.359)
#!/usr/local/bin/perl use Time::HiRes; use strict; system "perl -v |grep 'This is perl'"; my $startT = Time::HiRes::gettimeofday; my $elapsedT; open(FILE, "< $ARGV[0]") or die $!; print "\nInput: $ARGV[0]\n"; undef while (<FILE>); my $baseT = (Time::HiRes::gettimeofday - $startT)*1000; printf "%12s: %5g\n", "Lines", $.; printf "%12s: %.0f ms\n", "BaseTime", $baseT; seek(FILE, 0, 0); (/nullpo/) and die "GATT!!" while (<FILE>); $elapsedT = (Time::HiRes::gettimeofday - $startT)*1000; printf "%12s: %.0f ms (x%.3f)\n", "Nullpo-match", $elapsedT, ($elapsedT/$baseT); seek(FILE, 0, 0); (index($_, "nullpo") >= 0) and die "GATT!!" while (<FILE>); $elapsedT = (Time::HiRes::gettimeofday - $startT)*1000; printf "%12s: %.0f ms (x%.3f)\n", "Nullpo-index", $elapsedT, ($elapsedT/$baseT);
191 :
デフォルトの名無しさん :2005/03/31(木) 07:21:35
>>189 > /foo/とindex()のベンチやってみたけどマッチのほうが速かったよ。
低能!
能無し!!
バグメーカー!!!
プロジェクトブレーカー!!!!
192 :
189 :2005/03/31(木) 07:57:13
右派wwwぜんぜん気付かなかったわマジでw
メタ文字のない単純なマッチは内部でindex()並に最適化される。 だから速度的にはほぼ同じはず。 敢て言えば、index(...) != -1とm/.../では、後者のほうが最後の=-1との比較(相当)を 内部で行う分若干早くなる可能性はあるな。 まぁ速度的には気にする必要は無いってこった。使いたいほうを使うのが最善だな。
午前4時まで議論ですか それこそuse Benchmark
最後のexのあたりがエロいだろ
そういう場合はFUNCnの中身もちょっとずつ違うってパターンだろうから TemplateMethodかFactoryMethodパターンあたりに幸せが待ってます。 # 既にFUNCnの実装がそろっているならラッパを書くとかして。 # 80個も実装する必要はないだろうな。 package AbstractFuncClass; sub foo { ... chuushoutekina nanika ... } sub bar { ... } -- package Func0; use base qw(AbstractFuncClass); sub func { ... gutaitekina nanika ... } -- package Func1; ... hitasura tuzuku ... -- my $baseName = 'Func'; my $concreteName = $baseName . $A; try { $concreteName->func(); } catch Error with { # no such method or class }; Func0~79は適当なローダとか書いたりして呼んどく?
198 :
197 :2005/03/31(木) 21:10:56
199 :
デフォルトの名無しさん :2005/03/31(木) 22:09:44
>>197 > そういう場合はFUNCnの中身もちょっとずつ違うってパターンだろうから
そうでない場合も多々ある。
>>199 そうでないとしたら、
処理に 1 とか 2 とか番号を振る convention 自体があまりよろしくない気も。
番号じゃなくて処理内容を適切に表す名前をあてがうべき。
まあ
>>151 の具体的な「やりたいこと」がわからない以上、
全て憶測でしか言えないわけだが。
>>200 イベントハンドラでも
コマンドディスパッチループでも
プロトコルエンジンコアでも、
なんか名前つけるよな。
しかし、抽象的な計算を行なう状態遷移マシンの場合、
名前なんかいちいちつけてられるかと
いう場合もあるし、Perlの場合、
どうやったらいいのか分からなかったり
遅くなるんじゃないかと思ったりするかも。
まあたしかに
>>151 の具体的な「やりたいこと」がわからない以上、
何を言ってもよもやま話の域を出ないわけだが。
手で80個書くと思うとぞっとしないが、何らかのデータから プログラム生成して80個できたなんてのは普通だしな。
203 :
デピョルトの名無しさん :皇紀2665/04/01(金) 10:13:39
ところで、 $a = $b みたいなことってできるのか?
204 :
デフォルトの名無しさん :皇紀2665/04/01(金) 10:33:21
while (<*>) { #適当な処理 } で、カレントディレクトリのファイル名を取得する時 数字ではじまるようなファイルがちゃんとソートされてるんだけど、 それって保証されてるの? それとも一旦、配列かなんかに入れて自分でソートしたほうがいいの? あと、pythonのソースを自動でperlのソースに変換してくれる ようなスクリプトとかってない?
>>204 デフォルトで用意されてるのはソートする仕様だと思った。
ただしglob関数を置き換えることが出来るのでそのときは
わからない。
File::Globについて調べるのがいいだろう。
>>158 は、名前をいちいち考えたくない時こうすればいいよね。
my @list_of_func = (
sub{ print "boo" },
sub{ print "foo" },
sub{ print "woo" },
);
$list_of_func[1]->(); #=> foo
207 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 21:32:04
質問ですぅ $ransuu = int( rand(9) ); を実行たら、何度実行しても$ransuuが9を吐いてくれないんですけど、それってボクだけ?
208 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 21:34:01
rand()の有名なバグです。 あきらめて乱数生成ルーチンを自作しましょう
209 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 21:40:35 BE:88200274-###
素直にint(rand(10))すればいいんじゃね? ところで日付おかしくね?
210 :
207 :int 2ch =05/04/01(金) 21:45:35
あっ、バグなんだ
ども〜…。
>>209 ちなみに、今日はエイプリルフールですよ。
>>210 >あっ、バグなんだ
今日はエイプリルフールですよ。perlfunc見てみましょう。
ザザンザンザザン! 1年半の月日を経て ザザンザンザザン! あのウンマンコが帰ってくる・・・
明日質問すべきだったね・・・
214 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 22:53:05
while (<FH>){ print $_; } みたいな時に while $buf (<FH>) ってやったら$_と同じ内容が$bufに入ってますか?
215 :
ウンマンコ :int 2ch =05/04/01(金) 22:54:57
その時点で$_にははいってにゃい
216 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:08:33
perl5.10.0age
217 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 03:58:18
ボロ糞に言われてるな。まぁそんなもんか。
プログラマーがみんなあんなのだと思われたらヤダネ。
220 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 11:37:56
動画ありませんか?
オープンソースカルチャーにとっては、 大ダメージだったな。
222 :
デフォルトの名無しさん :int 2ch =5,2005/04/02(土) 14:51:39
(@buf) = split(/./, $data); foreach (@buf) { print $_, "\n"; } こんな感じで、$dataに入ってる文字列を1byteずつ 出力したいんですが、思う通りに動きません。 何かいい方法はないでしょうか
223 :
222 :int 2ch =5,2005/04/02(土) 14:53:22
すみません書いてからアホな事書いてる事に気づきました 吊ってきます
関係ないけどコメントのインデントがおかしくないか?
>>224 > 関係ないけどコメントのインデントがおかしくないか?
関係ない以前に、意味わかんない。
226 :
222 :int 2ch =5年,2005/04/02(土) 16:50:36
sub split_str { my(@bufs, $i) = (); my($buf) = $_[0]; for ($i = 0; $i <= length($buf); $i++){ push(@bufs, substr($buf, $i, 1)); } return(@bufs); } これより高速な方法ってありますかね?
227 :
デフォルトの名無しさん :int 2ch =5年,2005/04/02(土) 16:54:51
正規表現使うならこうだろ @buf = split(//, $data)
229 :
222 :int 2ch =5年,2005/04/02(土) 17:03:29
>>227 なるほど・・・
ありがとうございました
ActivePerl5.8で下のコードを実行すると 結果が6.2となるはずが、6.19999...となってしまいます。 なぜだか教えてください。お願いします。 コード: use FileHandle; my $s=11; my $e=77; my $fo = new FileHandle "> result.txt"; if(defined $fo){ for(my $i=$s;$i<=$e;$i++){ for(my $h=1.1;$h<10;$h+=0.1){ print $fo $h,"\n"; } } $fo->close(); }else{print "open failed.\n";} 結果: 省略 6 6.1 6.1999999999 6.2999999999
有効な桁が決まってるなら下駄を履かせろとあれ程言っておいたのに…
すいません、細かい事は気にしないで ↓の様にしておきます。 : for(my $h=11;$h<100;$h+=1){ print $fo $h,"\n"; } :
printf $fo "%.1f\n",$h;
234 :
デフォルトの名無しさん :2005/04/02(土) 23:49:10
質問です。 use File::Copy; move($file, $dir."/".$file); というようなファイルの移動したいとき、 WindowsのActivePerlだと"/"を"\\"に変えればOKだと思いますが、 $fileや$dirにスペースなどの特殊文字が含まれる場合、うまくコピーできなくて困っています。 このような場合は、どうすればいいのでしょうか?
下駄の用意はいいか!! わかる人いるかなあ
>>225 ,
>>228 2chのコメント部分のインデントがいつもと違う気がしたんだけど
風邪ひいて熱があるので俺の頭がおかしくなってるだけだと思う。
わけの分からん事を言ってすまん。
>>234 #--- movetest.p ---
#!/usr/local/bin/perl -w
use strict;
use File::Copy qw(move);
local *SRC;
opendir SRC, my $src_dir = './foo' or die $!;
my @file = grep !/^\.\.?\z/, readdir SRC;
closedir SRC;
my $dst_dir = './bar baz';
move("$src_dir/$_" => "$dst_dir/$_") for @file;
__END__
T:\>dir /B /O:N /S
T:\bar baz
T:\foo
T:\movetest.p
T:\foo\勝敗表
T:\>perl movetest.p
T:\>dir /B /O:N /S
T:\bar baz
T:\foo
T:\movetest.p
T:\bar baz\勝敗表
>>106 s{(\(S(\d\d)/\d\d/\d\d\))}{ 1925+$2 . $1}eg;
239 :
デフォルトの名無しさん :2005/04/03(日) 22:43:00
だせーw
241 :
デフォルトの名無しさん :2005/04/04(月) 11:01:28
教えて下さい。 ActivePerl5.8を使っているのですが、 日本語テキストの変換で 「サーバー」を「Server」などに変換する際に $text_data = "サーバー"; という様な値(文字)が入っていた場合 $text_data =~ s/サーバー/Server/; と記述するとエラーになります。 どうも「−」の文字が何かのコードに引っかかるようです。 他にもそのような日本語があるようですが、 そのような場合はどうすれば良いのでしょうか?
use UTF8;
244 :
デフォルトの名無しさん :2005/04/04(月) 20:11:37
現在掲示板を作成しています。 記事一つ一つが採点式となっていて、観覧側がその記事に点数をつけていくもの なんですが(貼り付けた画像の採点等)、 点数は100 75 50 25 0があり、ラジオボックスで選択し、投票させ、点数は 獲得した合計点数/投票数とします。 ログの記録は 記事番号<>名前<>題名<>コメント<>点数合計<>投票数<>計算後の合計<> とし、書き込みログと投票ログを同じファイルに書き込みたく、 どの記事に投票したかの判断は記事番号でしようと思います。 ラジオボックスのname属性を$num(記事番号)としています。 ここで質問なんですが、ログを書き込む際、投票した記事番号の 点数合計<>投票数<>計算後の合計<>だけを上書きさせるにはどうしたらいいでしょう? 〜番の記事の点数だけを上書きさせるということです。 言いたい事があまりうまく表現できないのですが・・お願いします。
246 :
244 :2005/04/04(月) 20:34:45
>>245 全て読み込んで全て上書きということでしょうか?
>>244 use Fcntl qw/:seek/;
open(fd, "+<$logFile");
seek(fd, 記事のレコードの先頭, SEEK_SET);
my @rec = split(/<>/, scalar(<fd>));#4,5,6
my $A = hex $rec[4];
my $B = hex $rec[5];
my $C = hex $rec[6];
# $A, $B, $C に対して何らかの操作
$rec[4] = sprintf("%04x", $A);
$rec[5] = sprintf("%04x", $B);
$rec[6] = sprintf("%04x", $C);
close(fd);
248 :
247 :2005/04/04(月) 20:39:16
悪い、ミスッた・・・ Closeする前に seek(fd, 記事のレコードの先頭, SEEK_SET); print fd (join('<>', @rec));
249 :
244 :2005/04/04(月) 21:37:49
>>247 >>248 記事のレコードの先頭とはどういったものでしょうか?
恐らく数字が入ると思うのですが・・・この場合$numでしょうか?
seekというものを使ったことがないので今日調べたのですがKENT WEBやとほほのWWW入門
にも記載されてなかったので・・
# $A, $B, $C に対して何らかの操作
というのは投票の計算等の処理ですね??
250 :
デフォルトの名無しさん :2005/04/04(月) 21:47:15
251 :
244 :2005/04/04(月) 22:02:53
>>250 ありがとうございます。
ファイルの途中から読み書きするってことですね。
seek(fd, 4, SEEK_SET);
これでfd内の前から5つ目ということになるのでしょうか?
それとも配列変数のように0は入らないで4つ目ということでしょうか?
記事番号<>名前<>題名<>コメント<>点数合計<>投票数<>計算後の合計<>
この場合、4バイト目はコメントなのか点数合計なのかということです
>>251 ちゃんと
>>250 読みました?
第二引数はファイルポインタです
あとseekを使う方法はキーとなる情報がファイルポインタ(もしくは行数など)
に対応していないと使えないので、
配列に全部読み込んで処理したほうがいいかも知れないです
255 :
デフォルトの名無しさん :2005/04/04(月) 23:06:56
すげえ、マニュアル読む代わりにここで質問か。
>>255 似たようなことをやってるプログラムのコードを見つけてきて
それを読むかわりに、ここで質問でもある。
257 :
デフォルトの名無しさん :2005/04/04(月) 23:20:01
他スレで質問したけど、すれ違いだったようなのでここで 質問します perl5.0で携帯から、絵文字入力があったばあい(バイナリ16進で4桁)に、それを検知して s-jisの(アスキー文字の16進4桁)に変換したいのですが、 下記の、正規表現でできると聞きました。実際に使用するとうまく変換されているようなのですが、 なぜこれで変換できるのかわかりましえん。わかるかたおながいします s/\G((?:[\x80-\x9F\xE0-\xF2\xF4-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF3] [\x40-\x7E\x80-\xFC])/$1.'['.unpack('H4', $2).']'/ego;
見たままだが…どの部分がわからんのか言ってみそ
261 :
デフォルトの名無しさん :2005/04/05(火) 01:56:42
>>259 >>260 とりあえずありがとう
わからなかったのは、
$1 の Shift_JIS の "1文字 がわからなかったです。
これが絵文字の一部だと思ってたので、そうなると、桁数が合わず混乱してました
絵文字は$2の部分だったんですね〜
ご丁寧にありがとうございました。
262 :
デフォルトの名無しさん :2005/04/05(火) 10:45:18
>>243 レスが遅くなりました、ありがとうございます。
263 :
244 :2005/04/05(火) 14:33:36
とりあえず $TOHYO = $FORM{"$num"}; use Fcntl qw/:seek/; open(fd, "+<$LOGFILE"); seek(fd, 0, SEEK_SET); my @rec = split(/<>/, scalar(<fd>)); my $ALL = hex $rec[7]; my $KAZU = hex $rec[8]; my $GOUKEI = hex $rec[9]; $ALL = $rec[7]+$TOHYO; $KAZU = $rec[8]+1; $GOUKEI = $ALL / $KAZU; $rec[7] = sprintf("%d", $ALL); $rec[8] = sprintf("%d", $KAZU); $rec[9] = sprintf("%d", $GOUKEI); seek(fd, 0, SEEK_SET); print fd (join('<>', @rec)); close(fd); として、投票のラジオボックスのname属性は記事番号にするため$numとしています。 それを$TOHYO = $FORM{"$num"}; で、TOHYOに点数を入れています。 これでとりあえず記事が1つの状態で自分が思っていた動作はしてくれていますが、 記事を増やして投票ボタンを押すと、投票した記事の上の記事に投票(1に投票すると2に投票) され、更にその投票させたかった記事のログが無茶苦茶になってしまいます。 原因を探してみたのですがわかりませんでした。 アドバイスお願いします(゚∀゚)
≫記事のログが無茶苦茶になってしまいます。 詳しく! ( ゚∀゚)σ)´Д`)
>>263 > アドバイスお願いします(゚∀゚)
あきらめる。
266 :
247 :2005/04/06(水) 00:26:58
>>263 hex & sprintf("%04x", ...) 使ってる理由わかってますよね?
新しく記事を追加する際にも、四桁の16進数文字列にエンコードしないと、
変更した時に長さが変わるんだから可笑しくなるのは当たり前田のプラモデル
267 :
デフォルトの名無しさん :2005/04/06(水) 00:55:16 BE:188546887-#
クラッカー
268 :
デフォルトの名無しさん :2005/04/06(水) 10:33:12
すみません。質問です。 未だにActivePerl 5.005_03 + Jperl を使用しています。 少し前(一ヶ月ぐらい前?)までは、PPM(1.1.2)が正常に使えていたのですが、 今日、PPMを使おうとしたら、 >PPM interactive shell (1.1.2) - type 'help' for available commands. >PPM> verify >Error verifying CGI-XMLForm: Could not locate a PPD file for CGI-XMLForm となってしまいました。 これは、ついにbuild522のPPMリポジトリがなくなってしまった、 ということなのでしょうか?
269 :
244 :2005/04/06(水) 10:51:37
use Fcntl qw/:seek/;
open(fd, "+<$LOGFILE");
seek(fd, 0, SEEK_SET);
my @rec = split(/<>/, scalar(<fd>));
my $ALL = hex "$rec[7]";
my $KAZU = hex "$rec[8]";
my $GOUKEI = hex "$rec[9]";
$ALL = $rec[7]+$TOHYO;
$KAZU = $rec[8]+1;
$GOUKEI = $ALL / $KAZU;
$rec[7] = sprintf("%04x", $ALL);
$rec[8] = sprintf("%04x", $KAZU);
$rec[9] = sprintf("%04x", $GOUKEI);
$rec[7] = hex "$rec[7]";
$rec[8] = hex "$rec[8]";
$rec[9] = hex "$rec[9]";
seek(fd, 0, SEEK_SET);
print fd (join('<>', @rec));
close(fd);
書き込まれた数字が16進数のままなので、hexで書き込む際に16進数を10進数に変換させました。
>>266 記事書き込みの処理部分でも書き込む値を16進数にしなければいけないということでしょうか?
>>264 投票した記事に点数は加算されず、存在する記事の一番上に加算され(NO3まであるとNo3に)
その一つ下の記事のログの、最初の二つ(この場合記事Noと名前($num<>$NAME<>))が消えて、表示の所でズレるんです。
(記事Noのところにコメントが入ったり)
投票する記事の指定ができていないと思います・・・投票のラジオのnameを$numにしているので、
No〜の記事の点数を変更するという指定はできないでしょうか?
問題ばかりですみません できる限り自分でやってみるつもりですがよろしくお願いします
270 :
デフォルトの名無しさん :2005/04/06(水) 11:31:59
この前偶然にもテレビに出てた小飼弾を見てしまった俺は必ずPerlハカーになれるはず
だよねー。あれ見たら自信付いちゃうよネ。
274 :
デフォルトの名無しさん :2005/04/06(水) 14:12:50 BE:47137627-#
nyで落とせ
それはイヤ
276 :
260 :2005/04/06(水) 14:47:41
すいませんが、また先生方に質問します。 AUの携帯用の絵文字対応の掲示板を作成しているのでが、 掲示板に、絵文字が入力された場合、16進の2バイトでperlにわたってきます。 それを絵文字の部分だけ検知して、[f0c0]のように変換することはできたのですが、 それを、さらにhtmlのタグに変換しようと、下記の置換文を作成したのですが、うまく動きません。 $value に”あいうえお+絵文字”のように絵文字が1つの場合には、タグに変換されるのですが ”あいうえ+絵文字+かきくけ+絵文字”のように絵文字が2つ以上になると、一番最後の絵文字しか 変換されません。全ての絵文字をタグに変換したいのですが、わかるかたおながいします 命令文 $value =~ s/\G((?:[\x80-\x9F\xE0-\xF5\xF8-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*) (\[[f][0-9][0-9a-fA-F][0-9a-fA-F]\])/$1.'<img localsrc="'.EMOGET($2).'" alt="0">'/ego; 参考 [\x80-\x9F\xE0-\xF5\xF8-\xFC][\x40-\x7E\x80-\xFC] → 2バイト文字 [\x00-\x7F] → ascii [\xA1-\xDF] → 半角かな [[f][0-9][0-9a-fA-F][0-9a-fA-F]\] → 絵文字を [f0ba]の形に変換したもの EMOGET($2) → 絵文字番号に変換するサブルーチン
>>269 おいおいおいおいおい、折角sprintfで固定長の16進数値にしたのに、
hexで戻して書き込んだら意味ないでしょw
要は、桁が増えてもバイト長が変わらなきゃファイルの途中で上書き出来るってことなのよ
278 :
260 :2005/04/06(水) 19:53:32
>>276 は他のやりかたで解決しますた
失礼すマスタ
最近のこのスレの進行スピードみてると、 なんだかPerlの廃れ具合が現れているような… 好きなんだけどな、Perl。
280 :
デフォルトの名無しさん :2005/04/07(木) 12:15:40
高い位置から人々の活動を見下ろして論評する超越者が現れました。
つまらん
>>280 うん、確かにそうだね。
ごめんね、単なるボヤキだからスルーしといて。
ま、これからはawkだよな。
aho好きです
UTF16で書かれたファイルを開いて、いろいろ処理するにはどうしたら いいのでしょうか? use open IN => ":utf-16"; と書くとファイルが開けなくなってしまいます。
環境を書くのを忘れました。 環境はWindows2000のアクティブパールの最新版を使っています。
>>279 なんとなくわかる
ここの所仕事でPHPやらされてるし
Perlって、VisualStudioバリの統合開発環境ないんですか?
>>283 > ま、これからはawkだよな。
最近awk使いまくりです。
Perl Factoryっていうのはどだろ。 メモリ食うわCPU時間食うわUTF8ファイル食わせるとエラー起こるから使ってないけどな。。 Visulaに食わせられるプラグインもあったけど、あれはどうなんだろ。
291 :
デフォルトの名無しさん :2005/04/07(木) 22:18:15
パールで配列を使うときに、配列の値からindexを見付ける方法ってありますか?
>>291 ~$ perl -e '@ar=qw(a b c d); print \@ar, "\n";'
ARRAY(0x10133cbc)
アドレス出てるじゃん。
293 :
デフォルトの名無しさん :2005/04/07(木) 22:43:14
配列内の特定の値が何番目か知りたいんですよ。
いったんハッシュにつっこんじゃうのは? @array = qw( boo foo woo ); %hash = map{$_, $i++} @array; print $hash{'foo'}; #=> 1
295 :
デフォルトの名無しさん :2005/04/07(木) 23:09:52
なるほど・・・。 やっぱり関数はないんですねぇ。 参考になりました。ありがとうございます。
>>294 何回もやるならハッシュ作る価値があるけど、一度だけとかなら
grepかなんかで頭から探した方が有利かも。
あと@hash{@array} = 0..$#arrayの方がたいていはやいよ。
>>291 パールでATMの扉をこじ開けるにはどうすればよいですか?
>>297 ニュースではいつも「バールのようなもの」とぼかして表現していますよね。
本当はバールでは開かないのかも知れません。
299 :
デフォルトの名無しさん :2005/04/08(金) 17:40:08
教えてください。 普通の掲示板の機能にアイコンをつけるのに <FONT SIZE=\"2\" COLOR=\"$icon!!ココガワカラナイ!!">$icon<FONT SIZE=(ry とあるのですがname=iconとかvulue=./icon/icon1.gifとかそういった事は出来ました。 解らないのが、ラジオボタンでチェックを入れるとvulueで指定したリンク画像を表示させる ということなのですが。 誰か教えてくれませんか?
300 :
デフォルトの名無しさん :2005/04/08(金) 17:42:16
あ。299ですが。 4行目の文はprint " <td valign=\"top\" nowrap> の続きです・・・ごめんなさい
302 :
デフォルトの名無しさん :2005/04/08(金) 17:44:12
あ。ごめんなさい・・・。 逝って来ます
303 :
デフォルトの名無しさん :2005/04/08(金) 22:10:46
ページAの送信ボタン(submit)を押して、返ってきたHTMLソースを受け取るやり方を 教えてください。 ページAのFORM部品や値はわかっています。 ページAのFORMに入力する内容は決まっているので、作業を自動化したのです。 宜しくお願いします。
305 :
デフォルトの名無しさん :2005/04/08(金) 22:28:50
@dir_list = getfile('/usr/local/share'); という感じで、ディレクトリを与えて、そのディレクトリにある ファイルのリストを取得できるモジュールはありませんか?
306 :
303 :2005/04/08(金) 22:37:12
>>304 携帯からなんでスマソ。
LWPで解決出来そうです。スレ汚してわるかた。
307 :
デフォルトの名無しさん :2005/04/08(金) 23:04:47
>>305 sub getfile {
my(@buf) = ();
opendir(DIR, $_[0]);
@buf = readdir(DIR);
closedir(DIR);
return(@buf);
}
くだらない質問ですいません。 SMTP、POP3、FTP、DNS、などのモジュールはNetクラスの サブクラスになっているのにHTTPだけはLWPなんですか?
>>310 なるほどLWPの中でNet::HTTPを使っているわけですね。
直にNet::HTTPを使ってる人って聞いたことないけど。
312 :
デフォルトの名無しさん :2005/04/10(日) 15:44:29
質問です。 File::Findを使用して、あるディレクトリ直下のすべてのファイルに対して ある処理をさせようとおもい、下のような感じで書いてみました。 $hogehoge = "."; find \&hoge,$hogehoge; sub hoge{ if(-f $File::Find::name){ なんか処理 }else{ ディレクトリなのでスルー } } ところがサブディレクトリ配下のファイルに対しては、-fの結果が すべて偽(1だっけ)となってしまいました。 e.g.) ./hoge/foo.txtはディレクトリと判定される -fはカレントディレクトリで使用すべきものなのでしょうか? もしその場合、何かうまい解決方法はないでしょうか?
じゃあファイルごとにカレント移動させりゃいいじゃん。
>>313 それではせっかくFile::Find::nameで相対パスがでてるのに
もったいないような気がします。それに移動してまたルートに
戻る分の処理が増えますしね。
俺、File::Findは使ったこと無いけど、今、perldocみてみた感じだと、 $File::Find::dirにchdirしてファイルの一覧を取得しつつ処理が進む ようなことが書いてあるね。(no_chdirオプションを指定しなければ) で、結論から言うと、 $File::Find::nameの代わりに、$_ を使うと うまくいくんじゃないかな? というふうに読めるけど。 ちょっとperldoc読んでごらんよ。
>>315 うまくいきました!
ついでにperldoc呼んでみます。
ありがとうございました。
って、優香、最初に読めよw
Tkの日本語表示で困ってます。WinXP, ActivePerl 5.8.6: 811, Tk 804.027です。 なぜかメニューの一段目(?)はSJISでないと表示されません。しかし、特定の文字群(?)が 使えないようなのです。例えば、下のスクリプトで、「ほげ」を「ツール」にすると、 「bad menu entry index ... Tk.pm line247.」と怒られてしまいます。 何かよい回避策はないものでしょうか? use Encode; # スクリプトはEUC use Jcode; use Tk; use strict; my $mw = MainWindow->new; my $mb = $mw->Menu(-type => 'menubar'); $mw->configure(-menu => $mb); my $c1 = $mb->cascade( -label => Jcode->new('ほげ','euc')->sjis, # ここが問題! -font => "system", ); $c1->cascade( -label => decode('euc-jp','二段目'), -font => 'system', ); $mw->Label( -text => decode('euc-jp','メニューの一段目以外はdecodeでOK'), -font => 'System' )->pack(); MainLoop;
319 :
デフォルトの名無しさん :2005/04/11(月) 03:34:43
perl6の最新情報が日本語で得られるページ、ないですか? あと、perl6はperl5のスクリプトは動かないと聞いたのですが、 そんな非道い話、ウソですよね?
320 :
デフォルトの名無しさん :2005/04/11(月) 04:17:10
perl以前に、無茶な話かもしれないのですが、 @state = ("$a == $b and $c != $d","$a == $c or $e eq $f" ) foreach $temp (@state){ if ($temp){ $sw = "on"; } } といった感じに、関係式を事前に用意しておいて、後からまとめて条件を 評価す方法はありますでしょうか? よろしくお願いします。
evalでできるんじゃない? 眠い、、、
>>320 my $f = eval 'sub{ ' . join(' or ', @state) . '}';
$sw = 'on' if $f->();
323 :
デフォルトの名無しさん :2005/04/11(月) 20:54:54
do 文でも行けるかな。
えぇけっしとるのぉ(*´Д`)ハァハァ うはっwwwおkwwwうえっwww??
4桁の数字に同じ数字が2つ以上含まれているようなものに マッチする正規表現を教えてください。
326 :
デフォルトの名無しさん :2005/04/11(月) 21:47:01
328 :
デフォルトの名無しさん :2005/04/11(月) 21:49:18
>>325 なかなか面白い問題を出してくれまね。
ちょっと考えてみま〜す
329 :
デフォルトの名無しさん :2005/04/11(月) 21:49:57
自己レス /(\d).*\1/ でできました。お騒がせしました。
>>330 それだと4ケタじゃない(11とか1234565とか)、数字だけじゃない(ab1cd1)
といった場合でもマッチするがそれでいいのか?
富豪的解法。 print "$_ => ", /^\d{4}\z/ && keys %{{ map { $_ , 1 } /./g }} < 4 ? 'ok.' : 'no', "\n" for @ARGV;
>>331 対象は数字4桁だけなんでこれでOKです。ありがとうございました。
遅かったか /(?=\d{4})\d*(\d)\d{0,2}\1/
Perlでの正規表現で 苗字,1 "名前A",3 "名前B",5 "名前C",7 "名前D" 例) 山田,1 "太郎",3 "ひろし",5 "浩二",7 "ほげ" これを苗字と名前だけを変数に代入したいのですが、スマートに書くにはどうすればよいのでしょうか?
>>335 補足です。
名前は複数います。数は1個以上確定。
苗字と名前に分けて抽出したい。
>>335-336 my $line = '山田,1 "太郎",3 "ひろし",5 "浩二",7 "ほげ"';
my($family) = $line =~ /^([^,]+)/;
my @name = $line =~ /\d+\s*"([^"]+)"/g;
print join ' / ', $family, @name;
>>335 なにが欲しいのかさっぱりわからん。せめてその例について
処理が終わったときなんという変数がどういう値になってる
ことを期待しているか明示してくれ。
>>338 あーごめん。
結果は
$family に 山田
@name に 太郎 ひろし 浩二 ほげ
になればOK
理解できました。ありがとうございます。
340 :
デフォルトの名無しさん :2005/04/12(火) 09:01:44
検索遅いのはマシンのせい?gonzuiのせい?
Tkモジュールで黒い窓が開かないようにする方法ってありますか?
Tkモジュールで社会の窓が開かないようにする方法ってありますか?
347 :
デフォルトの名無しさん :2005/04/14(木) 18:06:56
えーと、すみません、Perl5.8.6で、以下のスクリプトを実行しました。 use utf8; my($str) = "kasuテ"; test($str); sub test { my($tmp) = @_; my($offset) = 1; $len = length($tmp); for ($i = 0 ; $i <= $len ; $i++) { print substr($tmp, $offset, 2), "\n"; #substr A print substr($tmp, $offset, 1), "\n"; #substr B } }
348 :
デフォルトの名無しさん :2005/04/14(木) 18:07:19
>>347 の続きですが、これは、結果が、
as
a
...
と返ってくるはずが、
as
as
...
と返ってきます。
Substr Aをコメントアウトすると、正常に動きます。
また、$offsetを0か2にすると、やはり正常に動きます。
どうやら、LENGTHの異なるsubstrを、日本語の混在したUnicode文字列に対して、
複数回実行すると、なにか前のLENGTHが残ってしまうようです。
これって、私の環境だけの話でしょうか?
Win2000SP4上の、ActivePerl5.8.6での話です。
ActivePerl5.8.4では、正常に動いていました。
できれば、他の環境の方の検証キボンヌ。
>>347 うちはまだAcrivePerl 5.8.4.810 (WindowsXP SP2)で問題がない。
811入れるとおかしくなるってこと?
>>349 5.8.4だと問題なかったっす。
5.8.6だとおかしいんですよ。
回避策としては、LENGTHの違うsubstrを複数回やるときには、
同じ変数に対して実行しないで、変数を別の値に代入すると回避できました。
print substr($tmp, $offset, 2), "\n"; #substr A
$tmp2 = $tmp;
print substr($tmp2, $offset, 1), "\n"; #substr B
てな具合に。
$offsetが0とか2の時には正常に動くのが、なんとも。。。
>>347 をコピペで実行したけど問題無かったよ
This is perl, v5.8.6 built for MSWin32-x86-multi-thread
352 :
デフォルトの名無しさん :2005/04/14(木) 19:05:09
>>351 ありがとうございます。
確認してみましたが、あのままのコピペだと通りますね、確かに。
このスクリプトを、utf-8で保存しなおして実行してみてもらえますか?
或いは、use utf8;を取って、use encoding "cp932"と差替えていただくとか。
そうすると、再現するかと。
スクリプトをutf-8で書くときって、 use utf-8は宣言しますよね。。。 ちなみに、SJISやEUCで書いて、 use encoding ほげほげを外しても、 正常に動くみたいです。 use encodingすると動かなくなります。
print "hoge"; print("hoge"); どう違うんですか? また、どっちが正しいんですか?
おなじ どっちも正しい
356 :
349 :2005/04/14(木) 21:12:26
>>348 cygwinの5.8.6で、あなたと同じ症状の発症を確認。
併用することがあるんでちょっとこわいね。
>>354-355 ちなみに、どっちがおすすめですか、という質問に対しては、
あなたのお好きなようにどうぞ、というのがPerl回答。
ここ最近使い始めてみたんですが、 Perl言語 って素晴らしいですね。 設計がとても優れているのでしょうね。
>>358 > 設計がとても優れているのでしょうね。
いえ、行きあたりばったりです。
このあいだPerlの神と会ってきた。 ・・・やっぱ極めると凄まじいんだなぁ。格の違いを思い知らされた。
気に入らない人は Ruby に乗り換えてます
362 :
347 :2005/04/15(金) 08:28:43
>>356 確認ありがとうございます。
そうですか、やはり他の環境でも出るんですね。
他にも、どうも5.8.6は、少なくともActivePerlでは日本語処理が安定していない
(5.8.4だと出力時に問題ないのが、5.8.6では"wide character云々が出る)
感じがするので、5.8.4に戻しました。
>>358 オブジェクト指向もどきの部分なんて、すごく設計が優れてますよ
>>363 ちょちょいとサンプルを書いてもらえませんかね?
>>363 > オブジェクト指向もどきの部分なんて、すごく設計が優れてますよ
そうですよね!!
これを考えたやつは神だ!! と思いましたもん。
これを考えたやつは、乳母車を軌道投入することだってできる
に違いないと思いましたもん。
パッケージとモジュールとクラスの違いが良く分からないのですが教えて下され
おなじ 使い方によって呼ばれ方が違うだけ
ひとつのファイルの中に複数のモジュールを書けるのか?
370 :
デフォルトの名無しさん :2005/04/15(金) 19:07:55
>>366 > パッケージとモジュールとクラスの違いが良く分からないのですが教えて下され
Perlでは、クラスをパッケージを使って実装してある。
モジュールは、他のプログラムから利用されるプログラムを収めた
ファイル群のこと。
>>364 package A;
sub new {
$pkg = shift;
$data = {
"no1" => "";
}
bless $data, $pkg;
return $data;
}
sub setNo1 {
$pgk = shift;
$i = shift;
$pkg->{no1} = $i;
return $pkg;
}
-----------------------------
require A;
$test1 = A->new();
$test1->setNo1(1);
$test2 = A->new();
$test2->setNo1(2);
$test3 = A->new();
$test3->setNo1(3);
>>365 もどき・・・
軽くけなしたつもりなんだけど・・・
オブジェクト指向もどき部分なんて、無理な建て増しって感じ
>>373 乳母車を軌道投入って点でそれほど発言の意図に重大なすれ違いはないだろうから安心汁
376 :
デフォルトの名無しさん :2005/04/16(土) 04:11:36
lh7圧縮解凍するモジュールてどれ
気に入らない人は Ruby に乗り換えてます
378 :
デフォルトの名無しさん :2005/04/16(土) 09:05:48
質問です。 下記のソース中で、自作モジュールのSAMPLE.pmを使用してるのですが、 パッケージがmainからSAMPLEに変ると、 パッケージ名がSAMPLEのままになってしまいます。 標準モジュールのCGI.pmを使用するとこのような事はおこりません。 どこにその違いがあるのか、ご教授ください。 -------------------------------------- require "func.pl"; use SAMPLE; $u = new SAMPLE; $u->hoge(); &func_hoge(); # func.plの中に定義されているメソッド -------------------------------------- これを実行すると [Undefined subroutine &main::func_hoge called at ...] となってしまいます。 パッケージ名(名前空間)がSAMPLEになっているからと思われます。
379 :
デフォルトの名無しさん :2005/04/16(土) 09:21:49
380 :
デフォルトの名無しさん :2005/04/16(土) 10:30:06
>>379 返答ありがとうございます。
調べてみたのですが、分かりませんでした。
JAVAのキーワードのprotectedに相当するものという印象を受けました。
JAVAの感覚で言いますと
普通にインスタンスを作成してメンバ関数を使用する。
という操作しか、自分はしてないと感じるのですが、
それだけで、なんで呼び出し元の、
名前空間が呼び出し先のものになってしまうのか・・。
ご指摘のEXPORTを使用する意味を教えて頂けないでしょうか?
この順ならエラーにならないっていう意味か? require "func.pl"; &func_hoge(); # func.plの中に定義されているメソッド use SAMPLE; $u = new SAMPLE; $u->hoge();
383 :
デフォルトの名無しさん :2005/04/16(土) 11:54:35
>>381 返答ありがとうございます。
それでもエラーになりました。
推測ですが
どうもuseを使用すると、ソース中の記述より前にモジュールを読み込むようです。
ですので381さんが書いてくださったソースでも、
最初にSAMPLEモジュールが読まれ、
package名(名前空間)がSAMPLEになり、
その状態でrequireが実行されるので、
mainの名前空間にはfunc_hogeが読み込まれていないのだと思います。
384 :
デフォルトの名無しさん :2005/04/16(土) 12:16:41
>>383 じゃこれがOKになるってこと?
require "func.pl";
use SAMPLE;
&SAMPLE::func_hoge();
それと、これだけだとどうなの?
require "func.pl";
&func_hoge();
385 :
デフォルトの名無しさん :2005/04/16(土) 12:31:04
>>じゃこれがOKになるってこと? >>require "func.pl"; >>use SAMPLE; >>&SAMPLE::func_hoge(); はい、OKです。 require "func.pl"; &func_hoge(); これもOKです。 ただ、できれば以下のように、インスタンスのようなイメージで使用したいのですが・・。 $u = new SAMPLE; $u->hoge();
func.plの中でmain以外のpackageを宣言してるのでは? それかfunc_hogeが定義されてないだけとか。
ああ…時間差…orz 取り敢えずnew()が怪しいな。
388 :
デフォルトの名無しさん :2005/04/16(土) 12:39:54
>>386 いえ、packageの宣言はSAMPLE内での一箇所のみです。
389 :
デフォルトの名無しさん :2005/04/16(土) 12:49:08
>>388 SAMPLEの中でもrequireしてるとそうなるようだが。
理由はよくわからん
390 :
デフォルトの名無しさん :2005/04/16(土) 13:05:40
返答ありがとうございます。
>>387 new()の内容は以下の通りです。
sub new{
my $class = shift;
my $self = {};
bless $self,$class;
return $self;
}
>>389 私の方でもSAMPLEの中からrequireを削った処、
期待通りの動作をしました。
ありがとうございます。
なぜでしょうかね・・。
requireが対象のファイルに対して一度しか実行されないからじゃない? SAMPLE内で呼び出されれば、そのパッケージにシンボルが登録されるからね。 バグって言うより仕様だね。 まあ、普通なら既に別のパッケージに読み込まれていたとしても 自動的にシンボルをインポートする様にすべきだろうけど。 次のバージョンに期待。
× bless $self, $class; return $self; ○ my $ref = bless $self, $class; return $ref;
>>381 以下のコードはちゃんと動くよ。
-- file: func.pl
#!/usr/bin/perl
sub func { print "this is func.\n"; }
1;
-- file: Sample.pm
package Sample;
sub new { return bless {}, shift; }
sub hoge { print "hoge is hoge\n"; }
1;
-- file: do.pl
#!/usr/bin/perl
require "func.pl";
use Sample;
my $u = new Sample;
$u->hoge();
&func();
たぶんtypoしてエラーになってたのと
>>392 の間違いを混同したんでしょう。
394 :
デフォルトの名無しさん :2005/04/16(土) 18:40:09
>>393 だからそのSample.pmでもrequire "func.pl"; してたってことだろ。
func.plもちゃんとpackage宣言して、必要ならシンボルをexportする。
>>382 substrが爆弾か。ちと気にしとこ。
398 :
デフォルトの名無しさん :2005/04/17(日) 09:38:29
みなさん、返答ありがとうございます。 >>だからそのSample.pmでもrequire "func.pl"; してたってことだろ。 その通りです。 391さんのおっしゃった内容が直接の原因かと思います。 ですので395,396さんのおっしゃったようにすべてuseで読み込むように 変更しようと思います。 ありがとうございました。
すいません今日PERL始めた初心者なんですが、ちょっと質問させてください。 $○○○[$○○○]{△△△} = $□□□ $○○○++; という構文はありえますか?いずれの変数、ハッシュ、配列なども事前に定義されていません。 ありえるとするなら、どういう構造なんでしょうか? 主に一行目のハッシュなんだか配列なんだかよくわからないモノについて聞きたいのですが。
>>399 一週間勉強してそれからもう一度聞きに来てね。
がんばって。
402 :
デフォルトの名無しさん :2005/04/20(水) 00:49:46
「/」を置換したいんですがs///\//g;じゃ効きません 文字コードはUTF-8です よろしくお願いします
>>402 --------------------------
use utf8;
use encoding "cp932";
$tmp = "変/換/す/る/よ";
$tmp =~ s///\//g;
print "$tmp\n";
--------------------------
ActivePerl5.8.4で問題なく動きますが。
404 :
347 :2005/04/20(水) 16:43:01
>>382 ありがとうございます。perl583deltaに記載があったんですね。
そこまで遡らなかった。。。
>Using substr() on a UTF8 string could cause subsequent accesses on that string to return garbage.
>This was due to incorrect UTF8 offsets being cached, and is now fixed.
まさにこれですね。
5.8.6やばし。
BerkeleyDB.pm は 0.17 で Added txn_discard をということになってるらしいのだけど、 0.26 のソースには txn_discard は見あたらない。 使っちゃダメなの?それともバグ?
407 :
405 :2005/04/20(水) 21:57:05
>>406 うん。xsには入ってるけど、perlのインターフェースが提供されてないです。
いや、あるって。
409 :
405 :2005/04/20(水) 23:07:28
>>409 おかしいな。確かにないようだ。バグっぽいな。
_txn_discard()はあるので、他のtxn_*同様に定義して使ってみたらどうだ?
411 :
405 :2005/04/20(水) 23:56:28
>>410 とりあえず定義してみたら一応動いてるみたい。
0.26がリリースされてしばらく経つけど txn_discard て普通使わないで
txn_abort するだけなんだろうか。
大阪の地下鉄突き落とし犯人、一瞬マサカあの人と思ったがw
413 :
デフォルトの名無しさん :2005/04/21(木) 23:00:39
コード中の5と数字を8に8という数字を5にしたいんけど、どうやるん? 置換2回で元に戻るw
415 :
デフォルトの名無しさん :2005/04/21(木) 23:09:19
あそうかsばかり考えてた。 じゃorangeをappleにappleをorangeに換えるのは tr/orange/apple/; でいいの?
それは s 。
417 :
デフォルトの名無しさん :2005/04/21(木) 23:14:49
置換2回で元に戻っちまうけど
ああごめん、嘘だった。
s/orange/banana/g; s/apple/orange/g; s/banana/apple/g;
>>415 my %table = (orange => 'apple', apple => 'orange');
my $re = join '|', keys %table;
$str =~ s/($re)/$table{$1}/g;
421 :
デフォルトの名無しさん :2005/04/21(木) 23:59:06
頭イイネェ
>>420 Perl Ideiom集みたいのがあったらそれ掲載候補だね。
マッチしたらサブルーチンで置換とか結構やらないか?
425 :
422 :2005/04/22(金) 01:41:25
>>423 料理本にゃそれ載ってないと思ったが。
このスレで何度も同じ質問がある。
。゜θ゙゙ ヴイィィィィン! (*'∀`)ノ 人_',ヘヘ)
427 :
347 :2005/04/22(金) 09:51:51
えーと、
>>347-348 で書いた、5.8.6のsubstrの問題ですが、
[email protected] にメールしておいたところ、
[perl #34976] substr uses utf8 length cache incorrectly
で受け付けてくれて、今日、ソースを直してresolveしたよ、と、
ソースの修正部分と、substr.tへの追加部分を添付したメールが来ました。
ActivePerl固有の問題ということではないようです。
で、次のバージョンでは恐らく直っている、と思います。
初心者申し訳ないですが、教えてください。 UNIXシェルスクリプトから、perlスクリプトをコールして、戻り値を シェルで受け取りたいのですが、 perlで”文字列”を返す方法が分かりません。 exit $文字列; で文字列返しても、上位で参照すると、数値になってしまいます。
>>428 exit で返すのはステータスコード。
標準出力に吐くのは print 。
$ cat test.sh test.p
#!/bin/sh
rv=`./test.p`
echo 'foo' $rv 'baz'
#!/usr/local/bin/perl
print 'bar';
exit;
$ ./test.sh
foo bar baz
>>429 イメージですと、
# 変数=XXXX.pl
のようなかたちで、上位のシェルで変数にリターンされた文字列を
代入できるのかなと考えていたのですが、
XXXX.plにて返したい文字列をprint;にて標準に出力し、
# 変数=`XXXX.pl`
のように入力するようにでしか文字列を返せないということですね。
回答ありがとうございました。
なんで Makefile.pl じゃなくて Makefile.PL なんだろう?
>>433 最近流行の拡張子広告だな。
スポンサーがPL学園だったけ。
435 :
デフォルトの名無しさん :2005/04/22(金) 17:26:32
終わらない春休み
436 :
デフォルトの名無しさん :2005/04/22(金) 20:30:55
学校の先生が『Apachを使え!』っていっていたのですが、 『AN HTTPD』というウェブサーバではダメなのでしょうか。 Apachを使うメリットってなんなのでしょうか。 よろしくお願いします。
437 :
デフォルトの名無しさん :2005/04/22(金) 20:36:46
CPANのWWW::Mechanizeのフォームに作用するメソッドについて質問があります。 フォームへの送信を行なうのに、下記のメソッドがあると知りました。 submit() click($button[,$x,$y]) click_button(...) @ submit()は、ボタンクリックを模倣せず、残り二つのメソッドは フォームボタンのクリックを行なう、との説明を読みました。 この説明は本当でしょうか? A サーバーへリクエストを要求する際に、フォームボタンクリックを 擬似的に再現する方法としない方法がもし、あるのでしたら その実装上の差異はどのようなものなのでしょうか? ご教示のほど、よろしくお願い致します。
>>436 mod_perlが使える。
mod_rewriteが使える。
俺が感じるのApacheのメリットはこの二つだな。
439 :
デフォルトの名無しさん :2005/04/22(金) 22:28:12
俺はこう思う。 AN HTTPDはWindowsでしか運用できない。 これこそが最大の欠点だと思う。
440 :
デフォルトの名無しさん :2005/04/22(金) 22:40:15
みんなAN HTTPDを使っている企業見たことある?
俺の関係した会社のサーバって全てIISかapachだったよ。
なんか問題あるんじゃないのかな?
ってことで一応IISかapachを覚えておいた方がいい気がします
>>436
apacheだ!
そりゃ、AN HTTPDじゃ安全性が担保できないからな。 IISは売り物なのでいざとなったら責任転嫁できるし、 apacheはソースが公開されてるので検証可能だし、世界中で検証されてる。 でもAN HTTPDじゃ、そのどちらも不可能。 なので、トロイの木馬機能が潜まされてる可能性などは排除できない。 となれば、自動的に選択肢から消える。
アパッチェ
444 :
436 :2005/04/22(金) 22:58:37
みんなサンクス!
Perlは何で出来てるんですか? やっぱCですか? するとバッファオーバーフローのような 脆弱性もあるんでしょうか。
てゆうか、その前にanhttpdで実行されたCGIの権限が。。
447 :
デフォルトの名無しさん :2005/04/22(金) 23:28:12
>anhttpdで実行されたCGIの権限 え、まだ他にもanhttpdに問題があるんですか? >446
448 :
デフォルトの名無しさん :2005/04/22(金) 23:38:09
さぁそろそろスレ違いなので移動して頂こうか
449 :
デフォルトの名無しさん :2005/04/23(土) 00:02:22
たかが一個人のWinフリーソフト鯖なんぞ誰が使うかボケ
>>445 C
Cによるアプリケーションにに限らず、どんなソフトウェアでも脆弱性は必ずある
451 :
デフォルトの名無しさん :2005/04/23(土) 09:53:24
Perlで簡単に全角半角の変換をするモジュールは無いでしょうか?
php の場合、mb-convert-kana
http://php.s3.to/man/function.mb-convert-kana.html で簡単にできるのですが、Jcode.pm は全角英数記号の変換が出来ないようです。
123:123:アイウ:アイウabcabc!”#$%&’()
↓
123:123:アイウ:アイウabcabc!"#$%&'()
のようにしたいのです。
Jcode.pm を使って、
print jcode($str)->z2h
すると、
123:123:アイウ:アイウabcabc!”#$%&’()
となってしまいます。
php だと
mb_convert_kana($str, "aKV");
だけで簡単にできるのですが.....
自分で作った方が早そう
半角の記号なんて数は知れてるのでJcode.pmのtr使えば あっという間に作れるだろう
いわゆる「半角カタカナ」には Encode::JP::H2Z があるのに、 なんで記号とか数字のためのモジュールは無いんだろう。
foo1 を bar1 としたいのですが、次のコードだと 正しく変換できません。 変数中の $1 を有効にする方法どなたか分かりませんか? $tmp="foo1"; $a="foo([0-9])"; $b="bar$1"; $tmp =~ s/$a/$b/g;
< $a="foo([0-9])"; ---- > $a = "foo1"; > $a =~ "foo([0-9])"; ではどうか。
ごめん勘違いした。こういうこと? $b="bar\$1";
$b="bar\$1"; だと bar1 ではなく bar$1 に なってしまうんです。
>>451 Perl はこのへんの日本語処理が面倒だから素直に PHP 使っとけ。
>>455 $tmp="foo1";
$a="foo([0-9])";
$b='"bar$1"';
$tmp =~ s/$a/$b/eeg;
>>454 Perl使いは自分で車輪作るのが好きだから。
「この程度の車輪なら自分で作った方が早そう」
「車輪なんてあっという間に作れるだろう」
だからみんな Perl じゃなくて PHPを使うんだよ
>>454 マジレスすると、半角カナはISO-2022-JPで表現できないため
互換性の問題が生じる恐れがあり、対策しておく必要があるが
記号や数字はそうではないから。
日本語おかしいぞ
use Encode; use Unicode::Normalize;
466 :
デフォルトの名無しさん :2005/04/24(日) 21:22:30
s/hogehoge//g hogehogeの部分に/が含まれる場合どうすればいいのでしょうか?
468 :
デフォルトの名無しさん :2005/04/24(日) 21:46:04
470 :
デフォルトの名無しさん :2005/04/24(日) 23:08:36
Attribute::Handlers を使っているのですが、 ハンドラが呼び出されたとき、ハンドラ側でシンボル名を知ることは出来ないでしょうか? 例えば、 sub UNKO :ATTR(CODE) {ここで、} sub manko :UNKO {...} のシンボル名 "manko" を受け取りたいのですが。
471 :
デフォルトの名無しさん :2005/04/24(日) 23:45:47
あっ、型グロブへのリファレンスでも良しです。
>>472 違うけれどかなりどきっとしていました(苦笑)
香奈問題、何かいぃ方法無いかなぁ。。。
>>473 にせものさんお疲れですー♪
そういえば、最近未承諾広告※って見かけなくなったなあ。
>>471 perldoc Attribute::Handlers しる。$_[1] が GLOB。
ただし、ATTR(CODE,BEGIN) の時は __ANON__ への GLOB になるので注意。
(´-`)。oO(…これが地味に不便なんだよなぁ…)
(CODE,CHECK) でもグロブになりませぬ…。 少しソースを覗いてみたのですが、 確かにグロブを検索してくれてる様です。 しかしこれぐらいの処理なら直ぐ書けそうなので、 なんとかなりそうです。 ご返答有り難う御座いました。
>>477 はて。CHECK フェイズでも GLOB になると思うが。
use strict;
use warnings;
use Attribute::Handlers;
sub TEST : ATTR(CODE,BEGIN,CHECK,INIT,END) { print $_[-1] . ': ' . $_[1] . "\n" }
sub foo : TEST {}
試しに Attribute::Handlers に手加えてみたけど、BEGIN で簡単に GLOB を得れそうにないねぇ。
Attribute::Handlers::Prospective は Filter 使ってるからイケそうな気がする。
479 :
デフォルトの名無しさん :2005/04/25(月) 17:36:30
>>478 さん
どうも、原因が分かりました。
Attribute::Handlerは、シンボル名(+タイプ)ごとにハッシュでハンドラを管理している為、
例えば
sub unko :CHINKO {}
sub unko :MANKO {}
とすると後に出てきた :MANKO のみ呼び出されることになります。
お騒がせ致しました。本当に有難う御座いました。
すみません、ageてしまいました・・・
しかも説明間違ってました。忘れてください。
>>479 sub unko : CHINKO MANKO {}
sub unko : CHINKO : MANKO {}
(´-`)。oO(…しかし嫌な例だな…)
CGI記念カキコ
しまった、この板ID出なかったのか・・・orz
486 :
デフォルトの名無しさん :2005/04/26(火) 19:38:15
windows上でperl使う場合って、 cygwin のと activeperl どっちが安定してるの?
WindowsならActivePerlで問題ないでしょ。 PPMもあることだし。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 こりゃ、ちと乱暴すぎやしないかい?
Webprog板の方のスレ結構面白いぞ(笑)
頭痛くなるから見たくないw
目糞鼻糞
492 :
デフォルトの名無しさん :2005/04/28(木) 18:51:32
Webクライアントとなり持続セッションCookiの受け取りや保存と POSTを簡単に処理できるモジュールを探しているのですが できれば1.1で差分ゲットできるものをおねがいします
うぜー
>>492 Socket
HTTPコマンドは自分で発行しろや
495 :
デフォルトの名無しさん :2005/04/29(金) 06:28:36
old macでファイル操作(書き換え)のために perlを使いたいのですが, ドラッグ・ドロップ対応のインターフェースはどうやって書いたらいいですか?
496 :
デフォルトの名無しさん :2005/04/29(金) 06:42:48
>>495 MacJperlを入れればアホウでないかぎりわかる。
アホウなら、MacPerlという本を立ち読み。
Hash のリファレンスのリスト返すサブルーチンについて質問します たとえば、 sub read_data{ my ( %name2tel, \%name2addr ) = (); #いろいろ読み込み return [ \%name2tel, \%name2addr ]; } のような関数に対し、 ( \%name2tel, \%name2addr ) = read_data( $data_file ); とやると Can't modify reference constructor in list assignment とのエラーが出てしまいます。 以下のように一度配列として受け取って、デリファレンスすると正常にいくのですが、冗長な感じがします。 my @AoH = read_data( $data_file ); %name2tel = %{ $AoH[0] }; %name2addr = %{ $AoH[1] }; Hash のリストを受け取る良い方法はないでしょうか?
return [ \%name2tel, \%name2addr ]; を return ( \%name2tel, \%name2addr ); として ( \%name2tel, \%name2addr ) = read_data( $data_file ); を ( $name2tel, $name2addr ) = read_data( $data_file ); とするとか。
>>498 > return [ \%name2tel, \%name2addr ];
> を
> return ( \%name2tel, \%name2addr );
> として
だけで出来ましたよ。
500 :
497 :2005/05/02(月) 02:20:22
>>498 ごめんなさい。return の部分が [] となっていたのは間違いです。
( いろいろ試して戻しわすれてしまいました )
確かに
( $name2tel, $name2addr ) = read_data();
とすれば OK なのは理解できます( 最初の例でも @AoH で受け取ってます )
実は、%name2addr 等を使用する部分は先に完成していているのです。
いろいろなファイルから読み込む必要が出来て、読み込み部分をサブルーチン化しようとしているのです。
しかし、こうしてしまうとたとえば、
print $_, "\t", $name2tel{ $_ } for keys %name2tel ;
↓
print $_, "\t", $name2tel->{ $_ } for keys %{ $name2tel };
のような修正が必要となってしまいます。
修正しないですむようにするには、dereference して
%name2tel = %{ $name2tel };
%name2addr = %{ $name2addr };
のようにすればいい。
でも、これだと変数が Hash のリファレンスなのか、Hash なのかごちゃごちゃしそう。
ということで、最初に書いたように 一度、@AoH のような テンポラリの変数に読み込んで
@AoH = read_data();
%name2tel = %{ $AoH[0] };
%name2addr = %{ $AoH[1] };
としたのです。
(つづく)
501 :
497 :2005/05/02(月) 02:21:19
例では Hash は2つですが、実際には10個近い Hash を返します。 毎回毎回、; ( @AoH ) = read_data(); %name2tel = %{ $AoH[0] }; %name2addr = %{ $AoH[1] }; ...以下8行 を書くのはなんかサブルーチンの意味が無いような気がするので、もうちょっとスマートに書けないか?; と思ったのです。 最初の設計がまずかったのでしょうけど....;
502 :
497 :2005/05/02(月) 02:23:00
>>499 こちらでは出来ませんでした。
処理系にもよるのでしょうか?
Windows の ActivePerl の Binary build 638 で試験しているのですが...
ハッシュのリファレンスを引数にしては? read_data(\%name2tel, \%name2addr); # こんな感じ もしくは、 no strict "refs"; local our (%name2tel, %name2addr); (*name2tel, *name2addr) = read_data(); オススメ出来ないけど。
>>500 を!!!
ナイスアイデアです。
すばらしい!
ハッシュのリファレンスを引数にします。
ありがとうございました。
(リファレンスの使い方が何となく苦手なので....勉強しないと....)
505 :
497 :2005/05/02(月) 02:37:09
504 = 497 です
勘違いかもしれないが、変数名を見る限りハッシュのキーは共通っぽいけど、 もしそうだったらあえてリファレンスを2つ返す必要はないんじゃないか? $data->{NAME} = [tel, addr] とか $data->{NAME} = (TEL=>tel, ADDR=>addr); みたいな。 勘違いだったらスマソ
$data->{name} = [tel, addr] $data->{name} = {TEL=>tel, ADDR=>addr} か。
508 :
デフォルトの名無しさん :2005/05/03(火) 10:01:26
教えて下さい。 パケットが0116 10のときは my $r_socket = shift; my $index = shift; my $amount = shift; my $msg = pack("C*", 0x16, 0x01) . pack("S*", 0, $index, 0. $amount); encrypt($r_socket, $msg); となるので パケットが00A2 7のときは my $r_socket = shift; my $index = shift; my $amount = shift; my $msg = pack("C*", 0xA2, 0x00) . pack("S*", $index, $amount); encrypt($r_socket, $msg); こうなると思うのですが動きません。。。 どこか間違っているんでしょうか?
>>508 > どこか間違っているんでしょうか?
少なくとも、質問のしかたが間違っている。
小包のようなもの
書くのもレスるのも黄金厨か・・・
MySQL導入して遊ぼうと思っている者ですが、 コマンドのサニタイズは自分で行う物なのでしょうか?(HTML等と同様に)
>>513 回答側はまったく問題無い。
質問が馬鹿すぎる。
>>514 意味が分からん。「prepared statement 使いなさい」とかそういう話?
517 :
514 :2005/05/04(水) 18:30:27
SQL始めたばっかなんで良く分からないんですよね・・・すみません
518 :
514 :2005/05/05(木) 01:56:12
なんかquoteっぽいんですけど、バイナリデータの場合はどうするんでしょう?
519 :
514 :2005/05/05(木) 02:00:09
すみません事故怪傑しました
use Encode qw(encode decode); $buf = '日本'; $buf2 = encode('utf-8', $buf); print decode('shiftjis', $buf2); ってやったら画面上に 日本 と出力されるのを期待してたんですが、 Wide character in print at 〜 と出てきてどうすればいいのか分かりません 教えて下さい
取りあえずエンコードとデコードの意味について調べてきて下さい。 use Encode qw(encode decode); $buf = '日本'; print encode('shiftjis', $buf);
522 :
デフォルトの名無しさん :2005/05/05(木) 10:14:49
自動で文字コード判別して変換してくれるんじゃなかったんですか。。。 今from_to使ってます
> 自動で文字コード判別して変換してくれるんじゃなかったんですか。。。 Encode::Guess。 文字コードは世界中に数多あるので、誤認識を避けるために変換と判別は別モジュールにするのが基本。 Jcode みたいに特定の文字コード(日本語)限定にするんならデフォで自動判別でもイイんだけどな。
524 :
デフォルトの名無しさん :2005/05/05(木) 14:07:25
すみませんありがとうございます。 サンプルコードみたいなの無いでしょうかn
perldoc Encode::Guess
526 :
デフォルトの名無しさん :2005/05/05(木) 14:31:14
ども
527 :
デフォルトの名無しさん :2005/05/05(木) 14:39:57
気持ち悪い…
529 :
デフォルトの名無しさん :2005/05/05(木) 14:58:28
530 :
デフォルトの名無しさん :2005/05/05(木) 22:59:20
スクリプトを実行しないで、文法だけチェックしてくれる ようなツールってないでしょうか?
test
s/ABC/&routine()/; とかやって、変換文字列を&routineの戻り値にしたいのですが、どうもうまく行きません どなたか方法をご存知の方はいらっしゃらないでしょうか
質問お願いします。 Cのscanfみたいなのはないでしょうか? <stdin>だと実行直後に入力を求められるので 文章を表示させてから入力を求めるスクリプトが作れません。 どなたか、教えてください。
>>536 つ[ バッファをフラッシュ ]
つ[ $|=1; ]
>>537 おお、できました!
ありがとうございます。
539 :
デフォルトの名無しさん :2005/05/07(土) 09:29:17
requireの使い方についてですけどrequireで取り込むファイルって下記のように変数にして 扱うのはエラーの原因になるんでしょうか? $pl_file="../aaa/test.pl"; require $pl_file;
>>539 値が同じなら文字列リテラルであろうが
変数だろうが複雑な式だろうが変わらない。
確かめればいいのではないかと思うんだな。
542 :
漏れはRuby使うが :2005/05/07(土) 15:44:40
Perl5のいいところって、クラス定義するのがトリック的なことで めんどくさいから、逆にホントにOOの機能が欲しいところじゃないと あえてクラス定義しない方針になるってことだな。 つまり、アクセサだらけの無意味なクラスを定義する愚をやらずに済む。 これやると、スクリプト言語ならまだしも、Javaとかになると致命的にメンテナンス性悪くなる。 Perlなら、データは全てハッシュ型でやれってことになっていて、逆にコードの意図が明確 になる。
543 :
デフォルトの名無しさん :2005/05/07(土) 15:46:04
でもまぁ、気軽にクラス定義したほうが、最終的には生産性高いと思うんだよね。 メソッド気軽に追加できるし、安易にクラス定義することでメンテナンスしずらくなる なんてことは、シンプルに設計していれば、ありえない。
ruby は Kernel モジュールがあるということと、syntax が気に入らない。
>>544 後者同意。構文はC言語風にして欲しかった。
Kernelモジュールがいらないってことは、
ビルトイン関数は別クラス(かモジュール)に追い出せってこと?
それなら同意。
C構文厨ウザ。
構文なんて飾りです。偉い人にはそれがわからんのです。
>>545 > ビルトイン関数は別クラス(かモジュール)に追い出せってこと?
もちろん。
組み込み変数も何らかのクラスやモジュールにに追い出して、
コンソールから -e した時しか使えないようにすれば良かったのに、とか。
>>546 C like な構文じゃなくても良いけど、ALGOL 譲りのあの構文は読み辛いよ。
エディタのハイライト機能使ったり色々してみたけど、結局どうしても我慢できずに Ruby はやめた。
> 構文なんて飾りです。偉い人にはそれがわからんのです。 その割には教祖の日記を見ると、「あれの構文がピンと来ない」とか「あの構文は嫌だ」とか 他の言語をさかんにけなしてるよな。表面的な字面の話ばっかりで、理論的な側面ゼロ。 オレはそんな言語使うのはヤダ。(そもそもバグ多いしすげー不安定だし)
あとRubyは驚愕度が高いっつーか直感的じゃないことが多いよな。 こんなのは確かに慣れちゃえばいいんだけど、それをさも当然のように したり顔で指摘したりするユーザ層が嫌。
>>550 驚愕度はPerlのほうがはるかに上だろう。
Rubyは他の言語と同様、単に融通が利かないだけの話。
> あとRubyは驚愕度が高いっつーか直感的じゃないことが多いよな。 それでいてモットーが "based on the principle of less surprise" だから笑えるよ。
すれ違い
554 :
perl初心者 :2005/05/09(月) 19:10:10
いま解析しているPG(カートシステム)で以下のような部分がありました。 コメントに『データを受け取る』とあるのですが、 私の持っている本ではこれは『配列の初期化』と載っています。 これでデータの受け渡しが可能なのでしょうか。 よろしくお願いいたします。 #データを受け取る %param = ();
>>554 そこだけ見せられてもなんとも答えようがないと思います。
きっとそのあとに実際にデータを受け取る処理があるのではないでしょうか。
556 :
perl初心者 :2005/05/09(月) 19:56:42
>きっとそのあとに実際にデータを受け取る処理があるのではないでしょうか。 そうですよね、 %param = (); だけでデータがparamに入るわけないですよね。
ReadParse(\%param); とかある予感
>>556 > >きっとそのあとに実際にデータを受け取る処理があるのではないでしょうか。
> そうですよね、
だったら、もう少しプログラムを読んでから尋ねてください。
一行見ただけで質問されても困ります。
すいません、メッセンジャー用のbotツールを常駐させているんですが、 動画やゲーム、それにATOKの文字変換などがたまらなく遅いです…。 ためしにタスクマネージャのプロセスを見るとperl.exeがCPUを99とか使ってます。 変な質問かも知れませんが、何かperlのスクリプトとその他のシステムとの 動作を別々に使い分ける方法とかないものでしょうか。 単一のPC上で。 エミュレーター、とか使っても意味ないっていうか余計遅いでしょうし…。 OSはXP、perlは最新のActivePerlを入れてます。 どなたかアドバイスなどよろしくおねがします。
もっとまともなツールをつかえ。
perlexeの優先度を下げろ。
>>561 低にしてみたら大分マシになりました…
ありがとうございます。
563 :
デフォルトの名無しさん :2005/05/09(月) 22:21:25
\ / ・ \ / ;(●)llll((●); (●)(●)(●)(●) \__ (●)(●)●)●)(●)__/ カサカサ (●)(●)(●)(●)(●) __(●)(●)((●)((●)(●)__ / (●)(●)(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)_ / (●)(●)(●)(●)(●)(●) \ _(●)(●)●)(●)(●)(●)_ / (l●)(●)(●)(●)(●l;) \ | . (l;●)(●)(●)(●)(●) | | . (0●)(●)(●)(●)O) |. カサカサ ,;; (:●)●)(●)(●;) 。 (о●)(●)●0) ( ;●ξ●:) 。 ・
\ / ・ \ / ;(●)llll((●); (●)(●)(●)(●) \__ (●)(●)●)●)(●)__/ カサカサ (●)(●)(●)(●)(●) __(●)(●)((●)((●)(●)__ / (●)(●)(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)_ / (●)(●)(●)(●)(●)(●) \ _(●)(●)●)(●)(●)(●)_ / (l●)(●)(●)(●)(●l;) \ | . (l;●)(●)(●)(●)(●) | | . (0●)(●)(●)(●)O) |. カサカサ ,;; (:●)●)(●)(●;) 。 (о●)(●)●0) ( ;●ξ●:) 。 ・
\ / ・ \ / ;(●)llll((●); (●)(●)(●)(●) \__ (●)(●)●)●)(●)__/ カサカサ (●)(●)(●)(●)(●) __(●)(●)((●)((●)(●)__ / (●)(●)(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)_ / (●)(●)(●)(●)(●)(●) \ _(●)(●)●)(●)(●)(●)_ / (l●)(●)(●)(●)(●l;) \ | . (l;●)(●)(●)(●)(●) | | . (0●)(●)(●)(●)O) |. カサカサ ,;; (:●)●)(●)(●;) 。 (о●)(●)●0) ( ;●ξ●:) 。 ・
\ / ・ \ / ;(●)llll((●); (●)(●)(●)(●) \__ (●)(●)●)●)(●)__/ カサカサ (●)(●)(●)(●)(●) __(●)(●)((●)((●)(●)__ / (●)(●)(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)_ / (●)(●)(●)(●)(●)(●) \ _(●)(●)●)(●)(●)(●)_ / (l●)(●)(●)(●)(●l;) \ | . (l;●)(●)(●)(●)(●) | | . (0●)(●)(●)(●)O) |. カサカサ ,;; (:●)●)(●)(●;) 。 (о●)(●)●0) ( ;●ξ●:) 。 ・
\ / ・ \ / ;(●)llll((●); (●)(●)(●)(●) \__ (●)(●)●)●)(●)__/ カサカサ (●)(●)(●)(●)(●) __(●)(●)((●)((●)(●)__ / (●)(●)(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)_ / (●)(●)(●)(●)(●)(●) \ _(●)(●)●)(●)(●)(●)_ / (l●)(●)(●)(●)(●l;) \ | . (l;●)(●)(●)(●)(●) | | . (0●)(●)(●)(●)O) |. カサカサ ,;; (:●)●)(●)(●;) 。 (о●)(●)●0) ( ;●ξ●:) 。 ・
568 :
デフォルトの名無しさん :2005/05/10(火) 04:50:47
cgi-binの中のperlスクリプトから ドキュメントルート(.../public_html)以外のディレクトリ内にあるファイルを 読み込もうとすると、サーバーエラーが出てしまいます。 残念ながらerror.logはみれない環境なのです。 次のいずれかでもエラーです 1) open IN, "./hoge/hoge.html" 2) $path = $ENV{'DOCUMENT_ROOT'}."hoge/hoge.html"; open IN, "$path" パーミッションは hogeディレクトリ=755 hoge.html=644 です カレントディレクトリ以外のアクセスが拒否される要因は、 なにかありますでしょうか? サーバーはFreeBSD4.7です。
569 :
568 :2005/05/10(火) 04:55:48
568ですが、 わかりにくくてすみません。 ドキュメントルート=...public_html=カレントディレクトリです。 ディレクトリ構成は、 public_html |_ cgi-bin です perlスクリプトを起動直後のカレントはcgi-binですので、 直に chdir "../"; しています。(するとカレントはpublic_htmlに移ります) その後、openしています( 568の記述の1) 2)の方法で )。
error.logは見れなくても
>>1 は見れる環境だろ。ハゲ
ディレクトリにファイルが大量にあり、中のテキストを以下のように置換したいと思います。 AAA.html というファイルがあるとき、 AAA.JPG → THUM_AAA.JPG ABC.htmlのときは ABC.JPG → THUM_ABC.JPG perl -i を使ってやれば、それっぽいことを出来ることが判ってきました。しかし、この方法では 決めうちの文字列しか置換出来ません。 perl -i -p -e 's/AAA.JPG/THUM_AAA.JPG/' *.html 置換する対象と置換後の文字列はそのとき開いているファイル名を入れたいのですが、 そのとき開いているファイル名を指定することはできますでしょうか?
573 :
571 :2005/05/10(火) 18:27:51
>>572 ラクダ本のリファレンスに、
$ARGV 現在<>から入力中のファイル名
とありました。これでいけそうです。
ありがとうございました!
>>568 #!/usr/bin/perl
#以下ソースコード
上を下のように書き直せばエラーの内容を見れるから
後は、WEBプログラミング板で質問して
#!/usr/bin/perl
eval join"",<DATA>;
print "Conten-Type: text/plain\n\n$@";
__END__
#以下ソースコード
>>576 > 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、
> 何もしません。 関数名に続けて括弧付きの式を書く場合に、
> 関数の引数リストと解釈されないようにするために用いることができます。
無事分かりました。ありがとうございました。
本を見ながらなんとかやっている初心者です。 @aaa = ("5","10","3","7");とかある時に、その中で一番小さいのを取り出すために、 foreach (sort(@aaa)) { $a_small = $_; last; } とかしているんですが、もっと良い方法が有ると思うのですが・・・ どなたかご教授お願いします。
>>578 # その一
# 数が少なければsortする方法と大差ないが、数が多ければこちらの方が早い
a_small = -1; # または、考えられる最小の値
foreach my $value(@aaa){
if($a_small > $value){
$a_small = $value;
}
}
# その二
# 上記のアルゴリズムををコンパイルされたネイティブコードで行う
# ただしList::Utilモジュールがインストールされている必要がある
use List::Util qw(min);
$a_small = min @aaa;
580 :
デフォルトの名無しさん :2005/05/11(水) 23:31:27
utf-8で書かれた全角文字の16進表現を取得するにはどげん すればよかとですか?
>>578 @aaa = ("5","10","3","7");
$a_small = [sort{$a<=>$b}@aaa]->[0];
583 :
デフォルトの名無しさん :2005/05/12(木) 14:24:40
お世話になっております。 @data=('a','b','c','a'); でかぶっている要素を削除したいのですが そのような関数等ありますでしょうか? 上記の例だと @data_des = ('a','b','c'); としたいのですが、、、
584 :
デフォルトの名無しさん :2005/05/12(木) 14:38:02
585 :
583 :2005/05/12(木) 14:39:09
ガーン 、、、 わっかりました。 自作します。
ヒント:連想配列にぶち込む
588 :
デフォルトの名無しさん :2005/05/12(木) 15:51:45
らくだ本にまんま書いてあるだろ
589 :
デフォルトの名無しさん :2005/05/12(木) 16:03:39
>583 %tmp; @sort = grep(!$tmp{$_}++,@a);
590 :
デフォルトの名無しさん :2005/05/12(木) 16:04:30
>>587 あんな1行課題にこんな実験版を使うのは危険だし。
>>588 んなもんわざわざ持ち出さなくても、誰の手元にもあるはずの
添付ドキュメントのFAQにあるし。
591 :
583 :2005/05/12(木) 18:37:00
う、、、自作して一息ついていたらRESがついてる、、
>>589 さん
ありがとうございます。
コレを利用させていただきます。
自作のは冗長すぎ、、、
592 :
デフォルトの名無しさん :2005/05/12(木) 18:43:00
@a = do {my %seen = (); grep {!$seen{$_}++} @a};
593 :
578 :2005/05/12(木) 20:51:25
>>579 #「その1」sortするよりforeachでまわして比較してしまった方が速いということですね。
データ数が結構ありますので速いのはありがたいです。
#「その2」List::Utilモジュール使えました。で、ついでにmax @aaaとすれば
最大になるかな、と思ったんですが違いそうですね・・・調べてみます。
>>581 難しくてよくわかりませんが、右側の[0]が添え字なんですね。[$#aaa]としてみたら
最大も取れました。
大変勉強になります。ありがとう御座いました。またお願いします。
Tk::Canvas#createWindowでキャンバスにウィジェットを描写し、 持たせたタグにイベントをバインドしたのですが、何故か反応してくれません。。。 $cv->createWindow(..., -tags => ["ohYes"]); $cv->bind("ohYes", "<Enter>" => ...); ウィジェットに直接バインドしても良いのですが、 それだとキャンバス上のサイズが取得できなくて。。。 解決方法をご存知の方いらっしゃいましたら、どうかご教示お願い致します。 (描写したウィジェットがキャンバス上で機能するような方法をお願いします)
キャンバス上のサイズではなく、座標でした。
日本語ディレクトリやファイルにアクセスする方法って無いのでしょうか? win2k+active perlでローカルのファイルにフルパス指定して、例えば c:/test/日本語/test.txtなどを開こうとしても、開けません。 日本語ディレクトリ名をローマ字に変更すると正常にファイルを開けました。
shiftjisで書くとか
>>597 encodingは指定しています。とりあえず動かない事は無いので諦めます。
ふつーに開けないか?
encoding指定しなければいいじゃない。
601 :
デフォルトの名無しさん :2005/05/14(土) 02:44:03
$str1 = "&keyhoge&keyfuga&keyfoo&keybar" ; $str2 = "&key&key&keyhoge&keyfugafoobar" ; $str1 =~ s/&key{1}/@@@/ ; if ( $str2 =~ /&key{3}/ ) print "test\n" ; print "$str1\n" ; print "$str2\n" ; exit ; これがエラーになるのはどうしてでしょうか? 予想としては test が表示されるはずなのですが
>>601 ifの{}は省略不可。もしくはifを倒置。
>>601 エラーはifだろうけど、やりたい事が良くわかんない
『&key』を量指定でマッチさせたいのかな?
604 :
601 :2005/05/14(土) 03:00:43
>>601 $str2 = "&key&key&keyhoge&keyfugafoobar" ; ○
$str2 = "&key&keyhoge&keyfugafoobar" ; ×
と言う感じで、&key が3つ連続で続いてたら、if の中身を真に
させたいです。
605 :
デフォルトの名無しさん :2005/05/14(土) 03:18:14
はい、書きました
自分で書いたコードが半年後に読めなくなる言語ってどうよ
>>607 それよりも、自分で書いたコードが半年後に読めなくなる頭脳の方を
問題にすべき。
609 :
デフォルトの名無しさん :2005/05/14(土) 03:44:25
>>607 逆コンパイルできてしまう開発環境よりいいんじゃね?
611 :
デフォルトの名無しさん :2005/05/14(土) 03:46:24
>>607 15年前に書いたコードも普通に読めますが。
612 :
594 :2005/05/14(土) 03:57:41
自己解決しました。失敬。
>>606 何がいけないのかわからなかったら
正規表現のグループ化について調べると良いと思うよ
614 :
デフォルトの名無しさん :2005/05/14(土) 07:13:42
_,,−-、
_,, .. _,,-‐'": : : : : :゙ヽ
r‐'´: : : : : : : : : : : : : : : : ` 、
/: : : : : : : : : : :,、: : : : : : : : : :_:ヽ、
|_: : : : : : : : : / \: : : : : : : :ヽ、
{: : : : : : : : l' ヽ、: : : : : :{、
l__: : : : : : :i、 `丶: : t‐`
/, ヽ: : :/´ |: : : !'
{ ru l': :/ ,/二丶、 }: :,,|
_`iヽr‐!:丶 'tェッiヽ-'' , '‐-、/:/
: :丶t': : : ヽ 'xェァノ:/
: : : : : : : : : : i、 }
: : : : : ',: : : : ´ i! _ノ
: : : : : ヽ : 、_ `゙;;;;> .,r'/
: : : : : : \ - ,,`''‐--//`丶、.
: : : : : : : : :`-,; " ̄ /: : : : : :\
: : : : : : : / /: : : : : : : : : :',
: : : : : : :{ ,. -‐ ": : : : : : : : : : : :
太宰治先生が
>>605 を見て人間の醜さを見出したようです。
615 :
デフォルトの名無しさん :2005/05/14(土) 09:30:34
自分で書いたデタラメプログラムがコンパイルできなかったので、 計算機センターのCコンパイラが壊れているとクレームをつけてき たバカ学生を思い出したぜ。
いつの時代だよw
今でもいるぞー。 間違ってないんですけどって奴。
そっちじゃねーよw
>>615 思い出されたぜ。しかも2回やったぞw
10年前だがな〜。
620 :
デフォルトの名無しさん :2005/05/14(土) 15:42:51
open INPUT, "<test.txt" ; while ( <INPUT> ) { chomp ; print "$_\n" ; } close INPUT ; exit ; このようにすると、ちゃんと一行読み込んでくれるのに、 open INPUT, "<test.txt" ; <INPUT> ; chomp ; print "$_\n" ; close INPUT ; exit ; のようにすると、一行読み込んでくれないのはどうしてなのでしょうか? <>を使い、代入する変数を省略した場合、デフォルトで、$_ に保存されると 本で読みました。これは while の中だけで有効な話なのですか?
621 :
デフォルトの名無しさん :2005/05/14(土) 15:51:47
622 :
596 :2005/05/14(土) 15:58:47
日本語PATHについて質問してた者です。あれからネットを調べまわった結果 同じようなケースが1つ見つかりました 内部で勝手にUTF8に変換されてしまうので、shiftjisに文字列をエンコードしなければ成らなかったようです と言っても理解できてませんけど use encoding "cp932"; use Encode; $inputtext = "c:/perl/test/日本語/in.txt"; $inputtext = encode('cp932',$inputtext); utf8::decode($inputtext); print $inputtext; open (IN, '<', $inputtext);
2chの板/スレ/投稿一覧を取得するようなモジュールって既にありますかね? 自作してもいいんですが、車輪の再発明もなんなので…。
どっかにあったが忘れた
while(<>) は for(;<>;) と等価ですか? これはいくらググっても見つかりません。不安です。
>>620 <STDIN>は標準入力から1行読む
全部読んで$_に代入する訳ではない
ただし配列に代入する場合は別
ラクダ嫁
>>625 whileとforの構文の一般的な話ならperlsyn(1)のFor Loopsという
見出しのところに書いてあるし、行入力演算子を条件のところ
に書いたときの特別な振る舞いを気にしてるならperlop(1)の
I/O Operationsのところに書いてある。
>>620 $_に代入してくれるのはwhileとfor(;;)の条件のところに
書いたときだけ。
詳しくは628にもあるがperlop(1)のI/O Operationsのところ
を読んでくれ。
>>626-628 レスありがとうございました。
ラクダ本というものの存在をはじめて知りました。
お金ができたら買ってみようとおもいます。
失礼
>>629 さんまででした。
本当にありがとうござました!
utf-8でかかれたテキストファイルに対して処理を行うのに、 改行コードが邪魔だったので置換して削除しようとしたのです が、うまくいきません。改行コードはそのまま残っています。 以下、失敗時の対象コードです。 $hoge =~ s/\x0D\x0A//g; #gいらないかもしれませんが \r\nもやりましたが結果は同じでした。 テキストエディタで同様の文字コードで置換するとうまくいく のですが、、、 解決方法よろしくお願いいたします。
> Perlメモ
635 :
デフォルトの名無しさん :2005/05/15(日) 23:18:56
お分かりになる方、お願いします。
携帯用のページに perl で post したいんです。
HTMLのフォーム使ってではなく、直接、
http://test.com/cgi/post.cgi?id=123&pas=456 ・・・という具合に、送信したいんですが、携帯用のページにIEから、上記のようなアドレスを
送信すると、エラーになります。
perl の仕様? が違うのだと思いますが、どのようにすればうまく解決できるのでしょうか。
携帯用だとページが軽いので、可能なら助かります。
質問の文章の程度からしてお前には無理。
http://www.template-toolkit.org/ Version 2.14 Released について
perl の use tmpletes (Template Toolkit)を使いたいんだけど、
使用先がレンタルサーバで、tellnetがつかえないく root 権限もないからインストールができない。
自分の /var/www/cgi-bin/lib/ にアップしたいんだけど、どのディレクトリーをアップすればいいの?
この上なく釣りにしか見えんが lib/Template 以下を lib にぶちこんでみれ
640 :
デフォルトの名無しさん :2005/05/16(月) 20:55:30
perl, rubyとなるとsapphireとかtopazとかありそかもな?
>>639 ありがとう。動いたよ。
カキコしてから、CGIじゃんって、気がついたよ。ごめん。
template toolkit って HTML::template より便利だ。
質問があります。 相対パス表記である './' や '../' を含んだパスからそれらを出来る限り取り去りたいのですが、 そのような作業をやってくれるモジュールなり、簡単な正規表現の書き方なりあれば教えてください。 ↓自力で一応それっぽい正規表現を考えてみましたが、3〜4行も打たねばならず腱鞘炎になりそうです_| ̄|○||| my $path = 'hogera/../.././././pukya/../hell/o/world'; print "$path\n"; $path !~ m/\.{3,}/ or die; # 3 以上の '.' の連続をはじく (assert) $path =~ s|([/\\]\.{1,2})$|$1/|; # 末尾が '/.' または '/..' ならディレクトリ $path =~ s|(?<=[/\\])\.[/\\]||g; # './' の除去 $path =~ s|[^/\\]+[/\\]\.\.[/\\]||g; # 'hoge/../' の除去 print "$path\n"; あと、このような処理はありがちに思えるので、それっぽい名前とかありそうな気がするんですが、どうなんでしょうか・・・?
>>643 $cpath = File::Spec->canonpath( $path ) ;
がそのものずばりですた。
ありがとうございます!
こういう処理は、正準化ちゅうんですね。
645 :
デフォルトの名無しさん :2005/05/18(水) 12:13:20
Windows上で動く簡単なものを作成したのですが その際に使用するモジュールをppm・installで入れようとしたのですが 入れようとするとno suitable installation taaget found for package と出てきます。 これは何が原因なのでしょうか? わかる方おられましたらアドバイスいただければと思います。
>>645 no suitable installation target found for package
↓
target
になおしてぐぐればでる。
647 :
デフォルトの名無しさん :2005/05/18(水) 21:49:34
らくだ本を見ながらテキスト処理のスクリプトをいくつか書いてるんですが、 GUIのデバッガってないですかね? 同じスクリプトをWindows2000、SuSE Linux9.1、Solaris8の3つで 動かしているので、どのプラットフォームのでもOKです。
>>647 perlのdebugオプションつけたんじゃだめ?
emacsでもあったよな。
なんだ、GUIか(スマソ
651 :
647 :2005/05/19(木) 00:09:13
>>648-650 レスどうもです。
dddをインストールしてみましたが、ちょっと使いにくかったので
Eclipse+EPICの方を試してみようと思います。
マルチ+スレ違いの質問をしてしまう私をどうか許してください。 WebProgのPHPくだ質スレにて print <<"ここから"; $info['name'] = 'taro'; $str = '%db{name}'; $ret = preg_replace("/%db{(.*?)}/", $info[$1], $str); printf("%s", $ret); このような感じで「taro」と表示するのを期待しているのですがエラーが出てしまいます。 シングル、ダブルクォーテーションで囲っても期待通りの動作はしませんでした。 どのような方法を使えば「taro」と表示出来ますでしょうか。 それから foreach (range(1,5) as $key) { なんとか $i; print ++$i; } print $i; この結果が「11111」になるよう$iを局所変数にするような関数ってありますか? ここから という質問をしたのですが問題のPHPコード同様、期待値を得ることが出来ませんでした。 Perlだったら $str =~ s/%db{(.*?)}/$info{$1}/; my $i; でいけるのですがPHPの場合はどう記述すればいいのでしょうか。
windowsで、一個上のディレクトリに移動したいときはどうするんでしょう? chdir ( ..\ ); では、うまくいかないんですが。。。
../