Perlについての質問箱 63箱目
■ このスレッドは過去ログ倉庫に格納されています
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 (WEBプログラミング板: http://kohada.2ch.net/php/ ) このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 荒らしはスルー推奨。 "The duct tape of the Internet" こと、Perlについての質問箱です。 "There's more than one way to do it" ということで、 Perlの奥深さについて皆で語り合い、追求してまいりましょう。 www.perl.org/get.html Download Latest Stable Source (5.18.2) ▼前スレ Perlについての質問箱 61箱目 http://toro.2ch.net/test/read.cgi/tech/1381561905/ Perlについての質問箱 62箱目 http://toro.2ch.net/test/read.cgi/tech/1385039352/ 寄生できないmmoとか簡単そうだけどな (1)死ぬたびに獲得経験値1/10 (2)3回死亡でダンジョンから強制排出&所持金半減&獲得経験値ゼロ (3)経験値はパーティーメンバーの敵に与えたダメージ比率 (3)があれば身の丈に合ってないダンジョンの時点で経験値はほぼゼロ ほぼゼロなところへ(1)があるから限りなくゼロに近くなる 寄生でダンジョンクリアだけしようにも(2)のハイリスクがある >>581 回復職やサポート職の経験値もなしということでしょうか。 昔はこれでアラーにならなかったのですが、perl5.8でこれを実行すると @{$_[2]}が原因でこけてるらしいです。 どのように変えればよいでしょうか my ( @WdayArr ) = ( $_[2] )? @{$_[2]} : ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ); >>583 # http://perldoc.perl.org/5.8.9/Scalar/Util.html use Scalar::Util qw(reftype); my @WdayArr = reftype($_[2]) eq 'ARRAY' ? @{$_[2]} : qw(Sun Mon Tue Wed Thu Fri Sat); >>584 ありがとうございます。やってみます。 >>585 曜日の文字を配列に指定する部分です。なければ、英語の曜日が入ります >>586 Perl 5.16.3 だが、下のスクリプトで1行目を入れても 消しても、きちんと動くぞ。 $_[2]に配列のリファレンス以外のものを入れたのだろう。 (エラーメッセージにそう書いてあるはずなんだが) ----------------------------------------- $_[2] = [qw(a b c d e f g)]; my ( @WdayArr ) = ( $_[2] )? @{$_[2]} : ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ); print @WdayArr; >>588 use strict;を指定すると参照ダメみたいなエラーが出るので とりあえずuse strict;を外して応急処置しています。 参照渡しができなくなったんでしょうか こういう時はエラーメッセージをそのまま貼るのが正解 このようなエラーが Can't use string ("ARRAY(0x10b0458)") as an ARRAY ref while "strict refs" in use at obj.cgi ARRAY(0x10b0458) というのは配列リファレンスを文字列として評価した時に出てくる 関数の呼び出し元で配列をそのまま渡さずにダブルクォートで囲うなどして文字列化してしまっているのだろう ありがとうございます。関数の実行側のほうを確認します。 Perlはマジで糞だな リファレンスはリファレンスで同じじゃねーの? バックスラッシュ付けたリファレンスでも種類によって違うとか意味不明 Cの共用体のようなことしなければ、 ある「型」のリファレンスは その「型」のリファレンスのままでよい。 それ以外の使い方をすれば、「間違っている」として エラーを吐いてくれるのが有難いではないか。 ただ、リストのリファレンスをハッシュの リファレンスとして使いたい時(またはその逆) がたまにあるが、それは可能にしてほしいと思う。 # こういうのじゃいかんか? my $ref_to_hash0 = +{ @{ $ref_to_array0 } }; my $ref_to_array1 = [ %{ $ref_to_hash1 } ]; >>597 無駄なものがあって読みづらい my $ref_to_hash0 = { @$ref_to_array0 }; my $ref_to_array1 = [ %$ref_to_hash1 ]; 何がしたいのかわからん。 キーと値が交互に出てくるものを ハッシュかリストに変換したいのか? my $ref_to_hash0 = { $ref_to_array0->@* }; my $ref_to_array1 = [ $ref_to_hash1->%* ]; Javaのクラス周りに慣れるとPerlのクラス周りは本当に不自由だと気付く 比較例に出すのにJavaのクラスなんぞを持ち出すのもどうかと xp 32bit xp対応のアクティブパール(ActivePerl)がダウンロードできないです 旧バージョンはどこからダウンロードできますか? >>602 active perl old version でググると、色々出てくるぞ。 実際、どれが使えるのかは知らんが。 $str = "LIST( '2016123456','2015123456','2017987654',…) という$strがあった時に、シングルクオートに囲まれた部分だけを取り出して @listに突っ込みたいんだけどどう書いたらいい? splitの正規表現でいけるかと思ったけどどう書いていいかわからない。 >>602 5.16なら間違いなく使えてる 5.18と5,20はファイル名に64intがくっついてて動くかどうかはわからない 今activesite見てきたら、まあ流し読みしかしてないけど、古いバージョンは有料で提供してやるよって買いてあった Need Perl on production servers or access to Perl 5.6, 5.8, 5.10, 5.12, 5.14, 5.16, 5.18 or 5.20? Learn more about ActivePerl Business Edition -------------------------------------------------------------------------------------------------------------------------- Get the language version you need on the platform you want. The following versions are available for purchase with Business Edition+: ActivePerl 5.8, 5.10, 5.12, 5.14, 5.16, 5.18, 5.20, 5.22, 5.24 ActivePython 2.5, 2.6, 2.7, 3.2, 3.3, 3.4, 3.5 ActiveTcl 8.4, 8.5, 8.6 >>604 push @list, $1 while $str =~ /'([0-9]+)'/g; >>604 $str = "LIST( '2016123456','2015123456','2017987654',…) $str =~ s/LIST/@list=/; eval($str); でいいんじゃね? >>608 > push @list, $1 while $str =~ /'([0-9]+)'/g; 惜しいね。それやるならこうだよ @list = $str =~ /'([0-9]+)'/g; >>611 読みやすさなら上の方が良くね? 新人に引き継ぐ時の事考えると >>602 2014年にダウンロードした ActivePerl-5.16.3.1604-MSWin32-x86-298023.msi を持っている。 ただ、Active State が古いバージョンを有償でのみ提供 しているのに、勝手に古いバージョンをうpしていいものか解らん。 そのあたり、クリアにしたら、どこかにうpしてやってもいいが。 m//g の形式でグローバルマッチの意味がないように思うが >>614 m//g をリストコンテキストで使うと、 全てのマッチ部分のリストが返される。 あると高速化できるようなrecommendsだけどインストールされていないモジュールを一覧出来る方法を教えて下さい >>602 googleでググったらすぐに見つかったけど? https://xray-engine.org/index.php?title=ActivePerl (このサイトは開くとき継続しますかって警告が出たんで ルート証明の認証に問題があるかも知れない 一応Java ScriptとActiveXの実行は切ってアクセスしたほうがいいだろう) 一応俺が使ってる(XP 32bit) ActivePerl-5.20.3.2003-MSWin32-x86-64int-299574.msi をダウンロードして保存していたファイルと比較してみたけど一致したから問題ないと思う あと、5.22.1も試してPerlとしては動いたので 現行ダウンロードできる5.22.3も大丈夫じゃないかな? (インストーラがexeに変わってるけど) あと俺が使えると言った5.22.1を何故使ってないかと言うと WSHから何故か正常に使えなかったので、使える5.20.3を使ってる https://amaten.com/ こんなサイトの情報をテキストか何かで取得したい LWP::Simple とかでは取ってこれない 何を使うと一番簡単にできる? >>602 XPで動くかは試してないけど、Strawberry Perlっていうのもあるよ どうしてもActivePerlじゃないとだめなの? おれ XP で Strawberry Perl つかってる ActivePerl はモジュールの対応が遅いから乗り換えた >>617 のところでActive Perlの古いのから最新まで全部ダウンロードできるじゃん それで解決だろ >>624 それだけだったらLinuxやFreeBSDなどを使うって方法もあるだろ? だからM$に金を払うのがいやだけど、MSのOSが好きという理由であるはずだ もしくはMS以外のOSがクソだっていう可能性もあるけど >>618 perlはもう進化が止まってるので、あんまり新しいことは出来ない 自分で作るなら別だけど rubyやpythonなら整ってる筈 >>618 もう見てないだろうけど HTML::TreeBuilder HTTP::Daemon LWP::UserAgent WWW::Scripter くらいでなんとかなると思うよ。簡単かどうかは知らんけど大体なんとかなってる。 最近はperlは余り聞かないな 中学生の時にはブームだったけど……。(何十年も前) 学校ではpython とかだと思う。C# java が主力? とにかく、滅多に聞かないな Perlは全然進化しないからな 一年ちょっと前に6がでて音沙汰なし 7はいつ出るんだ?って状態 >>634 > 実用性を重視するならJava一択 それって言語の実用性じゃなくて 人材的な意味での実用性だよな つまりJavaは色んな所で使われてる言語だから Javaできますって言っておけば採用されやすい。 自分が実用性がある人間になりたいならJava一択 言語なんかいくつ修得してもいいんだから、大人しくJava勉強しとけ 何がなんだか仕様に混乱するから3つまでしか習得出来ません 4つめ覚えるとなにかを忘れます 621 > むしろなぜXPを使ってるのか知りたい 動作確認だよ XPと10で動くならVistaでも7でも8でもでも動く可能性が高いから いちいち全OSを揃えて動作確認すると シロウトの趣味でアプリケーション開発するには荷が重すぎる いちいち全OSで動作させたいと思う理由は何? サポートが終了しているXPで動作する必要はないし Vistaも2017年4月までだ。シェアから考えれば切り捨てても十分だし 7と10で動作確認すればいいじゃん 俺の周りでは、いまだにNT3.5.1を使ってる取引先があるのだが。 用途を特定した専用マシンみたいなのは、特にOSを入れ替えずにずっと使うな 測定機器や実験機器の一部とか、何かの制御用とか ただ、そんなマシンは新しいソフトを入れたりもしないから、 互換性とかどうでもいい世界だけど 以前こちらでお世話になった顔文字のど素人です。 $ perl -p -e 's/(..)/$1 /g;' 123456 ↓ 12 34 56 恐縮ですが上記の逆(スペースの削除)をご指導願います。 00 06 fc 25 58 50 0a 00 54 92 31 03 49 46 88 d0 c6 ↓ 0006fc2558500a0054923103494688d0c6 よろしくお願いいたします _(_^_)_ とにかく学習しようという気がまったく見えないのが凄い 普通1時間以内に学習を完了してそうなものを、10日以上経ってるぞ active perlで、長いファイル名のあるフォルダに対して readdir すると、 エラーになって止まるんだけど、どうやって回避すればいいんだ エラーが返るとかじゃなくて実行自体が止まるので、とりあえず読んでみて、 とかが出来ない windowsのエラーじゃねぇの? とりあえずevalすれば実行は止まらないと思うけど >>653 ひょっとして、ファイル名にユニコード文字が混じったりしてない? readdirのユニコード版なら、こうゆうモジュールもある。 http://search.cpan.org/ ~xaicron/Win32-Unicode-0.26/lib/Win32/Unicode/Dir.pm それを使うと、既存のreaddir の挙動が変わるの? >>659 「長い」って何文字なん?260文字以下だと問題ないはず。 Windowsで260文字以上のファイル名を普通に作ろうとすると、 「ファイル名が長すぎる」とエラーが出るが、 ネットワークドライブを使うと、作れてしまうようだ。 ただ、それを実際に使おうとすると、ドツボに嵌るみたいだな。 @file = split(/\n/,`dir /s /b *.* 2>NUL`); な。次スレのテンプレに追加するから。 シェルとカーネルを縦横無尽に使いこなすのがPerlプログラミングの醍醐味。 print 1+(2+3); print (1+2)+3; この二つの文の違いを使いこなすのが、Perlプログラミングの醍醐味。 awk 由来の 0+ ハックや "". ハックは常識として使いこなすのが、Perlプログラミングのたしなみ。 工夫できないなら何を使ってもダメ sub to_s { $_[0].'' } sub to_i { $_[0]+00 } >awk 由来の 0+ ハックや "". ハックは そもそも、常識でないといいたげな、このレスは何? まともな参考本読めば、最初の方に書いてある。 ハックでもなんでもない Win-7、Active Perl 5.16です。Unicode文字を含むperlの処理結果を utf16leで出力しようとしています。下のようにやってみましたが、ダメでした。 出力をバイナリエディタでみると、改行コードが変な風にいじられていました。 binmode STDOUT => ":encoding(utf16le)"; print "ユニコード文字を含むテキスト\n"; 色々試した結果、下のスクリプトのようにすると、概ね動くことが解り ましたが、動かない場合もあります。下の例では、「aaaaa」は出力され ますが、「bbbbb」は出力されません。どうするのが正しいでしょうか? use utf8; binmode STDOUT; use Encode qw/ encode decode /; sub wprint{ foreach(@_){ s/\n/\r\n/g; print encode('utf-16-le', $_); } } wprint "a"x5, "\n"; foreach (1..5){ wprint "b"; } wprint "\n"; >改行コードが変な風にいじられていました perlではどのOSでも改行をLF(\n, 0x0a)として扱っている Windowsでは通常出力する際に自動的にLFをCRLFに変換している 0x0a (perlの\n) 0x0a 0x00 (utf16にエンコード) 0x0d 0x0a 0x00 (0x0a を 0x0d 0x0a に変換、正しくは 0x0d 0x00 0x0a 0x00 にしたい) wprint関数のやり方が上手くいくのは 0x0a (perlの\n) 0x0d 0x0a (s/\n/\r\n/g で置換) 0x0d 0x00 0x0a 0x00 (utf16にエンコードし、自動変換も無効にしているのでこのまま出力される) >「bbbbb」は出力されません 様々な事情で特殊変数 @_ の各要素やループ時に設定される一時変数 $_ は元の値の別名として扱われる つまり同じ値を参照しているため、それらに代入や置換などを行うと元の値も変更されてしまう 元の値が変数ならそれが変更されるだけで問題はないが、定数の場合変更できないのでそこで死んでしまう wprint関数では @_ でもループ内でも変数として受け取っていないため置換処理で引数の値を変更しようとしている 'a' x 5 は評価されたときに変数に入れられたように扱われるので問題はないが、直後の "\n" はまさしく定数なので変更できず死に、以降の処理が止まる 関数内で最初に my @args = @_; のように一度変数で受け取るのが意図しない変更を防ぐ意味でも良いだろう >>673 672です。 よく解りました。 ありがとうございました。 print print (1+2)+(4+5)+6+7; 3 23 print print print (1+2)+(4+5)+6+7; 3 23 1 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) $hash{'aaa'}{'bbb'}{'ccc'} = 1; みたいなことをしても、普通に通るのが凄いよな それでいて、仕様としては別に多次元ハッシュなんか対応してない なにをするんでもいちいちチェックが入って膨大な自動操作が裏で行われてる証拠。 さらに変数と実体を結びつけるデータテーブルもかなりの容量を使用してる。 木構造の探索などをやると、動作がCの10倍程度違うと言われるけど、やってみたらメモリ容量が100倍以上違うことも確認された。(将棋の盤面探索)。 まあ一時的にスクリプトが欲しいときとか、それが良い時はそれで良いけど、 通常のソフトウェアを作る時内部でそんなことが起きれてば完全な欠陥なわけであって。 そうか、100倍以上違うのか。試してみたいからソースコードを見せてくれ。 >>678 えーと、インタプリタとコンパイラって知ってるかい? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる