1 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 22:35:39 ] "The duct tape of the Internet" こと、Perlについての質問箱です。 "There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板 pc8.2ch.net/php/ ) CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2006/12/21現在の最新版: 5.8.8 ● 2006/12/21現在の開発版: 5.9.3 前スレ Perlについての質問箱 28箱目 pc8.2ch.net/test/read.cgi/tech/1162273941/ リンク集は>>2-3 過去スレは>>4
231 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 13:21:02 ] >>227 つShift_JISの罠 /\Q$in{'test'}\E/ Text::CSVはマルチバイト文字通ったっけ? Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が
232 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 14:02:13 ] Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。 Text::CSV_XSでbinaryオプションつけないとダメだ。
233 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 14:07:57 ] >>231 返信ありがとうございます。おかげで解決することができました ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが 「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです 解決はしたけど理解出来てない…
234 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 14:25:47 ] >>233 「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B 他にもソ('\')とか+('{')とか色々。 文字コードの割り当て参考資料 ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html ASCIIコード表 ttp://adlib.rsch.tuis.ac.jp/~akira/lect/softa/ascii.html
235 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 14:31:01 ] >>233 「$in{'test'}」自体がメタ文字を含むってことじゃなくて、 実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
236 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 14:51:17 ] >>234-235 かなり見当違いな考えをしてたみたいですね 「ー」以外にも注意しなければいけない文字が結構ありますね ご丁寧にありがとうございました
237 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 16:52:09 ] >>230 1: Archive-Zip Provide an interface to ZIP archive files. Version: 1.18 Author: Ned Konz <perl@bike-nomad.com> Provide: Archive::Zip version 1.18 Require: File-Which Require: PathTools Repo: trouchelle CPAN: search.cpan.org/dist/Archive-Zip-1.18/ Installed: 1.18 (perl) 2: Archive-Zip Provide an interface to ZIP archive files. Version: 1.18 Author: Adam Kennedy (cpan@ali.as) Provide: Archive::Zip version 1.18 Provide: Archive::Zip::BufferedFileHandle Provide: Archive::Zip::MemberRead Provide: Archive::Zip::MockFileHandle Require: File-Which Repo: ActiveState Package Repository CPAN: search.cpan.org/dist/Archive-Zip-1.18/ Installed: 1.18 (perl) 3: Archive-Zip Provide an interface to ZIP archive files. Version: 1.18 Author: Ned Konz (perl@bike-nomad.com) Require: Compress-Zlib Repo: bribes CPAN: search.cpan.org/dist/Archive-Zip-1.18/ Installed: 1.18 (perl) こんな感じです。
238 名前:デフォルトの名無しさん [2007/01/08(月) 17:32:10 ] >>227 おもったが、他の文字コードに変換してsplitするのはどうよ。 いちばんお手軽。 open(IN,"$file"); while(1) { $line = <IN>; $line=Jcode->new($line)->euc; @data = split(/,/ ,$line); if ( $line eq "" ) { last;} if ( $data[0] =~ /$in{'test'}/ ) { print Jcode->new("$data[1]\n")->sjis; } } close(IN);
239 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 17:41:21 ] たまに思うのだが、単なる文字列のスカラを "$file" とかって、ダブルクォートで括って書くの無駄だよね。 全く同じ内容の、新しい文字列を生成してる訳でしょ? だったら単に $file って書いた方が効率良いのに。 KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。 こういう書き方してる人が、どこで習ってくるのか知りたい。
240 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 17:51:09 ] >>238 $in{'test'}が正規表現の場合の話か。 EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。 今度は>>176 こういう問題が発生する。SJISでも率は低いが起こるけれどね。 ってもしかして元質問も正規表現を入力する質問だったんだろか… indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども >>239 最近は見ないけれど print "@hoge"; とやっておいてなんか表示が変だと質問してくる人までいるから困る。 ついでにperlfaq ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#What_s_wrong_with_always_quoting
241 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:43:01 ] >>239 あ、それ昔やってた。 なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
242 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 00:46:26 ] #俺にも print $a, $b; #とすればいいところを print $a . %b; #としていた時代や print "$a$b"; #としていた時代があったなあ
243 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 01:05:55 ] カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。 そっちの方が速いんだけどね。
244 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 01:39:08 ] 強制的に文字列コンテキストに変えたいときとか。 オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
245 名前:244 mailto:sage [2007/01/09(火) 01:46:32 ] ちゃんと読んでなかった。スマソ
246 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 12:09:24 ] >>243 散々既出だが、一応突っ込んどく。カンマの方が遲い use Benchmark ; my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ; sub dot { print STDERR $hoge . $moge . "\n" ; } sub dq { print STDERR "$hoge$moge\n" ; } sub comma{ print STDERR $hoge , $moge , "\n" ; } timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ; $ perl Bench.pl 2> /dev/null Benchmark: timing 1000000 iterations of op1, op2, op3... op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000) op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000) op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
247 名前:243 mailto:sage [2007/01/09(火) 13:10:54 ] >>246 初心者でゴメン。Windowsだから、nulに出力して実行してみた。 (Windows XP SP2 ActivePerl5.8) Benchmark: timing 10000000 iterations of op1, op2, op3... op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s (n=10000000) op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s (n=10000000) op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s (n=10000000) あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、 ベンチしたらドットの方が速いんで>>243 を書いた。 なんで結果違くなっちゃうのか誰か教えて〜。
248 名前:243 mailto:sage [2007/01/09(火) 13:29:23 ] あー、わかった。Perlでの出力処理はcommaの方が速いけど、 systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246 Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。 ここらへんはLinuxとWindowsで違うんだろうね。
249 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 14:06:58 ] >>246 うんにゃ。 8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。 $hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
250 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 01:42:28 ] >>248 いや、>>246 はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。 STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。 なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。 他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
251 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 04:22:12 ] えっちだから遅いんだね。
252 名前:デフォルトの名無しさん [2007/01/10(水) 15:25:22 ] フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが 多いように感じるんだけど、これってどうなんだろう。 掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。 意見求みまする。
253 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 15:43:02 ] >>252 インスコするファイルがたくさんあるとお子様が混乱してしょうもない 質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル では得らしい。
254 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 15:51:55 ] コーディング外の質問です。 今、plファイルのwindows向けのアイコンを何となく作っていますが、 真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
255 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 16:07:31 ] 当然らくだ
256 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 16:18:38 ] PARのparl.exe
257 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 16:25:41 ] >>256
258 名前:デフォルトの名無しさん [2007/01/10(水) 20:00:56 ] 初めて書き込みさせて頂きました。 現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、 telnet中にESCキーを入力させる事は可能なのでしょうか? perl:v5.8.0 built for PA-RISC1.1-thread-multi telnet:Net-Telnet-3.03 対話式なプログラムを実行していき、途中で どうしてもESCキーが必要になりました。 $telnet->print("\x1B"); こんな感じで文字コード入力でもダメでした。。
259 名前:韋駄天はふと考えた [2007/01/10(水) 23:02:23 ] あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に 2回もパソコンをウイルスによって不調になり使えなくなりました。 私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を あまりにも野放にしすぎました。 その結果が自作自演ウイルスバラ撒きの悪徳商法です。 703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph ノートンがウイルスを検出しました。 あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。 もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。 はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ? 明らかに自作自演目的の業者の仕業じゃねえか? 犯人はおまえらだろが!この犯罪者かぶれの集団が!! あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。 おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の 何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを 高額で売りつけてまで儲けたいのかよ? 自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して 回るのと同じ犯罪をおまえらがやっているんだよ! てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを 高値で売りつける自作自演商売しやがって! この腐れ外道共が! 恥知らずの犯罪者共めが!
260 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 23:06:09 ] >254 でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
261 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 00:08:30 ] >>255 公式のらくだの絵をちょっと使って作ってみました。 >>256 あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。 >>260 一応Perlの文字を入れました。 どうもでした。
262 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:01:46 ] ファイルを最終行から順にさかのぼって読む方法ないですか? seek , getc等で1文字単位で読むしかないかな?
263 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:09:57 ] >>262 つFile::ReadBackwards
264 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 01:15:30 ] >>263 ありがとうございます。
265 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:03:13 ] 課題で aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。 というのが出ています。 print "a? "; chomp($a=<stdin>); print "b? "; chomp($b=<stdin>); でaに+をいれ、bに5といれると + ++ +++ ++++ +++++ こんな感じで表示させたいです。 for文の入れ子でやると思うのですが、表記がわかりません。 ヒントだけでもいただけないでしょうか?
266 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:09:13 ] bに1を足してaをb個並べてプリントしたら改行を繰り返す
267 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:19:33 ] forの入れ子でやるとかいうと、もしかしたらこういう おぞましいコードを期待してるかもしれないんだけど for (my $line=1; $line <= $b; ++$line) { for (my $num=1; $num <= $line; ++$num) { print $a; } print "\n"; } こういう風に簡潔にかける。 for my $num (1..$b) { print $a x $num, "\n"; }
268 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:21:58 ] あと $a と $b は sort とかで使われるから使うなといっとけ
269 名前:265 mailto:sage [2007/01/11(木) 17:33:51 ] >>267 できました。ありがとうございます。 入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw もし入れ子でやるとしたら 入れ子の方の後半部分の print $a; } print "\n"; } はどういうことでしょうか?
270 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:34:37 ] すぐ答え出す奴ってなんなの・・・
271 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 17:54:51 ] 漁師さん
272 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 18:12:08 ] こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが お決まりなんだけどね。
273 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 18:21:32 ] print map { $a x $_ . "\n" } 1..$b;
274 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 18:58:59 ] チューニングした答え書いて分かるかよ。 いっそのことCPANで(笑
275 名前:267 mailto:sage [2007/01/11(木) 19:02:50 ] $a='+';$b=5;$t=0; (${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g; こうですか?わかりません><
276 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 19:17:38 ] $^Nなんて使ってるのはじめてみた(笑)
277 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 19:26:01 ] (笑)なんて使ってるのはじめてみた(笑)
278 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 20:25:30 ] 確かにな(藁
279 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 20:27:11 ] まぁ、ありえない
280 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 02:12:36 ] print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ; 不毛だ…
281 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 02:31:38 ] $_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、 以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも データを取得してしまいます。 このような2バイト文字を取得しないようにするには どの様に修正すればいいですか? if ( $_ =~ "@" ) { $data[$i++] = $_; }
282 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 03:56:45 ] まず始めに。 当方、Perlは殆どいじった事がなく、 HSPやCを少々組んだ事がある程度の知識で質問しているため、 常識的な事や的外れな事を質問していたら申し訳ありません。 google等で調べても何やっても上手くいかなかったので、 どうか皆様の力をお貸し下さい。orz CGIで生成したページから別サイトへのリンクをクリックした時に、 「このURLへアクセスします。よろしいですか?」 と言ったような確認ページを挟んでアクセスするようにしようとしています。 具体的書くと、元ページの別サイトへのリンクは、 xxx.cgi?url=www.xxx.com/index.php?%A5%AC%A5 と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。 URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、 実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、 綺麗なURLになってくれません。 渡されてきたURLを「www.xxx.com/index.php?%A5%AC%A5 」のように、 そのまま表示するにはどうしたらいいでしょうか? 一応書いておくと、スクリプトはUTF-8Nで書いています。
283 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:00:48 ] >1に全てが隠されているんじゃないだろうか。
284 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:08:40 ] >>283 orz CGIはスレ違いだったんですね。本当にごめんなさい。 一日考え続けてて疲れてたのか、>>1 を確認するのを失念してました。 向こうの初心者質問スレで質問してくる事にします。 スレ汚し失礼しました。
285 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:14:03 ] プログラム板から誘導されて来ました。 まず始めに。 当方、Perlは殆どいじった事がなく、 HSPやCを少々組んだ事がある程度の知識で質問しているため、 常識的な事や的外れな事を質問していたら申し訳ありません。 google等で調べても何やっても上手くいかなかったので、 どうか皆様の力をお貸し下さい。orz CGIで生成したページから別サイトへのリンクをクリックした時に、 「このURLへアクセスします。よろしいですか?」 と言ったような確認ページを挟んでアクセスするようにしようとしています。 具体的書くと、元ページの別サイトへのリンクは、 xxx.cgi?url=www.xxx.com/index.php?%A5%AC%A5 と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。 URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、 実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、 綺麗なURLになってくれません。 渡されてきたURLを「www.xxx.com/index.php?%A5%AC%A5 」のように、 そのまま表示するにはどうしたらいいでしょうか? 一応書いておくと、スクリプトはUTF-8Nで書いています。
286 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:20:09 ] ぎゃー!!! ありえない誤爆・・・。 ほんっとうにごめんなさい・・・。
287 名前:デフォルトの名無しさん mailto:sage [2007/01/12(金) 04:23:33 ] >1に全てが隠されているんじゃないだろうか。
288 名前:281 mailto:sage [2007/01/12(金) 04:29:08 ] 自己解決しました。 おさわがせしました。
289 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 00:44:28 ] >>281 見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、 うーんうーん悩んでいた時のことを思い出した。 そういや、半角英字を全角英字に置換することってできるの?
290 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 00:53:02 ] use utf8やるとか。
291 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 01:42:35 ] EncodeもあるしUnicode::Japaneseもあるし。
292 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 22:09:16 ] WebProg板に書いたけど、こっちの方がふさわしそうなので こちらでお聞きします。 キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、 C言語でいうところの、getch() に相当する関数はないでしょうか?
293 名前:デフォルトの名無しさん [2007/01/13(土) 22:10:05 ] 4年前ぐらいまでPG兼SEをしていたのだが、 そのころと比べるとかなりPerlは寂れた?
294 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 22:34:22 ] >>292 Term::Getch
295 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:42:13 ] こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。 得点が同点の場合、E→S→W→Nの順で優先となります。 とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、 if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){ #E=1位 #SとWとNで2位以下の判別 #何かと何かで3位と4位の判別 } elsif (($rank{S}>=$rank{W})&&....... #S=1位 #EとWとNで2位以下の判別 #何かと何かで3位と4位の判別 }elsif(.. と、やり始めましたが、とてつもない作業になりそうです。 何か、よい解決法がございましたらご示唆お願いします。
296 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:49:18 ] 普通にソートすりゃいいやん @result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
297 名前: ◆TWARamEjuA mailto:sage [2007/01/14(日) 01:04:42 BE:1633853-BRZ(6701)] とん・なん・しゃー・ぺー♪
298 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:06:36 ] use strict; # こんな配列 my @results = ("E:15000", "S:20000", "W:15000", "N:50000"); # 得点が同点の場合の順 my %prio_of = ( E => 0, S => 1, W => 2, N => 3, ); my @s_results = map { $_->[0] } sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} } map { [ $_, (split/:/=>$_)] } @results;
299 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:23:07 ] 数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。 随分長い間Perlから離れてるので間違ってるかも知れないけど $foo = '2000'; と文字列にしておいて、その後で $foo を数値として使った場合、 スカラ変数の構造体は、 文字列型のものから、数値も文字列も両方入る奴に切り替わる。 構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率 …だったような気がする。
300 名前:295 mailto:sage [2007/01/14(日) 01:43:35 ] すばやいご提示、ありがとうございます。 >>296 様 すみません、説明が不足していました(ということに気づくのに、いただいた式を 眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる 順番は毎回変わる可能性がありました。申し訳ありません。 >>298 様 欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・ なんとか少しずつ、吟味していきたいと思います。 >>297 様 わかりましたか。そのとおりです。 皆様、すばらしいご教授、どうもありがとうございました。
301 名前:デフォルトの名無しさん [2007/01/14(日) 01:59:22 ] >>299 perl は型はなしでしょ。 $foo = '2000'; も $foo = 2000; は同じでしょ。
302 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 02:13:38 ] >>301 つ [perlguts] つ [Devel::Peek]
303 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 02:45:43 ] >>302 もちっと教えてくれんかのう。 perldataには 「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、 あるいはその他の型であるように宣言する方法はありません。」 とあるかんだけど、それとは違うレベルで何かあるのか?
304 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 03:03:20 ] 提示されている情報ぐらい見なさい。 > Double-Typed SVs > スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、 > 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
305 名前:265 mailto:sage [2007/01/14(日) 03:39:50 ] >>275 を提出したんですが、授業後 せんせから呼び出し受けました。
306 名前:303 mailto:sage [2007/01/14(日) 03:57:55 ] >>304 どうもありがとう。 文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。 しかし、シンタックス上 $foo = '2000'; と $foo = 2000; に違いがあるとは読み取れませんでした。 #$foo = '2000' . ''; #と #$foo = 2000 + 0; #が違うのはわかりますよ。
307 名前:303 mailto:sage [2007/01/14(日) 04:24:03 ] 試してみれば良いんだね。 $foo = 2000; の場合数値コンテキストになるんだ。(そりゃそうか)
308 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 13:40:27 ] >>305 ワロタ なんていわれたの?w
309 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 14:38:20 ] 先生が読めなかったか 先生がこのスレを見ていたか どっちかな
310 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 14:54:53 ] >>289 >半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、 >うーんうーん悩んでいた時のことを思い出した。 >そういや、半角英字を全角英字に置換することってできるの? 次スレのテンプレ予定の>>115 に忠実に従えば、 tr/a-zA-Z/a-zA-Z/ でできる。
311 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 14:58:44 ] print "@{[1+1]}", "${\(1+1)}"; こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。
312 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 15:01:00 ] >>306 use Devel::Peek; $foo1 = '2000'; Dump $foo1; $foo2 = 2000; Dump $foo2; ↓ SV = PV(0x363bc) at 0x18aef9c REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x3dc2c "2000"\0 CUR = 4 LEN = 8 SV = IV(0x18a68b8) at 0x18af02c REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2000
313 名前:299 mailto:sage [2007/01/14(日) 20:42:44 ] やっぱりPVIVになった。どうやら >>299 に書いた記憶通りだったみたい。 use Devel::Peek; $foo = '2000'; Dump $foo; $foo += 1; Dump $foo; SV = PV(0x1801660) at 0x180b5a8 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x300c70 "2000"¥0 CUR = 4 LEN = 5 SV = PVIV(0x1801a20) at 0x180b5a8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2001 PV = 0x300c70 "2000"¥0 CUR = 4 LEN = 5 この状態でFLAGSをC側からいじると、 文字列として表示した時と、数値として使った時で別の値を出すスカラ とか作れちゃうんだよね。
314 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 22:35:50 ] >>313 実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。 ttp://search.cpan.org/~dconway/Contextual-Return-v0.1.0/lib/Contextual/Return.pm use Contextual::Return; $contextual = NUM { 10 } STR { 'abc' }; print $contextual . ''; print $contextual + 0;
315 名前:314 mailto:sage [2007/01/14(日) 22:43:39 ] ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。 313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな
316 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 23:55:02 ] Scalar::Utils の dualvar は?
317 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 23:56:11 ] ごめん、Scalar::Util だった。 ttp://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/Scalar/Util.pm
318 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 23:59:37 ] >実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。 スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。
319 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 00:09:24 ] dualvar でスカラ作ってみたけど、 作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。 ということは、xsでフラグいじって IOK, POK 両方立てても 代入したら片方になっちゃうということか。 オブジェクトにして代入まで見張れば良いんだろうけど。
320 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 01:57:29 ] webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。 method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。 よろしくお願いします。 ↓の一番下の部分も参考にしましたが直りませんでした。 tech.bayashi.net/pdmemo/chara2.html apache perlは↓のサイトを参考に構築してあります。 www.y-kit.jp/saba/ ------------------------------ 環境 Apache/2.0.59 (Win32) PHP/5.1.4 ------------------------------ コード例 require './jcode.pl'; #GET用 $myindata=$ENV{'QUERY_STRING'}; #POST用 #read( STDIN, $myindata, $ENV{ 'CONTENT_LENGTH' } ); #$myindata =~ tr/+/ /; #$myindata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge; &jcode'convert( *value, 'sjis' ); print "Content-type: text/html\n\n"; print $myindata; ------------------------------ getデータ localhost/bbsmt/write.cgi?name=a&mail=&message= あいうえお&a=11 表示データ name=a&mail=&message=???¢???|?¨&ip=&a=11
321 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 02:03:07 ] >1に全てが隠されているんじゃないだろうか。
322 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 12:39:35 ] 以前使っていたサーバでdbmファイルを使っていたのですが、 そのまま別のサーバに移動したら読み込めなくなりました。 dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。 古いサーバはもう使えません。新しいサーバでdbmファイル を読む方法はないでしょうか…。
323 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 14:43:05 ] >>322 質問する時はまず環境を説明しろ! (古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン) あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁
324 名前:デフォルトの名無しさん mailto:sage [2007/01/15(月) 19:18:22 ] >>322 ヒントになるかわからんが NDBM_File DB_File GDBM_File SDBM_File ODBM_File
325 名前:320 mailto:sage [2007/01/15(月) 20:46:35 ] 別のとこで質問してきます。
326 名前:322 mailto:sage [2007/01/15(月) 20:58:26 ] 読めなかったと思ったら読めました。お騒がせしました。 dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても 読めないのだと思っていました。dbmopen()で読み書きしていたので、どの 形式のDBMかわからなかったのです。
327 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 05:56:00 ] perlerのエロイ人教えて!ワッフルワッフル 指定されたディレクトリのディレクトリハンドルを開いて ディレクトリ内のファイル名を取得するスクリプトを書いたのですが 名前が長いファイルがあるとそのファイルと、それ以降のエントリが ディレクトリハンドルから取得できないんだけど なんで?これどうすれば回避できる? 環境: Windows XP + ActivePerl5.8.8 build819
328 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 07:04:48 ] esperのエロイ人が来て お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ
329 名前:327 mailto:sage [2007/01/16(火) 10:55:47 ] >>328 再現スクリプトを下記に示します。 DirHandle以外にopendirでディレクトリハンドル開いたり、 globを使ってみたけど結果はおんなじでした。 ---- #!/usr/local/bin/perl use strict; use utf8; use warnings; use FindBin; use DirHandle; use Data::Dumper; my $dh = DirHandle->new($FindBin::Bin) or die $!; my @entries = $dh->read; print Dumper(\@entries); __END__ ----
330 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 10:58:29 ] 名前が長いファイルの例は何ですか?
331 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 11:02:27 ] 質問します。 foreach( sort(glob("*")) ){ if(-d){ @local_dir = (@local_dir,$_) ; }elsif(-f){ @local_file = (@local_dir,$_) ; }else{ print "Not Support Format -> $_\n" ; } } ファイルとディレクトリに分けたいのですが、 ローカルだと上記のようにできますが、(他にスマートなやり方があるかもしれませんが。。) ftp上のファイルを区別する方法はありますでしょうか。 以下ではどちらも同じファイルを取得してしまいます。 use Net::FTP; my $ftp = Net::FTP->new($host); $ftp->login($user, $pass); foreach( $ftp->ls("./") ){ print "$_\n" ; } foreach( $ftp->dir("./") ){ print "$_\n" ; } $ftp->quit;