【モダン推奨】Perlについての質問箱 50箱目
レス数が1000を超えています。これ以上書き込みはできません。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )
回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2
▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
[プログラミング自体の経験が無い奴はまずココを読め]
Perl プログラミング講座: ttp://www.site-cooler.com/kwl/perl/
モダンPerlの世界へようこそ http://gihyo.jp/dev/serial/01/modern-perl/0001
[本]
リャマ: ttp://www.oreilly.co.jp/books/9784873114279/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/
[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/dist/perl/
perldoc.jp: ttp://perldoc.jp/
perldoc.perl.org: ttp://perldoc.perl.org/ [モジュール]
CPAN.com: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/
[テクニック]
Perl メモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perl のページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perl の小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl 5.8 Unicodeメモ]
ttp://www.rwds.net/kuroita/program/Perl_unicode.html (修正)
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
1レスで理解できるutf8フラグ
utf8フラグとい名前がまずかったね。
文字列フラグなどという名前だったらよかった。
文字列フラグはPerl固有のものだから
Perlコード外部から渡されるのは文字列ではない。
文字列でなかったらなにか?それはバイナリ。
バイナリを文字として扱いたければ、文字に変換しないといけない。
それがdecode。
ではソースコードに書いてあるのは、文字かバイナリか。
それはuse utf8を使えば文字で、そうでない場合はバイナリ。
話はこれだけ。
はてなキーワード > モダン
ttp://d.hatena.ne.jp/keyword/%A5%E2%A5%C0%A5%F3
書いているひとは 1. の意味で書いていそうだけど、読む人は(書いた時期
を考慮して) 2. や 3. の意味で解釈している。
よく印刷した資料に「最新版」とか書くひとがいるけどそれと似てるのかも
しれない。たくさんの最新版のうちどれが最新版なのか分からなくなる。
この場合の正解は版数を書くこと。
モダンの場合は、個別の技術の名称を書くことに相当する。
そうしないと「えっ?いまどきモダンPerl使ってるのかよ、お前w」なんて
ことになる。 個別の技術は是々非々で議論しましょう。
現状は、モダンという名のせいで盥水とともに赤子を流してしまっています。 モダンPerlと呼ばれているものは、過去の一時期のスタイルと結びついていて
今はもう使われていない。一方、レガシーPerlと呼ばれているものは現在でも
利用されていて、その名とうらはらに全くレガシーな気がしない。
思うにこれらの名称は、実態を正確に示していない点で失敗だと思う。
そういえば、モダンRubyやレガシーRubyという言葉は聞いたことがない。
名前重要っていうのは本当なんだな。 ルビーはバージョン毎に違うからなあ
新旧をバージョン番号以外で呼ぶ事は今後もないんだろう 2012年なんだから、そろそろ新JISキーボード使おうよってスレですね。
わかります。 問題を解決する方法がモダンかどうか、誰もこだわっていない件 結局、モダンって何だったの?
本を売りたかったとか、会社作ってみたとか、そういうことなの?
失敗だったの?
もうモダンには会えないの? _ , 、
r‐v'´ ̄ `~ く
_. 7,‐、 r‐、 ヽ だったら Perlのはじめて を
(._ ^ヽ|{ 0 _l 0ノ i
ヽ (´ ̄ `_, ヶ ノ 見に行こうよ
`、`ー-ヾ._.// )
/ (_.ノV^) 「クルクルバビンチョパペッピポ、イア!イア!ハスターの
i _ 「
L_ _/ \_ _.ノ
ここはね、パークハイアット東京。
The Perl Confernce Japan の会場だょ。
まもなく、まつもとゆきひろさんのRubyのセッションが始まるょ。
(コーヒーがおいしいょ。) Perlの長所であり短所であるTMTOWTDIによるコードの難読化を共通ルールっぽいテンプレで改善しようという風潮 変なこと考えるより、ポータブルCみたいにポータブルPerlで書けばいいと
思うんでそうしてる。書きやすいし読みやすい、おまけに長期的に保守
できる。これもTMTOWTDIのひとつの形態。 >>28
動いているものに手を入れるな。
手を入れるときは該当箇所にだけ入れろ
決して他の部分をいじるな。
ほとんど同じ処理でも既存の部分を
修正するなコピペして作れ。
これこそモダン モダンが嫌いな人って、新しいものが嫌い。
だからデザインパターンもリファクタリングも
アジャイルも嫌い そう捉えてるとするならば、ちゃんとコトを理解できていない Perlの評価の8割はCPANだよね
Rubyの評価の8割はRailsだよね 加えてPerl6もマイナス評価だからPerlはPerl5が支えているといっても寝言ではない 「モダンPerl」の"モダン"はあさってな方向に行ってしまっているので、
一般的な単語のモダンとは意味が違っている。だから>>31の言っている
ことは間違い。 >>35
うそつけ。このスレを潰そうとする連中はみんなPerl4時代のコードしか書かないじゃんか。 Perl4も現役で使われているのでモダンですよ。
モダンではないのは(らくだ本が出版されていなかった)Perl3以前ですよ。
もちろん異論はありませんね? 現役でサポートされてるディストリで
Perl4が入っているものを教えて下さいよw 5.8が出てから今年で10年。
それより前は昔の実装でおk。 ディストリインストールできる人はPerlもインストールできるんじゃね? まさかオマイラ、ディストリ付属のperlをそのまま使ってる、なんてことないよな? ディストリのパッケージ以外からperlとかモジュールとか入れたらシステムの安定性が壊れる
パッケージが提供されてないモジュールを野良ビルドで入れたりしない
cpanm、perlbrew、local::libを使うなどもってのほか
↓のスレ読んで出直せ
http://toro.2ch.net/test/read.cgi/tech/1217851121/544- >>45
押すなよ絶対押すなよみたいな言い方ですね。
つまり、それらは便利ってことですね!
>>45
root管理のパッケージと混ぜないために、cpanmやlocal::libを使うのよ。
ユーザ権限でユーザ領域に突っ込めるから、バックアップも楽だし、
いらなくなったらユーザごと消せばいいし。
Perl自体は、特に必要ない限り、システム付属使ってるけど。 ユーザが移行するのは、今までよりも分かりやすいもの、使いやすいもの。
今までよりも新しいもの、多機能なもの、ではない。 モダンなものってたいがいわかりやすくて
使いやすくなってるよね。
Time::Pieceとか。 でもそうじゃないから、"モダン"っていうラベルを付けて強引に勧めて
いるんだね。分かりやすかったら、使いやすかったら、ほっておいても
自然に使われるだろうから、わざわざ無理強いする必要はないもんね。 > 分かりやすかったら、使いやすかったら、ほっておいても
> 自然に使われるだろうから
それじゃ時間がかかりすぎる。
ようはオールドタイプはさっさと消えろってこと。
ネットの古い情報もさっさと消えて欲しいし、
今頃古いやり方を教えるやつもさっさと消えて欲しい。
だから俺は古いやり方を教えている奴を見つけたら
今はこうやる。こっちのほうがもっと簡単だと
情報を広めている。 新しいけど使いづらいって、自分で言っているようなもんだな CPANをすべてRubyが補完してくれたらどんなにいいだろう。 end
end
end
end
あぁ、終わりだもうだめだぁ まあモダンなPerlを知らなければ、
Perl使いとみなせない時代にはなってるよね。 もちろん情報は日々取得してるから知られてはいるんだろうけど、
使いやすくなかったらいつまでたっても使われることはないよね。 使われてるけどね。
Perlで作られてる他のプロジェクト見たこと有る?
(昔に作られて放置されてるのは除く)
Jcodeとか海外じゃ全く使われてないから。
確かに Time::Piece 以外は見たことがないね >>58
海外で使われていないと、自分が日本語を処理するときに使っちゃいけないの?
日本では使ってもいいんでしょ?
そもそもモダンっていうのは禁止して不便にすることなの?
それにJcodeはオブジェクト指向なんだし十分モダンだと思うけどな モダンPerlでいうところの"モダン"は、
1.リリース時期のことをいっているのか
2.実装手法のことをいっているのか
3.はたまたインタフェースのことをいっているのか
ところで、インタフェースっていうのは
a.新しければ新しいほど好ましいのか
b.古ければ古いほど好ましいのか
このあたりの見解が一致しないと、具体的なモノがモダンなのか
そうでないのかが変ってしまうし「これはモダンだ」と言ったか
らって、そのものに価値があるのか無いのかは別問題になる 1.がモダンでも2.がモダンでも利用者にとって関係なく、単に供給側
の自己満足になってしまう。3.のことだとすると新しいもの好きはa.で、
人柱をかってでることになるわけで、そうでないならb.で問題ない。 >>62
Rubyはモダンだ。
そこからいえばRubyに近いことを
Perlでやるのがモダンだ。 あるよ。
開発速度が上がった。
少ないコードで、今まで以上のことができる。
なにより、プログラミング一般とPerlに関して
深い知識を手に入れられたのがいいね。
オブジェクト指向言語、関数型言語、
継承。ポリモーフィズム。mixin、
アスペクト指向、O/Rマッパー
フレームワーク、MVC・・・etc
Perlだけじゃ、世界が狭いからほかの言語をやるといい。
そうして戻ってくると、自然とモダンPerlな体になってるよ。 考え方が間違っていたかもしれない。
モダンPerlとは、Perlがモダンなのではなく
プログラマ的にモダンな開発手法、
それをPerlに取り入れたものではないのか?
よくよく考えたら、最近はやりのほかの言語の機能を
PerlでやれるようにしたがモダンPerlなモジュールではないだろうか。 モダンPerlはアンチPerlなのか...
それでPerl原理主義者の抵抗にあっているという構図か 便利ならそれでよくて、モダンという線引きは要らないってことでおk? どうにも架空臭がするモダンPerlだが最近ますますそう感じている。
(モダンPerlを構成するといわれる)個別の要素の議論で十分だと思う。
ひと括りにしてしまうせいで大事なものまで一緒に捨てられてしまう。 モダンPerlではなく、
Perlでモダンプログラミングといえば、
面白いように情報弱者が落ちていく。 単に"モダンPerl"と言いたいだけにしか思えない
Perlのリリースが予定通りじゃなかったり、らくだ本の改版に10年もかかっ
たりするからって、無理して話題を作る必要はない
5.14.3がリリースされない今はらくだフォーでつなぐのが吉 Perlのオブジェクト指向はどう考えてもいびつでおかしいのに
それを主張しても理解できない人の戯言にされてしまう。 お好み焼きは食えるけど、モダンPerlは食えないね。 >>73
人間としての品位を疑われるぞ
社会に適合してないんじゃなイカ? >>78
Perlのオブジェクト指向はいびつ
↓
じゃあいびつじゃない形にしましょう。それができるのがPerlの凄さだ
↓
そうやってできたもの=モダンPerl
>>78
お前はPerlを使いこなせてないだけ。 またそんな青くさいこといちゃって、このフォーティーンめ モダン推奨者は自分が社会に適合しようとするんじゃなくて、社会を
自分に適合させようとしている。
結果、当然うまくいかなくて挫折する。
その繰り返し。 >>85
そうそう。
CPANモジュールで楽せず全て一から自分でコードを書くのが社会の常識だからね。
モダン、モダンとか言って周りに合わせられないのは単に能力がないだけでしょ >>87
ねぇ。
自分でコードかけないからCPANモジュールなんぞ入れようとするんだよ。 ググって何も出なかったら「ありません。」で終わりだもの、今のひとは。 >>89
ばかばかしいよね。
何も出なかったら自分で書けよ、と。 >>87
モダン、モダン言わなくても、周りに合わせられなければ、単に能力がないだけ。
つまり、モダンプログラミングと、周りに合わせられない事は別問題。
>>90
そこは迷うところだな。別の手を考えるか、そのまま自分で実装するか。
ある意味チャンスだ。 どうやってCPAN使いこなせるようになるんだよ…。 今までのインタフェースで実装できなくてだめだめなのをモダンPerlとか
言って取繕ってるだけでしょ perl6のコンセプトを先取りしてるものではないの? ttp://www.amazon.co.jp/dp/486267108X/ 新しい手法・置き換えるモジュールがあれば、それを採用しましょうってのがモダンPerl。
Fatalプラグマよりautodieプラグマ。
switch,caseよりgiven,when。
evalとif($@)よりTry::Tiny。
という感じ。
置き換えられないモジュールを置き換えようとするのは多分違う。 次スレがあったら、テンプレにこれも追加で
http://perl-users.jp/
で、>>3はこのスレ的には整理した方がいいだろうね www.amazon.co.jp/Modern-Perl-Chromatic/dp/0977920178/
どんな本なんだろう モダンPerlは無駄なもの
なぜなら業界歴20年の俺が理解できなかったからだ
そこから役に立たないものだと結論づけた プログラムはプログラマだけのものじゃなくて、依頼者や使用者のものでも
あって、依頼者視点での保守、使用者視点での保守をしていかないとならない。
その場限りのソフトウェアならモダンPerlでも構わないかもしれないが、
保守するのであれば、流行で作ったものは時間が経つと「変な髪形」になっ
てしまう。それが分かってないのは、おまいのしりが青い証拠だ。 >>106
受託ってやつ?
ウェブサービス作ってるんじゃないの?
俺にとってプログラムは自社のもので、自分たちが
開発しやすいように最善の方法を目指してるんだけどさ、
客に足を引っ張られるのって、ちょっと可哀想に思う。
>>106
そういう時はバージョンと使用するライブラリを指定すればいいんだよ。 依頼者は何も指定しなかった場合、
古いPerllで作ろう。
それが依頼者のためになるんだ。 >>106
客が要求するのがモダンではないと決めてかかってる。
客がモダンを要求したらどうするつもりだ?
単にお前は、モダンPerlが書けないだけ。 逆になんでモダンにこだわるの?変なとこにこだわって成果がでないんじゃ
本末転倒じゃないの?成果とモダンとどっちが優先なの? >>113
単におまいはモダンっていいたいだけちゃうんか
この青尻め >>115
モダンを諦めれば、成果が出るとでも思ってるの?
むしろ、モダンを使う=成果が出る
なんだが。 一旦モダンって名前を頭から消して普通にPerlコードを書かせてみるとする
そいつのコードがKENTみたいなやつだとして、それが他の人が誰でも保守できるようなシロモノになるとは到底思えない >>117
そんなこと言ってないだろ、どこを読んでんだ?青尻くん 青尻くんとこは結構自由みたいだけど、個人事業主なの? これまでの積み重ねがないと例えば会社が終わりになったときに技術的にも
全てを失うことになるよ。 モダンなんかやってて技術の積み重ねになるわけがない。 わざわざ不便なものを選んで苦しむのが積み重ねか
古いんだよそんなスポ根的発想は! 青尻くんは、プログラムは実現したいこととその解決方法の両方を記述する
ためのものだってこと、ちゃんと理解してるの?そうか、してないのかまだ
青いのか。 普通にわかれよ。
モダンperlがいいものだとしたら普通に普及する。
駄目なもので無理やり普及させたいのには訳がある。
本や講演などで稼ぎたい人もいるってこった。
> モダンperlがいいものだとしたら普通に普及する。
実際に普及してるよな。
半径5m以内の、CPANモジュールも使えない環境を見て言ってるんだろうな。 そうだな。青尻くんが青筋立ててキーキーいう必要はないはずだよな? かわいいの♪ステマつげるぅ〜♪
いーないーな♪それいいなぁー♪
つげるタイプの魔法だょ〜♪ ステルスマーケティング用語か。個々の技術とまったく関係ない話だな。
要は互換性のなさをごまかそうとしているんだな。ばればれだぞw >>118
で、きみの書いた誰でも保守できるようなコードはどこにあるの? 長期に渡る保守が予想されるソフトウェアは一時期の流行に合わせて
書くのではなく、将来を見据えた記述をするのが正解。 意固地に10年前の書き方を押し付ける必要はない
今使える書き方と今使えるモジュールで書けばいい
今使えない書き方で書けと読めてるお前がおかしい
ワンライナーや売り切り逃げ切りのソフトならお好きにどうぞ モダンは互換性がないのと将来のメンテナンスが不安なのが弱点か。
モダンゆえに時間軸の過去も未来もだめってことか。それは困る。 >>138
>互換性がない
何と?
>将来のメンテナンスが不安
将来のメンテナンスを考えると何を使えばいいの?
素のPerlや標準モジュールが思いつかないあたり、いい、すごくいいよ、
青尻くん。だんだん気に入ってきた。 たとえば標準モジュールの例としては、
http://perldoc.perl.org/index-modules-A.html
・文字コード関係
Encodeモジュール
(Jcodeは×)
・日付関係
Time::Piece、Time::Seconds
(もろもろある日付モジュールは×)
・オブジェクト指向関係
Object::Accessor、Class::Struct
データベース関係(ファイル以外)は、何もありません。
>>141が言っていることはこういう意味です。 がんばって標準モジュールを列記してみたものの、やっぱり素のPerlは
思いつかないところ、青尻くん、すばらしい。すごくいい。
「モダンPerl使いなのでlocaltimeは使えません。」キリッ
職場で一度言ってみたい。。。試用期間で終わるだろうけどw >>143
localtimeは、Time::Pieceで使うよw
標準モジュールのTime::Pieceが素のPerlを拡張してくれるのに、
今更配列のインデックスで年取得して+1900とかする
冗長なコード書くバカいるのかい? >>143
お前がTime::Piece知らないってのが
モロバレだなw
はい、このように、モダンPerlを嫌ってる人=無知なだけ
ってことなのです。 > 素のPerlや標準モジュールが思いつかないあたり
って言っておきながら、標準モジュールをあげたら今度は
> がんばって標準モジュールを列記してみたものの、やっぱり素のPerlは
> 思いつかないところ
もしかして、自分の知らない標準モジュールばっかりで
方向転換したのかいな? モダンPerlとそうでないPerlとの違い、メリットについてもっと教えておくれ 標準モジュールを使いこなすのがモダン。
そうでないものは単に勉強不足なだけ。 なんだ、そうだったのか。てっきりlocaltimeも満足に使えないのかと
思ってたよ。失敬、失敬、こりゃ失敬。 念のため言っとくがlocaltimeから
リストコンテキストで取得するのは古いやり方だからな。
最近のやり方はlocaltimeからTime::Pieceオブジェクトを返す方法。
もちろん標準モジュール。 で、Time::Pieceのインタフェースってlocaltimeと互換性あるの?
例えばリストコンテキストで使うと同じように値が戻ってくるの? >>152
% perl -MTime::Piece -E'say (localtime);say scalar localtime;say localtime->datetime' 職場にようやく5.8が入ったんでよーし、これからはモダンPerlだぞ!と
意気込んできたらTime::Pieceは5.10以上と知ってがっかり。
らくだ本に載ってるTime::localtimeを使って愛想笑いでごまかすしかない。 その職場に5.10が入るのは10年後であった。
そしてcpanmやperlbrewを入れることは全面禁止されていた。 そんなんで仕事できるの?w
少なくとも効率が悪いね。 古い所が新しい所に
あっさり追い抜かれる原因の一つである。 やっぱりモダンっていうのは供給者側の視点であって、利用者側の視点が
抜け落ちているな。残念。 利用者?
俺は利用者なんだが。
勉強しない奴に合わせる理由なんてないよ。 おれに合わせる必要はない。逆におれはおれでperl4が使われているところも
あるから、がんばってlocaltimeで書くと。需要ベースで考えるしかない。
残念。 まあゆっくりやっていこう。モダンPerlにタイムリミットがあるわけでなし。 古いPerlにはタイムリミットあるけどな。
Perl4のサポート期間は10年ぐらい前に終わっていそうだけどw perl4の需要はすでに99.9%無い
かろうじて残っているような需要に対応する必要はない。 >>161
Perl4に拘るのはせいぜいあなた個人あるいはお客様だけでありますように
あなたの後をうける人、あなたの下につく人が不幸にならないことを祈りたいですなぁ windowsXp:ActivePerl環境で、perlをタスクスケジューラからバックグラウンドで実行させたい。
wperl.exeで実行すればよいとgoogle先生が教えてくれたんだけど、
↓でやっても実行時にウィンドウが一瞬だけ開いてしまう。
C:\Perl\bin\wperl.exe sample.pl
↓だと↑より長くウィンドウが表示されるので、wperl.exeが効いていないわけではないっぽい。
C:\Perl\bin\perl.exe sample.pl
うーん、なぜだ
誰か教えてください
タスクスケジューラに設定したのはwperl.exeではなくバッチファイルと予想。 % pp --gui --verbose --output=sample.exe sample.pl
でスクリプトをexeファイルにする。
ttp://search.cpan.org/~rschupp/PAR-1.005/lib/PAR/Tutorial.pod デバッガあててみたら↓が原因だった
our $mech = new WWW::Mechanize(autocheck => 1);
手前は中で何やってるんだよ・・・
これ以上解析するのはめんどいが、
ウィンドウが表示されるのは耐え難いので
暇なときに中をのぞいてやる
>>170
なんかすごそう
暇なときにやってみる ハッシュにblessしたオブジェクトのプロパティに対してlvalue属性つきのサブルーチンを用意しようとしています。
単純なアクセサなので呼び出されたときにAUTOLOADで補足してインストールするようにしています。
package Config;
sub new { my ($class) = @_; bless { name => 'foo', }, $class; }
sub AUTOLOAD {
no strict 'refs';
my ($self) = @_;
our $AUTOLOAD;
if ($AUTOLOAD =~ /.*::(.*)\z/) {
*$AUTOLOAD = sub : lvalue { my ($self) = @_; $self->{$1}; };
}
goto &$AUTOLOAD;
}
sub DESTROY {} # 一応・・
package main;
my $obj = Config->new;
print $obj->name,"\n"; #=>'foo'
$obj->name = 'bar';
print $obj->name,"\n"; #=>'bar'
これは正常に動作しますが、mainパッケージの最初のprint文をコメントアウトした場合や
新たなプロパティをセットしようとした場合↓にはAUTOLOADが呼ばれず(AUTOLOADに行く前に?)エラーとなります。
$obj->update = '2012/4/8'; => Can't modify non-lvalue subroutine call at...
回避方法あるでしょうか? 投稿の際に行数を節約しようと修正した部分で動かないところがありました
×*$AUTOLOAD = sub : lvalue { my ($self) = @_; $self->{$1}; };
my $name = $1;
*$AUTOLOAD = sub : lvalue { my ($self) = @_; $self->{$name}; }; package _Config;
our $AUTOLOAD;
sub new { bless { name => 'foo' }, shift }
sub AUTOLOAD : lvalue {
my ($self) = @_;
(my $name = $AUTOLOAD) =~ s/.*://;
my $sub = sub : lvalue { shift->{$name} };
{
no strict 'refs';
*{$AUTOLOAD} = $sub;
}
$self->$name();
}
sub DESTROY {}
ここまで来ると普通のハッシュでよくね?
あと、ネタすれなんで、本スレで質問しる。 >>174
おおーありがとうございます。AUTOLOAD自体をlvalueにするというのは気づきませんでした。
実際のプログラムはもう少し複雑ですが、正しく動作しています。
>>普通のハッシュでよくね?
たしかにw
一応オブジェクトであってはほしいのですが、ハッシュ記法であれば何の不都合もなく
$obj->{name} = 'bar';
と書けるわけですしね。
オマケでメソッド呼び出しも、と考えてたらハマってしまった格好です Apple 社の Mac OS X は、 ベースの一部 が FreeBSD です。Apple 社独自の
ユーザインタフェースとともに、豊富なUNIX(R)基盤が取り入れられています。 >>171
事前にSTDOUT、STDERRをつぶして
おいたらどーなる?
ウインドウアプリで、そこに吐くと、
自動的に新規コンソールが開く、
とかだったような。
>>179
タスクのウィンドウが表示されなくなってうれしいものの、その他の
ウィンドウも一切表示されなくなりました ;_;
(D-SUB抜いて試しました)
∧∧
( ゚Д゚ )∩
⊂ ノ
/ 0
し´
えっ…と、
ここかな…、と
∧∧ ∧∧
∩゚Д゚≡゚Д゚ )
`ヽ |)
| __ |〜
∪ ∪
ドスッ
∧∧.ミ. _
( )┌┴┴┐
/ つ.再開│
〜 ./ └┬┬┘
∪∪ ││_ε3
゛゛゛゛ 最近のPerlでOOP用ライブラリってどんなのが主流ですか? Mooseだろ?
最近のライブラリでそれ以外使ってるの有るのか? Mooseが重いと思ったらMouseとAny::Mooseの組合せで代用もよし cpan でモジュールインストールしんたいんだけど
install やら make やら make install やら全部 OK
でたのに
perldoc -l インストールしたモジュール名
やるとそんなのないて怒られる。
なんで? >>190
普通 perldoc -l DBI などは成功すると思うよ。
どうやって入れたの? モジュール名は? >>191
cpan>install Math::Vector::Real
でいれて
全部 make やら make install やら全部 OK と出たが
ないようだった。
cpanplus でインストールしてみたらいけたのだが原因がわからない。 Regexp::Assembleでマッチした時って
後方参照使えるの? perl 5.10.1 を使っています。
$str = "ABCD"; の時
@a = $str =~ /AB|CD/g;
を実行すると、@a = ( "AB", "CD" ) と2つの要素が返されますが、
@a = $str =~ /AB|BC/g;
だと、@a = ( "AB" ) しか帰ってきません。
(ABがマッチしたら、その次のCからサーチが始まるため)
@a に ("AB", "BC") と、マッチするものすべてを得たい場合、
どうすればよいでしょうか。
なんか面白そうなお題なのでとりあえず最悪くさいものを作ってみた
素晴らしい人がボロクソにけなしてくれると期待しつつ投げてみる
$str='ABCD';
{
my $tmp=$str;
while($tmp=~/AB|BC/){
push @a,$&;
$tmp = $&.$';
$tmp=~s/^.//;
}
}
print join' ',@a; >>194
場当たり的に色々試していたら
@a = $str =~ /(?=(AB|BC))/g;
で、(AB,BC) が取得できました。
(?= で、次の走査開始点を移動させないようにしたから、でしょうか? 一過性のモダンPerlはもう終わり。
らくだ本の発行によって本来のPerlへの回帰が始まっている。 本来のPerl=5.0でも動く範囲でしかコード書かない そういえばPerl5のスレってないね?やっぱりまだPerlの方が使われてるのかな? モダンPerl書いたひとはどうしてるの?最近見ないけど、やっぱりだめなの? まあソースをみて改良したりとか前向きな動機はほぼゼロで99.99%はこのメーカー
困らせてやれって開示請求なんだろうな。
USP(Universal Shell Programming)研究所は、UNIX/Linuxの基本思想である、
「小さな道具」(コマンド)を組み合わせて「問題を解決する」(シェルス
クリプト)手法の研究・普及を行っています。この開発手法(ユニケージ
開発手法)は、従来のウォーターフォール型開発や、オブジェクト指向言
語・データベースソフトを用いた開発手法と一線を画し、圧倒的な開発生産
性 圧倒的な柔軟性を特徴としています。
ttp://www.usp-lab.com/ 本スレも、荒しに常駐されてぐだぐだだし、
WebProgの方も同じみたいに、スレ違いの会話が
ぐだぐだ続いて終了したし、終りかなあ。
ここのスレの方がまだ真面にperlの話をしてた気がするよ。
まあモダンには2つあって、ひとつはすぐに古くなるモダン。
もうひとつはいつまでも古くならないモダン。
おれは断然古くならないモダンのほうがいいな。 軟便スキー独りか知らんが、
韓国ネタのコピペしたり
hoge煽りしたり
ググれ煽りしたり
馬鹿じゃねーの? そしてゆっくりモダンになっていく...
それが理想です 進歩というものは過去を捨てることではない。
過去に加えて積み上げるものなのだ。 荒しが950踏んで嬉々としてhoge禁止をテンプレに入れる姿が目に見える様だ
過去のソフトウェアと作法やインタフェースが異なる言い訳としてモダンと
いう用語を使うのはまずい。今までより苦労が増えるなら移行は進むはず
がない。 ところでこのスレが53箱目の続きってことでいいの? すまん、53箱目の続きあった。“54目”になってたんで検索に引っかからなかったわ。 以下のように時刻と曜日が書かれたlogファイルがあります。
Jun 6 00:07:41 xxxxx
Aug 8 00:14:34 yyyyy
Aug 8 00:16:26 zzzzz
〜
(以下略
現時刻から一時間前のログのみ抽出して、抽出したログの行数だけ出したいのですがこの処理って一行(ワンライナー)で書けますか?※重複とかは無視して単純に一時間分のログが引っこ抜ければ良いです。
詳しい人教えてください。 >>214
訂正
1時間前のログのみ抽出じゃ無くて一時間分のログを抽出です。
>>214
> この処理って一行(ワンライナー)で書けますか?
書けます。 >>216
やり方教えてください!
一時間前の日付時刻と現在の日付時刻を比較して条件を満たせば該当行を出力みたいなことをやれば良いとおもうんですが、どう書けば良いのかわかりません 横レス(別人)
$ perl -F'/[\s:]+/' -MTime::Local -lane 'BEGIN{ %m = map{uc $_, $i ++} qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);} next if ( time - timelocal @F[4,3,2,1], $m{uc $F[0]}, 2012 - 1900 ) > 3600 ; print ;' *txt
年は 2012 年を期待、 2013 年になったら知らん。
年跨ぎを念頭に入れるとなると log file の形式から作成しなおし。
win の人なら、シングルクォーテーションをダブルに
変えなきゃ動かんかも。
勉強したいのであれば、エポック秒、時間比較 perl あたりでググる。
>>218
レスありがとうございます。
参考にさせてもらいます。
でも2013年以降も使えるのが理想ですが… 年跨ぎのケースを考え無くて良いなら、コードの2012を2013にすりゃいいだけ。
というより、「年」は全部今年として扱えばいい。
年が明けてから1時間はまともにログを拾えなくなるけど。
そもそもログデータに「年」の情報が入っていないんだから、
厳密に処理するのは無理だべ。 >>218に対して言ってるのなら、
最初からそれを念頭に書いてないか?
コードは既にそうなってるし、
説明文の方は質問者に向けたもんだし、
改造しやすいように除算は態々、2012 -1900 にして残してあるし。
それともtime関数に、年を除外するオプションでもあんの?
>>223
年が変わるごとに 2012 を 2013 だの 2014 だのに書き換えるの面倒だろうから
「年」のところはログの日付も現在の時間も全部localtimeの「今年」という前提で
扱えば毎年コード書き直さなくてもよくなるだろっていってるんだよボケ。 perl -F'/[\s:]+/' -MTime::Local -lane 'BEGIN{ %m = map{uc $_, $i ++} qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);} next if ( time - timelocal @F[4,3,2,1], $m{uc $F[0]}, ( localtime(time))[5] ) > 3600 ; print ;' *txt
こういう意味ねw、了解した。
で、試しに自分でも書いてみた。
LC_ALL=C perl -MTime::Piece -e '$lt=localtime;$ty=$lt->year;while(<>){next unless m/(\w+) +(\d+) +(\d+:\d+:\d+)/;$t=Time::Piece->strptime("$ty $1 $2 $3","%Y %b %d %H:%M:%S");$c++ if $lt-$t<3600}print "$c\n"' logfile
218の方がすっきりしてるか。なぜかうちの環境だとエラー吐いて動かなかったけど…。
(Day 'Jun' out of range 1..31 at -e line 1 て言われた)
LC_ALL=Cは環境によってはつけとかないとTime::Piece->strptime()がエラー吐くんで。
行数が知りたい、だったので行数出力にしたけど、該当行を全部出したいんだったら
$c++以降を print if $lt-$t<3600}' に置き換えれば218と同じ出力になる。
行数はwc使えばあとからでもわかるしね。 >>225
了解してくれてどうも。
俺の日本語がわかりにくかったのか… >>226
> 218の方がすっきりしてるか。なぜかうちの環境だとエラー吐いて動かなかったけど…。
> (Day 'Jun' out of range 1..31 at -e line 1 て言われた)
なぜエラーが出たかわかった。自分でテスト用に切り出して作ったログファイルの
各行頭にスペースが入っていたからだった。(ありがち) >>227
違う。料理の合間に、斜め読みでレスした俺が悪い。
perl -MTime::Piece -lE 'my $lt=localtime; my $ty=$lt->year ; while(<>){next unless m/(\w+) +(\d+) +(\d+:\d+:\d+)/;\
my $t=Time::Piece->strptime("$ty $1 $2 $3","%Y %b %d %H:%M:%S"); print q{#####} ; print ; print $lt ; print $t ; print $lt-$t }' log file
#####
Jun 6 00:07:41 xxxxx
Thu Aug 9 03:45:48 2012
Wed Jun 6 00:07:41 2012
5510287
#####
Aug 8 00:14:34 yyyyy
Thu Aug 9 03:45:48 2012
Wed Aug 8 00:14:34 2012
66674
#####
Aug 8 00:16:26 zzzzz
Thu Aug 9 03:45:48 2012
Wed Aug 8 00:16:26 2012
66562
#####
Aug 8 22:15:14 zzzzz
Thu Aug 9 03:45:48 2012
Wed Aug 8 22:15:14 2012
-12566
うちの環境だとTime::Pieceオブジェクトの除算が変だ。なんで? >>230
あう〜。ホントだ。ウチでも同じだ。
Time::Piece->strptime()でTime::Pieceオブジェクトを作るとgmtimeベースになるっぽい。
ttp://digit.que.ne.jp/work/index.cgi?Perl%E3%83%A1%E3%83%A2%2FTime%3A%3APiece%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
だから引き算の結果がTZのoffset分ずれるのか…。strptime()でlocaltimeベースにするには…
$ LC_ALL=C perl -MTime::Piece -lE '$lt=localtime;$ty=$lt->year;while(<>){next unless m/(\w+) +(\d+) +(\d+:\d+:\d+)/;\
$t=localtime Time::Piece->strptime("$ty $1 $2 $3","%Y %b %d %H:%M:%S")->epoch;$t-=$lt->tzoffset;\
say q{#####};say $lt," = ",$lt->[Time::Piece::c_islocal];say $t," = ",$t->[Time::Piece::c_islocal];say $lt-$t}' logfile
#####
Thu Aug 9 04:57:20 2012 = 1
Wed Jun 6 00:07:41 2012 = 1
5546979
#####
Thu Aug 9 04:57:20 2012 = 1
Wed Aug 8 00:14:34 2012 = 1
103366
#####
Thu Aug 9 04:57:20 2012 = 1
Wed Aug 8 00:16:26 2012 = 1
103254
#####
Thu Aug 9 04:57:20 2012 = 1
Wed Aug 8 19:20:14 2012 = 1
34626
(こんな時間に何をやっているんだか)
もしくはstrptime()の方をいじらずに、
$lt=localtime; → $lt=gmtime;$lt+=localtime->tzoffset;
か…。gmtimeベースになっちゃうけど引き算の結果は正しくなる。
という訳で、けっこういろいろとメンドくさいもんですね。 同じぐらいの長さのワンライナーなのに
>>218がダサくて>>226がスタイリッシュに見えるのはなぜだろう レスくれた人ありがとうございます>>214です。
まだperlは入門書読み終わった程度なので右も左も分かりませんが、教えて頂いたコードを参考に色々書き方を研究したいと思います。 入門書読み終えたばかりの初心者には組込みのlocaltime関数を教えてあげないよ >>234,>>237
既に>>225が提示してるだろ?
学習するかは質問者さんの勝手。
>>232
目医者行け。
266氏を晒す訳じゃないが、ワンライナにwhile(<>){}直接埋め込んでる時点で
スタイリッシュじゃない。
225に相当するコードをTime::Pieceで書いた場合、
perl -F'\s+' -MTime::Piece -lanE 'state $lt = localtime; next if $lt - localtime( Time::Piece->strptime((join " ", $lt->year,@F[0..2]),"%Y %b %d %H:%M:%S")) > 3600; say'
226に略
perl -F'\s+' -MTime::Piece -lanE 'state $lt = localtime; $c++ if $lt - localtime( Time::Piece->strptime((join " ", $lt->year,@F[0..2]),"%Y %b %d %H:%M:%S")) < 3600;}{ say $c'
>>238
おおうスタイリッシュ。
state とか使ったことなかったけど便利そうだな。参考にさせていただきます。
ワンライナーはあんまし書かないのもあってオプションも -i -n -p -e くらいしか
普段使ってなかったりしますんで。-E すら滅多に使わないな…。nもpもなしに
while(<>)埋め込むのもループの前後で処理が必要な時とかは普通にやってるし。
その程度のスキルでもとりあえず動くものは書けるってのがPerlのメリットでもあり
欠点でもあると…まあこの場合メリットということで。TMTOWTDI。(覚えづらいよなこれ) なんで隔離スレで真面目に質問箱してんのよw
>>233
コード研究するんだったら、B::Deparseは必須。
% perl -MO=Deparse -lane '}{ print $.'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
our(@F) = split(' ', $_, 0);
}
{
print $.;
}
-e syntax OK
調べたいコードのオプションの先頭に、-MO=Deparseくっつけるだけ。
それにしても、バルサン炊いたみたいに、人がいなくなったな本スレと初心者スレ。
実際の所は、ハイエナが肉に夢中になってるだけだろうけど。 初めてのPerl第6版とPerl5.16.1のことだね。
Unicodeサポートの問題に今頃気づいたって読める。
第5版のときはまだ気づいていなかったのかな?
まあ、そんときは使ってなかったんだろうけどな。 今上天皇侮辱発言の祭りが落ち着いたから、戻って来たぞゴキブリ。
でも、まあ、5割くらい減ったんじゃねーかな?
ゆっくりモダンになっていく・・・
・・・モダンRuby。 モダンPERL追いかけてたら時代に取り残されましたとほほ >>245
その最後の「とほほ」だけで、もう10年以上は時代に取り残されてるよな とほほだってよw
もうお前5.6こそ最高とかいって周りに強要してろよ 5.6だと日本語がちゃんと使えません。仕事で使うなら5.005一択です。 どうやらモダンパールは時代遅れみたいですね
本家のパールはすでにその先に進んでます
テキスト処理90%のPerlが文字列を楽に扱えないなんてたちの悪い冗談でしか
ありません C++へのアンチテーゼの側面もあったPerlなのにモダンPerlはどうしちゃったのかな テクノロジーはスクラップアンドビルドなものと考える連中はとほほの内容が
古いと考えるようだ リャマ本第6版までモダンに毒されてるよ
おまいらリャマ本は第1版こそ至高・正義だ
定価より高くても中古で第1版を買え! 第1版ってのはバージョン4のピンク本のことか?あれは本当にいい本 赤らくだ本だとか赤リャマ本の序文、それにポケットリファレンスの序文でLarryはふざけ過ぎてしばらくの間O'reillyから干されていた。今回「まじめに書く」と誓ったためようやく第4版の執筆許可が下りたらしい。 結局らくだ本的にはモダンPerl(=perl5.8)はスルーってことか
最近は重いモジュールも避けられる傾向にあるしな 重いモジュールも避けられる傾向にあるしな(キリッ
とか言う奴は十中八九List::Utilとかを使わない 実際に書かせてみればろくなコード書かないんだろうな モダンperlと言われているもののうち一部の重たいモジュールを持ち出して
重たいモジュールは避ける傾向にあるからモダンperlも避ける傾向だよねー
なんてどんな詭弁だよ 確かにLarryはモダンPerlについて多くを語ろうとしないな
きっと軽いスクリプトが好きなんだろうなList::Utilとか使わない List::UtilはXSで書かれてるから自分でPerlで書くよりよっぽど高速なわけだが
てかとってつけたようにLarry様の名前出すなよw GUIやバイナリファイル扱うときにXSを使って効率を上げるのは分かるが
そうでないときにXS使ってスクリプトの利便性を下げるのは簡便だな。 第1ヒント:テキスト萌えたんのポータビリティ強化月間 「スクリプトが何かよく分かっていない」と書いたはらたいらに3,000点。 バイナリではないところがスクリプトの利便性って分かるかな?無理かな? 利便性の優先度
作る人の利便性 <<< 使う人の利便性 中身が古いか新しいかは使う人の利便性に影響はしないけどね 結局モダンかどうかは気持ちの問題だし、供給者側の主張次第でしょ
利用者側にとってはちゃんと使えればどうでもいいよそんなもん モダンパールは単なる自己満足であったか
そもそも書いたときはモダンでも後で読むときはモダンではないわな
モダンと言われると互換性がないんじゃないかと思って警戒するひとも
いるかもしれないしな バイナリでの文字列置換をしています
$str =~ s/\xFF/\x00/g;
という書き方ならうまく行くのに、
$src = '\xFF';
$dst = '\x00';
$str =~ s/$src/$dst/g;
ではうまく行きません
$srcの部分は思い通り検索できるのに、
$dstの部分はバイナリではなく \x00 という文字列に置換されます
どうすればいいですか 確かにそういうことなのですが、
何故$dstという変数を使うかというと、その中身が不定だからです
$dst に '00' とか '01' とかいろんな文字列が入った場合の置換の書き方はありませんか
とりあえず、pack("C", hex($dst)) と書いて eオプションで評価すれば
うまく行くのは確認したのですが、$srcみたいなスマートな書き方はできないものかと packするのが一番マシじゃないだろうか
ただ置換内ではなくその直前に追い出したいけど 後半が文字列で表現されている時に、
それをテキストとして見ていいのかバイナリとして見ていいのか、
両方の解釈が有り得るのが問題なんだな
書いたままだよ、というルールで統一されていれば納得するものを、
コードに埋め込んだ時はバイナリだけど、変数が来たら文字列、という解釈をして、
しかも、置換の前半部分は変数でもバイナリとする変態文法
逆に前半を文字列として認識させたい時はどうするんだろう すみません、何がなんだか分からないのでゆっくりと、そして複数の質問で
あるのなら分割して1つずつ質問してもらっていいですか?
中卒なんで eval "" と eval {} と /e で解決しそうに読めるんですけど よくある
$str =~ s/%([a-zA-z0-9]{2})/pack("C", hex($1))/eg;
こんな置換を、packやらhexやら使わずに書いてみそ
という問題 >>276
> バイナリでの文字列置換をしています
{
no utf8;
$str =~ s/\xFF/\x00/g;
}
eval qq{ \$str =~ s/\\Q$src\\E/$dst/g }; どうやってもスマートじゃないな
前半も後半も素直にpackしておくのが一番分かり易い
なまじ前半に書けてしまうのがおかしい 文字列とバイナリを区別する時点から問題が発生していると思うので、
区別しなければ解決するのだと思う 楽になるために区別するのならよいわけだけど、
区別したがゆえに苦労するのであれば、区別しなければ苦労はない。
過去にとらわれるのはもうやめです。進歩しませんよ。 どっちに解釈するか文脈で判断、ということをperlはあちこちでやっていて、
それは多くの場合正しいので表面化しないけど、
こんな風に不合理を露呈する場合もある プログラムはテキスト、処理するデータはバイナリ
対
プログラムはバイナリ、処理するデータはテキスト
深い質問だな、これは Win7上で、Strawberry Perl と SQL Server2008 を使用して開発をしています。
DBD::ODBCでDBにアクセスをして、データを操作しています。
質問
・DBIでSQL Serverのデータベースにconnectを作成し、あるキーとなる情報を取得するSQLを
prepare、execute、fetchrow_arrayを使用して取得し、取得したキーをもとに別なSQLを作成し、
実行しようとしましたが、「接続がビジーです」といった内容のエラーが返ってきます。
fetchrow_arrayでデータを参照しつつ、同一のデータベースから同じようにデータを取得する
ことはできないのでしょうか?
何か情報がありましたら、教えてください。
よろしくお願いいたします。
2つのSQL文をひとつにまとめるのが正攻法に思えるが「参照しつつ」をやめて「参照し終わってから」にすればいいんじゃないかと言ってみた。 Strawberry Perlは「接続がビジーです」に関わっていない件 プログラムはテキスト(簡便)、処理するデータはバイナリ(簡便)
プログラムはバイナリ(勘弁)、処理するデータはテキスト(勘弁)
$str = 'aaa[bbb[c]ddd]eee';
$str =~ s/\[.+?\]//;
こんな感じにした時に
aaa[bbbddd]eee
になって欲しい
gを付けたら、
aaaeee
になって欲しい
うまい書き方はありますか >>296
s/\[.{1}\]//;
オプションつけて最長マッチとかってあるのか? 中身が固定だと判ってるなら\[c\]でいいんだけどね $str = 'aaa[bbb[c]ddd]eee';
$str =~ s/\[[^\[\]]+?\]//;
print "($str)\n";
# /g とは違うけど
$str = 'aaa[bbb[c]ddd]eee';
while($str =~ s/\[[^\[\]]+?\]//){}
print "($str)\n";
スカラーで置換した数を返す、という仕様は
whileで使ってくれと言ってるようなもんだな >>292-293
ありがごうございます。
ただすみません、自分の書き方も悪かったのですが・・・
取得した情報で、その後の処理を変更しています。
そのため、発行するSQLもselectだけでなく、insert,update,deleteなどもあり、
単純にSELECTを見直すというわけにもいかず。
>>302
ありがとうございます。
こんなものがあったんですね。知らなかったです。
Perlのこと聞きたかったら、いつでもこのモダンPerlスレに来な モダン焼きは四角く切るのと放射状に切るのとどっちがいい? たこ焼き器で作るとひと口サイズなので切らなくともよい。 切り方変えても味は変わらないのでそのままかぶりつく 少数のエリートが良かれと思っても多数派の一般民が取り入れないと意味がない
ひとがプログラミングする訳だから、フィーリングを大事にしないとだめだな 開発効率のことだけで言うと
モダンPerlの方が効率がいいね。 Time::Pieceの実験用モルモットになるよりlocaltimeをツールとして安心して使うタイプか もうPerlは5.16の時代ですよ。
5.12とそれより前はサポート終了しました。
10年前のPerlのことなんか、
考える必要ないんですよ。 5.6とか使いたい奴は自分らで勝手に使ってたらいい
ただし5.6を他人に強要したり、5.6向けに書いた古臭いスクリプトを他人に押し付けて保守させたりするな とにかくコードが手元の環境で動くのが正義
そして長期間に渡るメンテが可能で楽なのが正義
localtimeは標準モジュールより格上の標準関数
ポータブルPerlこそがこの世の正義
319による保守は誰も期待していない ポータブルPerlって
Perlのバージョンはなんだ?
言ってみろよwおらおらw >>322
> とにかくコードが手元の環境で動くのが正義
> ポータブルPerlこそがこの世の正義
矛盾してる >>322
> ポータブルPerlこそがこの世の正義
つまり手元の環境で動きさえすればいいってもんじゃないってか? >>322
> localtimeは標準モジュールより格上の標準関数
格上わろす リストコンテキストとスカラーコンテキストの違いとか printf とかはモダン
うんぬんの前に知らないとだめだろ。
モダンなゆとり世代。壮大な実験に付き合わされたモルモット。かわいそす 刹那的なモダンPerlでは自分が書いたスクリプトを数十年に渡って保守する
ことは不可能と悟り本来のPerlに戻ってくる。で、localtimeで書く。 >>332
perl本体に組み込まれた関数が何十年後も互換を維持してるとは思えないがな 寿命が6〜8年のモルモットの推測が当たるとは思えないがな 数十年後も使い続ける物はCで書いとけよ。
Perl5自体、メンテされてるかどうか分からんぞ。 mooseとか使いまくってる俺が通りますよ
早くPerl6出ないな〜 Cで書いたら実行環境の違いを記述するコードでアプリケーションが
埋め尽くされるんだろーなー >337
Linuxのソース見たけど、
一部の層で吸収しているから
ほとんどのコードは実行環境の違いなんて関係ないよ。
ま、お前にはそんな芸当出来ないだろうがな。がはははははwwww ゆとりだからLinuxしか習わなかったんだよね?かわいそす 「Linuxしか習わなかった」と判断した理由を書いてください。
ゆとりの脳内はよくわかりませんのでw
あ、書かなくても(逃げても)構いませんよwww 書いてもいいんだけど、Linuxのソースが、Linux以外のオペレーティング
システム上でperlを実行したときの実行環境の違いを吸収できると考えて
いるひとには理解できなそう やっぱゆとりだったかw
実行環境の違いなんてそれを埋めるレイヤーに固めるから
アプリケーションがそんなコードで埋まることはないってのが
一番の趣旨だろ。
こういう作り方ってのは普通にやることだし、そんなことが
思いつかないってのは自分でやったことがないってことw
そこからこのセリフにつながる
ま、お前にはそんな芸当出来ないだろうがな。がはははははwwww
興奮してるのか脳に障害があるのか分からないが
文章が無茶苦茶だな たぶんではなくて完全に無理です。コンテキストの理解を求める俺のほうが
完全に悪かったです。printf も覚えようとしなくて結構です。
どうもすみませんでした。 モダンPerlが脳障■者を集めるのか、脳障■者がモダンPerlを好むのか
これって日本だけの現象なの?モダンRubyとかも同じ状況なの? >>343
> こういう作り方ってのは普通にやることだし、そんなことが
> 思いつかないってのは自分でやったことがないってことw
>
> そこからこのセリフにつながる
罵倒を目的とした文章で代名詞の頻度が上がるのは、脳に良くない変化が起きていることを現すから気をつけた方がいい。 じいさんがボケ始めた頃「あれ取って」が増えたのと同じか? >>350
> 罵倒を目的とした文章で代名詞の頻度が上がるのは、脳に良くない変化が起きていることを現すから気をつけた方がいい。
そんなデータはありませんwww
大丈夫?
実行環境の制約(機器であったり、OSであったり、その会社の規則だったり)で
ポータブルなスクリプトを書かなければならないことはあるだろうけど、
制約によってモダンPerlで書かなければならないってことは現実にあるんだろ
うか?
その前にポータブルなスクリプトとレガシーなスクリプトの違いはちゃんと
理解できているのだろうか?
モダンPerlは結局のところ単なる自己満足なのだろうか?回答を求む。 > ポータブルなスクリプトを書かなければならないことはあるだろうけど
お前のポータブルの意味って何?
新しいPerlを入れればいいだけだろ。
お前が言ってるのは、ポータブルなスクリプトを書く。ではなく
古いPerlにも対応したスクリプトを書くって話。
ポータブルとは関係ない。
古いPerlって、どれくらい前のPerlの事を言ってるの?
CPANライブラリが動かないような古いPerlも視野に入れて開発しないといけないの?
どうして、そんな古いPerlに固執してるの?バージョンアップできないの?
正直モダンPerlって呼ばれてるような書き方をしてはいけないなんて制約がある方が特殊すぎ 自分の書くプログラムのスタイルなら、モダンだろうとクラシックだろうと好きに書けばよい。
でも、モダンPerl!モダン!モダン!って言う連中って、CPANとかのライブラリを使って書くことを
モダンだと言ってることが多い。
ライブラリを自分で抱えるのでなく、システムに入れろっていうのは横暴だし無理だろう。
すでに作られているシステムに、あとからCPANライブラリを追加したら、
既存のPerlスクリプト全ての再検証必要となるからね どんなモジュール追加したらそんな大げさなことになるんだよ。 今のモダンPerlの世界は
perlbrew + cpanminus + local::lib を使って
システムに入れずに最新Perlを使うのです。 『はじめてのPerl』にlocal::libとcpanmが出てくる時代になりました。 書いたときにモダンなのは当たり前だろう
モダン推しは時間軸の視点が抜け落ちているんだな >>358
Encodeモジュールのようなモジュールだろ
まあ、あえて名指しはしないけどな なんでEncodeモジュールを追加しただけで
再検証が必要になるんだ?
Encodeモジュールは最近のPerlには標準搭載されてるだろ。
まさか最新のPerlで動かないコード書いてるのか? >>318 >>319
フリーソフトはそもそも AS IS だからサポート切れとかはない
今までのどのらくだ本にも最初に書いてある
で、強要だの押し付けただのってしたことあったっけ? And if you have a problem that the Perl community can't fix,
you have the ultimate backstop: the source code itself.
-- Programming Perl 4th Edition Jcode,pmてまだまだ使われてるの?
さすがに require jcode はないよねー Inline CとPerlとの
XSUB変換がperlgutの必須必要事項だと
会社の上司に言われたのですが、最後の
READMEに乗ってる
ようにmakeコマンドが生成されません。基本は
h2xs -A -n ExtModuleを実行し、種々の
実行環境を整えます。
参考URL:
http://d.hatena.ne.jp/perlcodesample/20100809/1278596435 #include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
MODULE = ExtModule PACKAGE = ExtModule
int
twice (x)
int x;
CODE:
RETVAL = x * 2;
OUTPUT:
RETVAL
上記を保存したのちに、makefile.plを事項しますが
Writing Makefile for ExtModule
Writing MYMETA.yml
というログを残すだけでmakeファイルらしき物は一向に
生成されません。 ちなみに
コマンドプロンプトから
..
159 Changes
3,555 ExtModule.c
276 ExtModule.xs
lib
29,569 Makefile
864 Makefile.PL
97 MANIFEST
502 MYMETA.yml
187,518 ppport.h
1,211 README
t
のディレクトリが成立しています >>372
事項ではなくて、実行であります。
タイプミスすんまそん Makefile.PLはこの作業を自動化するmakeファイルを生成してくれます。
↑これが原因か
何とも罪作りな記事だな
そのページのコメント欄に質問として書いちゃえよ 注
※1 これはWindowsではうまく動かない可能性があります。 初歩的なミスを
した物のどの記事もWin系なのかUni系
なのかわからん記事ばかりで
一応
WindowにGnuWin32を通した物の
make: *** `makefile' に必要なターゲット `C:\Perl\libConfig.pm' を make するルー
ルがありません. 中止.
なんてエラーが
返って来る。結局Windowユーザーは
Xsubpp覚えなくてもいいってことか。 sudo apt-get install make active perlだと、今はコンパイラも付いてくるからそれを使う。
makeはdmakeを使う。 文字列がtest_1やtest_2やtest_3のように
test_○のような形になっているかを正規表現で調べるにはどうすればいいんですか?
○の中は数字のみです >>387←正規表現スレじゃなくてここできいてるこの基地害なに? さらに一文字減らせた!
($d,$m,$y)=(localtime)[3..5];printf "%04d"."-%02d"x2,1900+$y,$m+1,$d
print localtime->ymd
に対抗してコードを減らし中。
($d,$m,$y)=(localtime)[3..5];printf("%04d-%02d-%02d",1900+$y,$m+1,$d)
($d,$m,$y)=(localtime)[3..5];printf "%04d-%02d-%02d",1900+$y,$m+1,$d
($d,$m,$y)=(localtime)[3..5];printf "%04d"."-%02d"x2,1900+$y,$m+1,$d printfの後のスペースなくても動いた!
($d,$m,$y)=(localtime)[3..5];printf"%04d"."-%02d"x2,1900+$y,$m+1,$d そんなに短さにこだわるなら、無理やりprintfつかなくていいんじゃね?
sprintf馬鹿に感化されたのか知らんが。
($d,$m,$y)=(localtime)[3..5];printf"%04d"."-%02d"x2,1900+$y,$m+1,$d
($d,$m,$y)=(localtime)[3..5];print 1900+$y,"-",$m+1,"-",$d >>394
print localtime->ymd;
これでいいんじゃね?
useまで入れたとしても短い。
use Time::Piece;print localtime->ymd;
($d,$m,$y)=(localtime)[3..5];print 1900+$y,"-",$m+1,"-",$d せめてPOSIX。
use POSIX;
print strftime("%Y-%m-%d", localtime); どうせすぐ古くなるんだから。保守するのに時間軸の視点は必要だぞ。 struct tfield *を保持する
MyTypeをブレースしたマジック変数を作りたい。
以下の(中略)のXSソースを使ってPerl側から
Hoge*な struct tfield *head[30]をハッシュに
よって閲覧するにはどうしたら良いか。そして、
マジックをRETVALにアクティブにするはどうればよいか具体的に述べよ。
struct tfield {
struct tfield *left[30];
int num;
char str[30];
struct tfield *right[30];
};
struct tfield *talloc(void)
{
return ((struct tfield *)malloc(sizeof(struct tfield )));
} MODULE = MyTypePACKAGE = MyType
HV*
DataList()
PREINIT:
struct tfield *p,*head[30];
CODE:
hash=newHV();
sv=newSV(0);
ref=newRV_noinc((SV*)newHV());
sv_setref_pv(ref,"main::Tie",head);
sv_setsv(sv,sv_2mortal(newRV_noinc((SV *)hash)));
sv_bless(sv,gv_stashpv("MyType",TRUE));
sv_magic((SV* )hash,SvIV(SvRV(ref)),PERL_MAGIC_hints,NULL,0);
if(mg_find(SvRV(sv),PERL_MAGIC_hints)!=NULL)
printf("PERL_MAGIC_hintsp\n");
p=mg_find(SvRV(sv),PERL_MAGIC_hints)->mg_obj;
RETVAL=hash;
OUTPUT:
RETVAL ちなみに環境はActive PerlでWindows7を使っています 確かRETVALて
マジック変数だよな。Perl側にアウトライン
した時に恐らくマジックに変異してるジャマイカ?
そして、またXSに入りINT2PTRで閲覧しよう
とする。うんで、マジックが掛かってるとキズかず
隠蔽された構造体にアプローチしようとしてとする。
上手く考えが定まらず、マジックやら
文法そのものやらに、あっちやこっち浮気し
まくってたらいつの間にやら難題に押しつぶされそうになってた。
もう資料の少ないマジックに手をださないから
RETVALに代入した後の処置を教えください。 今から学ぶならやっぱPerlよりPythonなのかなあ? >>406
さすがにrubyやphpならともかく、pythonはナイわ 解析するならPythonじゃね?
クラックコンテスト上位者はみんなPython使いのようだし。 Django使うの以外にPython使う理由が見つからない 倍幅文字を含んだ文字列を端末にテーブル状に整形して表示したいのですが,
==================================
# ソースの文字コード: utf8
printf "%04s\n", 'ab';
{
use utf8;
printf "%04s\n", 'あ';
}
{
no utf8;
printf "%04s\n", 'あ';
}
===================================
00ab
000あ
0あ
use utf8 だと文字数でカウントしてるようなので
倍幅文字を含んだ行と含まない行とでズレてしまいます.
no utf8 だとバイトでカウントしているようなので
やはりズレてしまいます.
端末上に上手く整形して表示する方法はないものでしょうか?
非モダン質問箱の方は質問できる雰囲気ではなかったので
こちらで質問させて頂きました. my $文字幅合計=0;
my @文字群 = split //, $文字列;
for my $i(0 .. $#文字群){
$文字幅合計+=((unpack('C*', $文字群[$i]) - 30)*(unpack('C*', $文字群[$i]) - 127) < 0) ? 1 : 2;
}
文字のバイト列が31(\x1f)から126(\x7e)なら1でそれ以外は2を返す そういうのもうあるみたい
ttps://github.com/kaz-utashiro/MBPrintf 与えられた文字列から適当な数値を求めたいんだけど
標準関数で簡単にやるにはなにかいい方法ある? せめて10レスくらい読めよ
$ perl -le 'print for unpack q{C*}, q{もじ}'
227
130
130
227
129
152 >>422
いいから早く消えろってことだよ
やんわり言ったら分からなかった? >>421
BigInt付けるか、他の方法を考えるかしたら?
文字列じゃなくて、変数ってんならアドレスとかの方法もあるけど、 >>425
何で上から目線なの?
自己顕示欲満たしてやってんだから嫌なら答えるなよ。 そもそもこんなところで質問してあーだこーだ言わないと使えないんだったら、
Rubyをサクッと学習してやったほうが早い。 配列の配列を戻り値にしたいんだけど
どうしたらいい? Perl厨の自演って分かりやすいな。
文章構成能力がないから、短文で一問一答w >>413
制御文字を除外するために文字が特定範囲にあるか調べる方法がテクいです
>>416
同じことを思ってる人はいるものですね.
使ってみた限りでは問題なく調整してくれるみたいです.
\p{East_Asian_Width} で定義されてるかどうか等で判定しているので
半角カナもちゃんと幅1で計算されます.
MBPrintf.pm の方を使って printf を置き換えることにしました.
HTMLとかにして出力するしかないかなと思っていたところ
さくっと printf を置換えするだけで綺麗に出力できそうなので
大変助かりました. 質問してみて良かったです.
レスありがとうございました. >>439
やっぱ馬鹿なんだな
お前みたいな奴が日本のIT産業をダメにしてんだよ 同じこと考えるも何も、日本でPerl広めたのはこの人だよ 受け答えのレベルから推察するとシフトJISを使うことを思いついていない気がする コマンドラインで使う前提での質問なのにシフトJISってw
質問すら読解する能力無いだろ
ほんとにWebProgに帰れよドアホ >>445
草生やしてんじゃねーよ。
半笑いのつもりか?
半笑いでバカをアピールする>>445哀れ。 Config::INI とかTiny とかのライブラリで
コメント行は ; になっているけど
これを # にするようにできるライブラリはある? >>450
ある。
回答きたんだからさっさと消えてね。 >>450
ここが参考になる
ttp://to-a.ru/LEeAgi その程度も自分で調べられないとか頭悪いんだろうな
調べたら3分かかからなかったけどな ニーハオ!
パンニハムハサム ザパニーズニダアルヨ!
ショーグンサマ バンザイ!
テポドン バンザイ! 文字列が二つあって、その比較をしたい
共通1 差分1 共通2 差分2 共通3
みたいな感じで、2箇所まで差分を抽出したい
現実的な速度で動くうまい方法ないかな >>463
他人に頼る前提で始めるような馬鹿には無理。 >>463
はぁ?
自分でやったけど何秒かかって、これが何秒以内に終わるようにとかも書けねーの?
本当にお前ゴミだな
リアルでもどうせその調子なんだろ
リアルでもゴミだと思われてるけど気付いてる? 自分で試すことすらしない猿未満の低能には言うだけ無駄
猿ですら目的達成のために試行錯誤するのに $str1 = 'aaabbbcccdddeee';
$str2 = 'aaafffcccgggeee';
$test = $str1 . "\t" . $str2;
$test =~ /(.+)(.+?)(.+)(.+?)(.+)\t\1(.+?)\3(.+?)\5/;
$c1 = $1;
$d11 = $2;
$c2 = $3;
$d12 = $4;
$c3 = $5;
$d21 = $6;
$d22 = $7;
print "$c1 $d11 $c2 $d12 $c3\n";
print "$c1 $d21 $c2 $d22 $c3\n";
結果
aaa bbb ccc ddd eee
aaa fff ccc ggg eee
こんなのはすぐに思い付くと思う
ところがこれは、文字列の長さが100文字とかでもう遅すぎて使えなくなる こういうのを見るたびに
足りないのは知識やスキルではなく羞恥心なんだなと思う 2つの文字列を文字ごとに分解して2つの配列を作ってから↓
ttp://perldoc.jp/docs/modules/Algorithm-Diff-1.15/Diff.pod diffは多少一致してない部分があってもいい、みたいな曖昧な判定をするから、
余計にややこしいんだよな ネットで検索する時は単語をスペースで区切ってそのANDで結果を得るけど、
同じことを正規表現でやりたい時はどう書けばいい? 「$s が hello と world の両方にマッチする」なら、単に
$s =~ /hello/ && $s =~ /world/
と書くだけじゃないの?質問がよく分からないのだけれども >>476
あえて無理やり正規表現のみでやるなら否定先読みを使う
if( /(hoge|piyo).*(?!\1)(hoge|piyo)/ ){ print "成功\n"; } 否定の先読みなんかせんでも
print ‘foobar’ if /(?:foo.*?bar|bar.*?foo)/ ;
で良いんじゃねーのか 仮に検索エンジンみたいなのを書くにしても
何を対象にするのかとか、検索単位とかを決めてもらわんと書きづらいぞ
「同じこと」の通り「対象:Webサイト、単位:ページ」ならGoogleに投げりゃ済むし 検索対象も文字列に決まってるだろ
正規表現でのマッチングだっつってるんだから
逃げてないで考えてみれ >>482
文字列?
テキストでもファイルでもなく?
それって何に使うんだろか…結局、目的は何よ?って話だよ
もしかしたらもっと良い方法があるんじゃ?と勘ぐってしまうのよどうしても またよく判らん屁理屈を
検索の単位が文字列に対してで、それがどこから来たかは問題にならないだろ
まあ、大抵はファイルからだろうけど
で、ファイルならこんなツールがあるよ、みたいな感じで本題から逃げたいのが見え見え >>484
いやまあ、文字列に対してなら
my $hit = 1;
for my $ptn (split(" ",$search)) {
$s =~ /$ptn/ or $hit = 0;
}
こんなんで出来ると思うけど、こんなんで本当に良いのか?
後出し条件とか大量に出てきそうな感じがするんだが お前は、「ワンライナーでどうやりますか」って質問に
スクリプト作成して答えるのか?
「正規表現でどうやりますか?」って質問には、
普通に正規表現で答えりゃいいだろうが。
実際、質問への答えは、
>>477->>479で終了してる。
後出しを心配するなら実際に後出しされてから
盛大に罵倒しろよ あえて制限をつけてパズルとして解くならともかく
現実的な解としては >>477 で十分だよな 元々の要求はただのスペース区切りだから、パラメータ数は不定で、
パラメータ抽出して、その全部に対してマッチングを繰り返すという当たり前の処理になる
でも、そんなことは最初から判っているのでわざわざ聞く筈がない
スペース区切りの文字列をそのまま使ってマッチングがしたいなら、
残念ながらperlの正規表現でそんなことは出来ない、が答えとなる 本物のコミュ障だなぁ
粘着されてる>>476が、可哀想だわ。 質問者のレベルまで勝手に想定するし、、、
>>476から読み取れるのは、拡大解釈しても
「ワンセンテンスの正規表現で書くにはどうしたらいい?」
程度だろーに ◯正規表現で、AND検索の実装って、どうやんの?
×正規表現で、「スペースを使って」AND検索の実装って、どうやんの?
「わざわざ聞く筈がない」まで、分かってんなら、
自分の解釈の仕方が間違ってないか、
自問しろよ 971 名前:名無しさん@七周年[] 投稿日:2006/11/11(土) 00:56:10 ID:M8+ahUZV0
自称スーパープログラマー某
強烈加齢臭
メール見ない メール無視
ドキュメント見ない ドキュメント無視
説明聞かない 説明無視
話聞かない 話無視
ガム→むっちゃー むっちゃー むっちゃー むっちゃー
煎餅→バリバリバリバリバリバリ
菓子パン→モグモグモグモグモグモグモグモグモグモグ
カップアイス→むっちゃー むっちゃー ペロペロペロペロ
フロアすべてに響き渡る 超ばかでかいくしゃみ 当然手でおさえない
異音と異振動
ドスーン!ドスーン! ドカーン!ドカーン! バコーン!バコーン! ズドン!ズドン!
机が近いとマウスポインターが飛ぶ 誤操作誘発
書類だしたりしまうだけでドカンドカン
30秒ごとに口と鼻から異音
ふんっっ! ふんっっ!
備品破壊 貸与P C 破壊 他人のもの破壊
奴の作ったスクリプトとプログラムは使えない バグ製造機
電話や共有携帯電話 キーボードが油ベタベタ
奴に電話とPCとコンソールは触らせてはいけない Perl 5 version 16の正規表現で、地の文の一部としてマッチさせたいときに
バックスラッシュでエスケープせねばならない文字の一覧を教えてください
文字集合[ ]の内外で違うとか、文脈依存があればそれも知りたいです 何をしたいのか知らないけど
http://perldoc.jp/index/core
で疑問のほとんどは解決すると思う。
まあ、エスケープすべき文字を知りたいということならそれは「英数字以外」だ。
\Q と quotemeta 関数について調べてみてほしい。 >>494
ありがとうございます。
質問の動機は単に手で正規表現を書くときエスケープすべきかどうか
悩ましかったから(実際には「+」や「:」や「#」とか「[ ]」の外の「-」はエスケープ無しでも通っていそう)
だったからですが、エスケープして無害ということであればそうします
それはそうとしてquotemeta便利杉、 >>496
おるけど?
まだ後10年は掛る。
触る必要無し
処理速度とか早くなってんのかも知れんけど、
起動が遅くて、使い物にならん。
挙動もバギー、docも揃ってない。
止事無き事情から、アルファ版を正式版として
リリースしただけじゃね? 外部コマンドの話が出てて思い出したけど、
外部コマンドを実行するときに任意の文字列を外部コマンドの引数として渡したい場合、
Linux環境でエスケープすべき文字は?
シングルクォートとバックスラッシュだけエスケープして、それをシングルクォートで括ればOK? なんかPerl 5.16.1のウィンドーズ版のUTF-8対応は中途半端な希ガス、
use utf8;としてUTF-8でソースコードを書いても
open()のファイル名とかsystem()に与えるコマンド文字列とかが'shiftjis'(正確には'cp932')のままだし、
コマンド引数も'shiftjis'(正確には'cp932')のままだし、
なんでああなんですかね… dankogaiがのらりくらりうまく回避しちゃうからじゃない?
俺はもうperlでsjis処理するのはあきらめた。 いろいろ面倒なんで、俺は use utf8; を使わないことにしたよ。 >>498
シェルを経由するのならシェルのマニュアルを読みなさいとしか言えない。
bash の場合なら「定義」の項のメタ文字と「クォート」の項。
シングルクォートなら大体大丈夫なはずだけど。
そういう心配をしなきゃならないならシェルを呼ばない方が無難。
シェル経由でなければシステムコールするだけだから。 >>498
もしかして、普段は Windows 使ってるからコマンドラインを作って渡す方法しか知らないとかそういうこと? 思い付きで気軽にコマンドライン作って出力をキャプチャできるのがLLの良いところなのにね。 >>504
助けてあげる気が無いなら引っ込んでてくれないか? >>498
" " 内では、「$(変数展開) \ `(コマンド置換) !(ヒストリ)」が展開される。
' ' 内では、展開されない。
\ は直後の1文字の機能を無効化する
メタキャラクタ・特殊文字なら、他にも多数。
? * > >> < << | ~ & など
ただし、「! ~」は、bashのみ いっぱーぃぁる
いっぱーぁある
いっぱーぁる
いっぱーる UNIXの歴史をエッセンスにしてUNIX以外でも使えるようにした言語だから学ぶ価値はある。
おれの場合はWindows上で毎日使ってる。慣れの問題もあるが他の言語だとこうはいかない。 バージョンをきにしなくていいなら、Perlは、Windows 2000のパソコンでもつかえる。
現在のRubyは、インストーラがうごかない。インストーラがうごいても、実行時にDLLがどうのこうのいってエラー
Pythonも同様だろう、インストールがめんどくさいのは、損ですよ
Ruby, PythonでもCygwinならいけるかも
Cygwinがきらいなひとは、こまります 今時Cigwinなんて使ってるやついるの?
使う理由が見当たらないんだけど…。 >>516
Windowsでコマンドラインを使うときに
一番便利な道具だよ。 >>516
cygwinはインストールが楽でいいんだよ >>517
その使い方こそがもう洋ナシなんじゃないの? >>519
おまえさん、何でム板にいんの?
WebProg板の住人の発言だったら、まだ分るけどさ。 >>517
cygwin+Perlでできて、バッチファイル(cmd.exe)+Perlでできないこととは…? >>521
その場合、Perlの部分は同じ。違うのは cmd.exe と bash (またはzsh) なので
コマンドプロンプトで出来ないこととは、シェルとシェルスクリプトの実行ということになる。
つまりbash(zsh)の快適な操作性が、cmd.exeにはない。
LinuxやMacで動くシェルスクリプトがcmd.exeでは動かない。 パスに日本語使わない運用ならね
でもそれって制限きついよね?仕事で使うのはまず無理だな そういやcygwinはファイル名に日本語ついていても
ちゃんと動くよな。凄いことだよな。
>>523
お前何の話してんのー? >>520
個人環境なら好きにやればいいんじゃない? ロブ・パイク語録。
>「UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている」 - 1991年ごろ
(中略)
>「そういった日々は過ぎ去り、賛辞は Perl にもたらされた」 - [7] 単機能ツールについて
賛辞は Perl にもたらされた! >>526
25年前の話だからな。
25年も経てば、SMAPも結成して6人から5人になり解散する。 win7でactiveperl
`コマンド` からの応答をファイルに書き出したい
テキストならうまくいくけど、バイナリで失敗する
書き出し用のファイルはbinmodeにしてるので、受取側がおかしい
binmode STDIN
にはしてるけど変わらないみたい
C:> コマンド > file.bin
でリダイレクトすると成功するので、コマンド自体はちゃんと動いてる
何が悪いんだろう どういう具合に失敗するんだ?
バイナリをテキストとして解釈するのか? バイナリエディタとか無いから詳しくは判らないけど、
pptファイルを開こうとしても怒られる 再現する最小コード書けや
バイナリエディタもフリーのあるやろ exe単体のもあるしそれさえアウトでも家の環境で再現させられるだろ
つか業務関連なら会社で聞けば 知らないなら黙ってればいいのに
何かバイナリを標準出力に吐くコマンドなら何でも試せる筈
なかなかそういうサンプルが無いけど これだけの情報で判らないならコード見ても判らないよ
binmode STDIN;
$result = `SomeCom.exe`;
open $out, '>', 'outfile.bin';
binmode $out;
print $result;
これだとNGで、
C:> SomeCom.exe > outfile.bin
これならOKになる >>536
どう見ても標準出力に吐いてるんだけどそのコードで再現することは当然確認したんだよね? STDINは関係ない
パイプをバイナリモードにしろ open $in, '-|', 'SomeCom.exe';
binmode $in;
$result = <$in>;
こんな感じか
` ` を使う限り解決できない? あ、違う
@result に受けて結合か
そこでもまた改行コードが何かしそうな不安が >>539が正解でした
ちなみに、結果を変数に受ける必要はなくて、
入力から出力にそのまま流す方がスマート 答えを知ってる人はシンプルにいきなり正解のみを示すんだよな
で、必要な知識のない人が見当違いのことをいろいろ書いて掻き回す ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ あれ?そういやこのスレは消化されないまま残ってたの?ちょっと前に63箱目が1000になったんだけど。
じゃあ新スレ立てずにそのままここ使う? >>545 ここで良いんじゃない?
Windows7 で ActivePerl 5.16.3 を使っているんだけど、改行が CR LF (0D 0A) のファイルを
<> で読み込むと、行末が LF (0A) だけになる。これはなぜに? >>546
ストリームがテキストモードだからでしょ。
それがイヤならbinmodeすれば? 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)
▼前スレ >>549
CGIの話題もム板でいい筈じゃ?
WEBプログラミング板に該当スレが無くなったってのが、理由だったような。
後は、下記を修正。
www.perl.org/get.html
Download Latest Stable Source (5.26.1)
▼前スレ
Perlについての質問箱 63箱目
http://mevius.5ch.net/test/read.cgi/tech/1392820583/ これが次スレになったのね。
おいらもそうだが、
最近、スレが立てられなくなった人が多いのかな? >>550
もしやあなたはCGIとPerlの区別がつかない人? websocketをやってみたいんですが、Net::WebSocketというのとProtocol::WebSocketというのが検索で掛かります。
どっちを使うのでしょうか >>555
フレームワークは勉強の為に避けようと思います。 正直websocketやるのにPeal選ぶ意味は無い気がする
やりたいってんなら止めないけど
node.jsとかgoでいいような
適材適所というか 汎用的なものが作れないかと思っています。
スピードを求めるならjavaで作ろうと思います。 perlでサーバーAで計算した値をサーバーBに送り表示することってできますか?
できるならどうやるんですか?
できればモジュールなくても使える方法がいいです。 サーバーAで計算した値をサーバーBに送るとはどういうことか、何に表示したいのか
perlの前にここを明らかにした方がいい >>561
もっとわかりやすいように質問変更する
サーバーAでログインIDとパスワード入力して
サーバーBに置いてあるユーザー情報と比較してログイン成功なら
サーバーAにログイン成功だと言う情報を送りたい
こういうこと use HTTP::Tiny; # v5.14から標準モジュール
my $response = HTTP::Tiny->new->post_form('サーバーBのURL', {id => $id, password => $password});
if ($response->{success}) {
print '成功';
}
else {
print '失敗';
}
----------
AからBに問い合わせてその結果をAで使うならこんな感じで行けるんじゃない ぜんぜんわかりやすくない。
「ログイン」といってもいろいろ。
Webサイトについてだったら、WWW::Mechanizeとかそういう?
https://www.google.co.jp/search?q=perl+mechanize 鯖へのログインなのか、それともHTMLページ等でのログインなのかも分からん Perlのソケット通信にて、とあるAPIへのリクエストに対して送られてきた全応答を全て取得した上で処理をしたいと思っています。
たとえば簡単な例だと
応答データ例:(00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10);
データは00〜FF全てを含み、終了は6連続"00 00 00 00 00 00"になった場合となります。
==
my $data = <$socket>; # data => 00 01 02 03 04 05 06 07 08 09 0a
my $data2 = <$socket>; # pending....
==
$/ = \x5;
my $data = <$socket>; # data => 00 01 02 03 04 05
my $data2 = <$socket>; # pending....
==
のように、$/に当たるデータで停止してしまいます。$data2は待てど暮らせど進みません。
また6バイトで1組なので、sysread($socket,$buf,6)や$socket->recv($buf,6,0)、recv($socket,$buf,6,0)
といった方法もしてみましたが、これら全てpending...状態で1こちらも待てど暮らせど進みませんでした。
一括で取得する方法はありませんでしょうか。 >>567
ノンブロッキングのソケットってできなかったっけ?
fcntl()で指定するんだったような気がするが。
まあでもこの辺はOSによって微妙に違うかも知れないのでよく調べてみて。
で、ブロックしないようにしておいて受信したやつをとにかく全部読んで最後に \0 が6つあるかどうか見ると。 >>568
ありがとう
試してみた感じとまらなくなりました。
助かりました。 while(1) {
PROC1;
if (COND) {
last;
}
PROC2;
}
こんなような処理を、while(1)とかlastとか使わずにスマートに書けない? >>570
PROC1はCONDの値を返さないってこと? 想定してる例では返さないけど、返す前提じゃないと一般論にならない >>569
non-blocking にするとデータが何もきてない時にほとんど素通りするので
selectとか使って自分で待たせることを忘れずに。そうしないと入力待ち
ループが物凄く早く回ってしまい無駄にCPUタイムを食うことになる。 x が100000〜100500 なら y=1000
100501〜100700 なら y=1001
100701〜120000 なら y=1002
みたいな感じになってるとする
xはある範囲を全部埋めていて、yはある範囲で連続
で、xが与えられた時にyを求めたい
どんなデータ構造にするのが一番効率的だろう Perl関係無いような…
俺だったらxのfrom値をキーにハッシュ作って値にy入れるかなぁ >>574
単純な計算ではxからyは求められないようだね。だったら配列にxの下限とyの値のペアを入れといて比較かな。
こんなやつね。どう比較するかは分かると思うので省略。
my @a = (
[100000, 1000],
[100501, 1001],
[100701, 1002],
.
.
.
);
ハッシュ使うとxの値を比較する時に全てのキーを引き出してソートしてから行う必要があって、それだと余計に遅くなると思う。
しかし全てを配列に入れておいて頭から全て比較することが現実的とは思えないほど多い場合(何万件もあるとか)は、もうPerlでやるのは止めてRDBに繋いでやった方が良いかも知れない。
(xの上限、下限、yの値をただ入れる表を作ってxの方はインデックス作っておいて簡単なselectをする)。
そうすると何も考える必要がなくなって楽だ。DBはsqliteが軽くていいぞ。その場合DBIモジュールとDBD::SQLiteモジュールが必要。 0, 501, 701, 1001, 1301,
x のfrom 値で、2分探索木にする。
各ノードが、y 値を持つ yを0から999までに単純化して、
下限だけ入れた配列を毎回0から見つかるまで舐める
という実装にしたら、余裕で一瞬で終わるので、これで十分だった
個人でDBが要るようなケースって、まず無い気がする >>578
ちなみに、DBを使ったことある?
個人的には、個人用途でもあれば便利。
保存関連がかなり楽になる。 仕事でaccess使ったくらいだけど、
規模的にはテキストでも全然構わないレベルだった
excelと連動させたいからそういう手段が選べないだけで、
個人なら最初からexcelそのものを使わない 扱うデータが多くて一々考えるのが面倒な時は使ってみると良い。 データの規模よりは、構造の複雑さだろうな
いろんな属性がいっぱいくっついてて、それらが相互に関連してるようなデータを
テキストベースで作るのはなかなか大変
で、個人でそんなデータを扱う機会はやっぱり無い
家計簿をコンビニ別に統計を出したいとか、そんなことは思わないし、
そうできるようにデータ入力するのが面倒すぎて挫折する こんな単純なデータ構造のものをDBにしたら遅くなるのは目に見えてる
単純に2つの配列か、独立してるのが嫌なら、2つの要素を持つオブジェクトの配列でいいだろ しまうのはそれでいいけど、検索できんだろ
数が莫大になっても短時間で検索できるようにしまっといてくれるのがDBのいいところ
でも高々1万とかならリニアで十分
100万とかあると探索アルゴリズムが威力が効いてくる >>586
DB使って、どういうキーでクエリー出すの?
俺は詳しくないから考え方だけでいいので教えて
・x>=キーのものの中からMINを取って、それのyを出力?
・x>=キー and 次のレコードのx<キー?(次のレコードって見れるのかは知らんけど)
・x,yの他にx2として範囲の最後をデータとして追加しておき、x<=キー and x2<キー?
何かベストマッチな方法がありそうだけどね
(上記の方法ではとてもDBの検索が効率よくいけるとは思えんので) 単純にSELECT y FROM hoge WHERE x BETWEEN a AND bで
実態はSQL側で最適化してくれるよ
データを扱うことに特化した高級言語な訳だし
個人的にはDB使うかどうかって、
データの流動性(?)がポイントな気がする
弄る機会が多ければ多いほど恩恵受けられる訳だから >>588
BETWEEN a AND bって、aからbの間ってことじゃなかったっけ?
x=100502の場合のyを求めるのにどう書くの?
BETWEEN 100502 AND 100502でいいんだっけ? これって例えば、10000から11000の間にあるデータxを全部抽出したい場合とかに使うものなのでは? >>587の例って全部おかしかったので書き直しとく
・MAX(x<=100502)
・x<=100502 and (次のレコードのx)?>100502
・x<=100502 and x2>=100502 表は x の最大と最小(xmin,xmax)と y をただ入れといて select y from xytbl where x between xmin and xmax みたいにすればいいじゃん。
xmin + 1 が次の xmax と一致するので無駄があるが xmin, xmax にインデックス作っておけば多分速くはなるだろう。
どうしても無駄をなくしたい場合は xmin と y だけにして xmax はビュー作ってそちらであるかのように見せかけておくか、または複雑になるが一つのSQL文にするかだ。 >>592
何を言ってるのか不明
表にxminとyしかないのなら、xは使えないだろ
また、[x,y,xmin,xmax]=
([100000,1000,100000,100500], [100501,1001,100501,100700], [100701,1002,100701,120000],…)
ってことで
select y from xytbl where x between xmin and xmax
なら全レコードがマッチするよ between句は、
SELECT カラム名 , ... FROM テーブル名 WHERE カラム BETWEEN 値1 AND 値2;
で
SELECT カラム名 , ... FROM テーブル名 WHERE カラム >= 値1 AND カラム <= 値2;
と書くのと同等の機能
select y from tbl01 where x between 100000 and 110000
なら
select y from tbl01 where x >= 100000 and x<=110000
と同じってこと >>593
うまく伝わらなかったかな?考えてることは多分同じだよ。
例えば以下のようにするの(以下はSQLiteでのSQL)。
create table xytbl (xmin, xmax, y);
insert into xytbl (xmin, xmax, y)
values (100000, 100500, 1000), (100501, 100700, 1001), (100701, 120000, 1002);
create table xtbl (x);
insert into xtbl (x) values (9999), (100300), (100502), (118000), (120100);
select x, y from xytbl, xtbl where x between xmin and xmax;
ここでは xtbl に x の値だけ並べて入れておいて後でまとめて selectして x, y 両方出している。 ごめんびとうぃーん言い出しっぺだけどダメだね
感覚と言うかノリだけで書いてしまった
実際書くと即だめじゃんってなるやつ PerlからDBI経由でDBアクセスするならxtbl不要でxの部分はprepareで'?'にしておいてexecuteで実際の値を渡せば良い。 真面目に今考えた結果
Select y From hoge Where ? < x Order by x Desc Limit 1;
で多分取れる $$で取得するプロセスIDはどんな環境でも最大4桁までですか? >>599
んなこたなかろう。Linuxで ps -fe とかやれば5桁ぐらいのが沢山出てくるぞ。
かといって最大5桁で作って安心してはいけない。
将来的に変わるかも知れないしLinux以外ではもっと桁数あるかも知れないからな。 全く初歩的な質問ですいません
ググってみたのですがそのものズバリの例を見つけることができませんでした。
やりたいことは、連装配列に配列を入れて取り出すことです。
最後の出力行が [2] となることを意図していますが、出力は
[] となり、ワーニングもでています。
配列を入れたつもりの連装配列の要素が配列とは認識されていないようです。
この場合どのように書けば、所期の結果が得られるでしょうか?
$ perl -v
This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
(with 46 registered patches, see perl -V for more detail)
〜後半略〜
$ cat sample.pl
my %hasy01;
my @array01;
@array01=(2,4,6,8);
$hash01{"name"}=@array01;
printf( "[%s]\n", $array01[0] );
printf( "[%s]\n", $hash01{"name"}[0] );
$ perl -w sample.pl
[2]
Use of uninitialized value in printf at sample.pl line 9.
[] $hash01{"name"}=\@array01;
こうやるんだよ >>601
$hash01{"name"}=[@array01];
でも可 >>602
おお、うまくいきました。
ありがとうございます。 >>603
リストのリファレンスかコピーかでまったく別物なので注意。 デリファレンス側もちょっと不満があるな
printf( "[%s]\n", ${$hash01{"name"}}[0] );
こうか
printf( "[%s]\n", $hash01{"name"}->[0] );
こうがいい >>605
目的用途に応じて意識的に書き分ける
>>606
}{][の間の->は略せるので
printf("[%s]\n", $hash01{"name"}[0]);
が良いかと #自分ならこうするかな
my $hash01;
my @array01;
@array01=(2,4,6,8);
$hash01 = {
name => \@array01 ,
foo => \@array01 ,
bar => \@array01 ,
# .... 多分こういうふうに増えるだろうし
};
printf( "[%s]\n", $h->{name}->[0] ); # -> があると目が滑りにくい! 正規表現でマッチした部分を$1,$2などで取り出すけど
$いくつまであるかわからない場合$1,$2...$nをまとめて配列に入れる方法ってどうやるんですか? >>609
ttp://perldoc.jp/docs/perl/5.22.1/perlrequick.pod#Extracting32matches
>リストコンテキストでは、グループ化付きのマッチング /regex/ は マッチングした値のリスト ($1,$2,...) を返します。 従ってこれは以下のように書き換えられます
> ($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
ttp://perldoc.jp/docs/perl/5.22.1/perlrequick.pod#More32matching
>リストコンテキストでは、//g はマッチングしたグループのリストを返します; グループ化の指定がなければ、正規表現全体にマッチングするリストを返します。 従って
> @words = ($x =~ /(\w+)/g); >>611
え?困らんだろ。普通に $10 とか $11 とか書けば良いだけだし。 Perl のことだとは言ってないな。正規表現の話なら 9 までしか使えない方が多数派だ。Perl でさえ昔はそうだった。
まあ、そういう話なら $10 ではなく \10 と書くべきかもしれないが。 いやこのスレは「Perl についての質問箱」なわけで・・・ ユーザ定義関数のリファレンスを変数に代入しておき、そのリファレンス変数を
参照することによって関数を呼び出すことができます。たとえばこんな感じに。
sub s { $_[0]+1 }
$r = \&s;
print $r->(1)."\n";
$ perl usr.pl
2
それでは、popやshift、printなどの組み込み関数についても、リファレンスを変数に代入しておき、変数を参照することによって組み込み関数を呼び出すことができないか方法を探しています。
しかしCOREやCORE::GLOBAL名前空間を使ってできないか、ためしてみましたがうまくいきません。たとえば
$r = \CORE::print;
#print "$r\n";
print $r->(3.14, "\n");
を実行すると
Not a CODE reference at 〜.pl line 3.
となります。
$r = \CORE::GLOBAL::print;
#print "$r\n";
print $r->(3.14, "\n");
を実行しても
Not a CODE reference at 〜.pl line 3.
となってしまします。何かいい方法をご存知でしたら教えてくださいませ。 ユーザー定義関数だと\&でやってるのにCOREは\&でやってないのはなんで? >>616
\&CORE もためしたけれど
$r = \&CORE::print;
print "$r\n";
$r->(3.14, "\n");
実行すると
Undefined subroutine &CORE::print called at 〜.pl line 3.
CODE(0x3919c)
となるのよ。
できなことなのかね… ttps://perldoc.perl.org/CORE.html
COREパッケージの関数もリファレンスを取得したり別名を定義することができる(pushなど)
ただし一部はベアワードでしか呼び出せない(printなど)
>組み込み関数についても、リファレンスを変数に代入しておき、変数を参照することによって組み込み関数を呼び出すことができないか
結論: ものによる >>620
そうすれば機能的に可能だけれど、
ユーザ関数のコードがワンクッション間に入るので
パーフォマンス的にみて、
できれば組み込み関数を直接、第一級関数としてクロージャーなどに
使えないか調べていた、ってわけですのよ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
U85LY さすがにリファレンスですらない変数だと怒られた
でも、勝手に作った偽オブジェクトを食わせたりはできる
他の言語はそのへんの安全装置はどうなってるんだろう blessは、オブジェクトにパッケージを関連付けるだけだろ。
どんな「安全装置」が必要なのか?
ちなみに、RubyもJavaScriptも、動的に後からメソッドとか足し放題だな。
まあ、スクリプト言語としては残念でもないし当然。 メソッドを足すのと、コンストラクタが生成してないものを使うのは全然違うだろ Pod::PerldocJp という日本語 perldoc を cpanm 使ってインストールしてみたが、root でないとエラーが出て動かない(Linux 環境ね)。
$ perldocjp perldocjp
Error stat on '/tmp/.perldocjp/perldocjp.pod': そのようなファイルやディレクトリはありません at /usr/local/share/perl5/Pod/PerldocJp.pm line 78.
$
root になるとちゃんと出てくる。ただし sudo perldocjp perldocjp ではダメで、 sudo su - とかで root でログインした状態で perldocjp perldocjp とするとちゃんと動く。
実行時の環境変数 LANG は一般ユーザもroootも ja_JP.UTF-8 になっている。
これ Linux でインストールしてみてうまく行った人いる?
Pod::PerldocJpとperldocjpコマンドについての日本語での説明はここね。
http://search.cpan.org/~ishigaki/Pod-PerldocJp-0.18/perldocjp 例えばファイル名を入れて関数を呼んで、
処理結果を入れた配列なりのリファレンスを戻り値で返す
別のファイル名で同じ関数を呼んで、結果のリファレンスを別の変数で受ける
それで普通に動くんだけど、
なぜ同じ関数のmyで宣言した変数が違うオブジェクトを指しているのか、
なぜ古い方は消えてしまわないのか、
そもそもいつまで残ってるのか、
みたいな部分が何となく不安
参照カウントの仕組みを理解しても、やっぱり不安 >>632
気持ちはなんとなく分かるけど、
こういう人に対して何と言って分かりやすく説明したら
よりよいかは
少し考えてしまうな… 消えないことに対する不安じゃないんだよな
肉体は既に滅びているけど、どこかにある名簿にまだ名前があるお陰で、
辛うじて魂だけまだ現世に留まってる感じ
リファレンスを戻り値で受けるんじゃなくて、
自分で宣言した変数のリファレンスを引数で渡して、
そこに入れて貰う方式なら安心できる
意味は同じなんだけど strdupの仕様の気持ち悪さ
無名関数のリファレンスの気持ち悪さ
みたいなやつなら、俺も感じる うーん。しかし、そういうのは言語を実現する環境の実装にバグがあるかどうかの問題だよなあ。
そのバグを気にするならどんな言語も使えなくなるのでは?コンパイルする言語でもバグってて
変なコード作られたら終わりだしなあ。 信頼性の話じゃないだろ。
言ってしまえば、リファレンスとかオブジェクトとか、なんかふわふわしてて、なんとなく納得がいかん、てだけ。
感覚的には慣れの話でしかないと思うけど、どうしてもというなら、C++でもやってみればいいのでは。
newとかヒープとかを把握できれば、実はぜんぜんふわふわしてないことが理解できるはず。
余計に混乱するかもしらんけども。w C言語で関数内にstatic変数を持ってて、
そこに何か格納してそのポインタを返す、みたいな仕組みなら安心する
何回呼んでも同じポインタが返ってきて、前回の内容は保存されていない
だから必要なら呼んだ側の責任で保存しとかないといけない
家がない子はいない
perlのsub内のmy変数のリファレンスも見かけはそれと似てるけど、
実際の動作が全然違って、実体は動的に生成される
じゃあC言語のauto変数みたいなもんかというと、関数が終わってもスコープを抜けない
かといってずっと存在する訳でもなくて「要らなくなったら消える」というルールが人智を超える
うまく動くように出来てるんだから、怖がらずに飛んでみろ的な 変数の寿命なんて本来はコードから静的に判るものだったのに、
それを動的にする代わりに管理を手放して機械に任せることにした
それはなかなかのパラダイムシフトである筈なのに、
オブジェクト指向のデータ隠蔽とセットで隠蔽されてあんまり気にしてない
コンストラクタさんに任せとけば全部うまくやってくれるから >>639
それだとマルチスレッドの時に困るわけだな。呼び出し側でバッファ作ってそのポインタを渡すという手もあるが、
量が動的に変化する場合はそれだけでは実現できない。で、malloc() 使うわけだが、そうするとどこかで必ず
free() する必要が出てくる。これが煩わしいので自動でなんとかならないかと色々やってるのが今時の言語。
とはいっても Perl は30年以上前に作られた言語だけどね。 個人環境をMariaDBに代えてみたけど
DBD::MariaDBがgithubにしかなくてMySQLに戻したわ(´・ω・`)
こういうとこ困るなー枯れてると MySQL用で動きそうなもんだが。
実際、数年前だけどRubyでは使えた。 枯れてるって、不具合とか掘り尽くされて安定してるって言ういい意味と
動きが無いって言う悪い意味の両面がある気が >>646
my.conf的な(my.confではない)、恐らくMySQLにあってまりあDBに無いファイル読みにいってこける。
たぶん簡単に修正できるけど、CPAN取得ファイルは弄りたくないから様子見にしたわ >>648
IT系で後者の意味では普通使わない。
「枯れる ソフトウェア」などでググってみ。 >>650
この場合「枯れる 言語」のが適切だと思うけど…
俺は文脈でどっちの意味でも使ってたわ 不具合が枯れたなら分かるけど、動きがないはよくわからん。
ユーザー数は関係ないってこと?C言語はどっち? %cat = (%hash1, %hash2);
みたいにするとハッシュが結合できる
keys %cat でkeyの配列が取得できる
でも、keys (%hash1, %hash2)
とすると怒られる
keys {%hash1, %hash2}
ならいけるけど、5.12では通らない
どうすれば (keys %hash1, keys %hash2)かなあ それだけだと同じキーがあった場合に2つ出て来るのでもう一捻り必要ということになるんだろうな。
こうかねえ?
keys map { $_ => 1 } keys %hash1, keys %hash2 >>653
$cat a.pl
use strict;
my %h0 = ( a => 1, b => 2);
my %h1 = ( b => 3, c => 4);
print( keys( %{ +{ %h0 , %h1 }}),"\n");
$perl a.pl
acb
$
$# できるといえばできるけど、君がやってるやり方をおすすめするよ。その方が余計なバグを防止できる。 怒られる方法が何故悪いのかがよく判らんのだよな
普通に無名のハッシュになるんじゃないのかと思うんだけど、
> Type of argument to keys on reference must be unblessed hashref or arrayref
hashでもarrayでもない何かのリファレンスになってる? keys()が引数にリファレンスをとれるようになったのは最近(でもないけど)だから、曽野せいなんでは。
>>657 %hash1 = (a => 1, b => 2);
%hash2 = (c => 3, d => 4);
$ref = (%hash1, %hash2);
print $ref;
さて、何が表示されるでしょう? perl -e "use Data::Dumper; %hash1 = (a => 1, b => 2); %hash2 = (c => 3, d => 4); $ref = (\%hash1, \%hash2); print Dumper($ref);" >>660
つっこみありがとう。もう長いこと Perl 使ってるからね、そこはデリファレンスしたいんだよ。
そもそも Perl4 にはリファレンスが無かったんだ。
C でも関数ポインタ使うときは (*p)() みたいな書き方してるよ。 >>661
通常はそこはリスト値に展開されて %hash2 の要素のどれかが全体のスカラ値になるはずだけど、そうなってないね。
その仕様は公式ドキュメントのどこに書かれてるの?
通常の評価をしてもらうにはどう書けばいいの? >>664
5.26からは挙動が変わったので注意
ttp://perldoc.jp/docs/perl/5.26.0/perl5260delta.pod#scalar40-37hash41-32return32signature32changed
>>665
リスト値が展開されてから代入されるのではなく
左辺がスカラコンテキスト -> リストの一番右側の値が代入される -> %hashをスカラコンテキストで評価
と思われ ありがとう。perldata は読んでたけど理解できてなかった。 正規表現のマッチ結果って、どこかのデフォルト変数に入ってないの?
($match1, $match2) = ($1, $2);
とやる代わりに、
($match1, $match2) = @_;
みたいにやりたい リストコンテキストで評価すれば$1とか使わず代入できる
($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);
ttp://perldoc.jp/docs/perl/5.22.1/perlretut.pod#Extracting32matches どうやっても、($1, $2)に相当するような配列は、自分で作らないと無いんだけど、
そもそもそのやり方は便利なのか? という問題があって
括弧の数を左から数えて、挿入したら間違えずにずらして、というやり方は、
どう考えても避けるべきテクニックなので、わざわざ改良版でそんな方法を
準備したりはしない >>669
ちょっと捻ってこうすると配列に入るね。
@t = ($time =~ /(\d\d):(\d\d):(\d\d)/);
で、マッチしなければ @t には何も入らないので if (@t) { マッチした時の処理 } のように書ける。 if の中に突っ込んじゃえば見た目が元とあまり変わらなくなるな。
if (my @t = $time =~ /(\d\d):(\d\d):(\d\d)/) {
# このブロックに入った場合は @t[0..2] に値が入っている。
} それが常套手段
でも、次の行で使うためだけにテンポラリの変数を命名して、
ということを避ける手段が大抵はあるのに、この場合は無さそうなのが気になる もう括弧を数えるのはやめようぜ、ということなのだろう
$1, $2 の代わりの配列があったとしても、数えないといけないのは同じなので、
明示的にラベルを付けて書くのが人間的 使ってる Perl が 24.1 になったんだけど、どこかで do の仕様変わった?
do('.state')
がエラーになるんだが。
@INC に '.' を加えれば見つけてくれるけど
do('./.state')
と書いとくべきだったよ。 それは do の仕様が変わったんではなく、@INC の仕様が変わったんだな。 @_ とタイプしようとしても必ずミスする
下手すると、`\ になる >>683
いっそ `\ とタイプするよう心がけたらミスで @_ となる率が上がったりして。 >>602
ありがとう。perl5241delta だったんだね。
@INC でなく do を探してたからわからなかったよ。 質問じゃないけど、愚痴なんで聞き流してください。
Perlが好きなんですが、モジュールを使って実践サンプルが多いんが、つくって覚えるだけなんで
すごいさみしいです。
Perlのモジュールプログラムは最高に面白いのに、なんであの本だけなんですかね?
あと、PythonのTKinterも好きだけど、全然出てない。 今回のプロジェクトは大掛かりだったので、
自分で使う用のツールを大量に作った
こういうの好き perlの話でもなんでもないけど、再帰呼び出しの話
あるディレクトリから下の階層構造について、再帰的に調べたい
その時に、そのターゲットのディレクトリからの相対パスで出力させたい
それを再帰呼び出しを使ってやらせようとすると、
最初: ターゲット
次: ターゲット/file1
次の次: ターゲット/file1/file11
次の次の次: ターゲット/file1/file11/file111
が調べる対象で、単純に受け取った相対パスに対して
ターゲット/相対パス/ファイル名
を調べればいい訳ではないし、再帰的に渡す相対パス名も、
相対パス/ファイル名
と決め打ちすると最初だけ例外がある
何かスマートにやる方法は無いもんかなと
いっそフルパスで扱って、後から文字列置換でターゲット部分だけ削るという方法もあるけど >>690
台無しなこというと、ディレクトリ以下のファイルを列挙するシェルコマンドとプロセス通信したほうが速い。 再帰しなくてよくなるだけで、相対パスの問題は解決しないというか、
より遠のくような Perlの話をするが、File::Findモジュールを使えば。 >>693
まさにFile::Findが遅い。シェルコマンドとプロセス間通信読み取りしたほうがいい。
具体的には以下のようなシェルコマンドをパイプ読み取りするといい。
unixの場合: find [path] -type f
windowsの場合: dir /B /S /A:-D [path] まさにそんな感じになった
dir の結果になんかハングルとかSJISじゃないものが混じってて、
それをそのままbatファイルに吐いて、
batファイルを見ても・・・みたいに化けてても、
実行させるとちゃんと正常に動作する
何作ってたかというと、差分バックアップツール
tarコマンドでできそうで試したけどうまくいかないので作ったった
全ファイルのタイムスタンプ一覧を保存しておいて、
2代目からは差分だけのアーカイブを作る
消えてるファイルを削除する為のbatファイルも一緒に生成 Perlの話から外れるが、おらは差分バックアップにはrsyncに--backupオプションつけて使ってる。 windowsにもあればいいんだけど
差分バックアップツールそのものはいろいろあるんだよな
っていうか、windowsそのものにも内蔵されてたような
バックアップのデータをバックアップ対象のシステムと同じとこに置いててもあんまり意味ないので、
単一のアーカイブとしてクラウドかどっかに置きたい
しかも、専用ファイル形式とかでなくて、何もインストールせずに解凍するだけでリストアしたい
とか考えると条件に合うツールがなかなか無くて、
それでいて作るのはそんなに難しくもなさそうなので、自分で作るかと Windows でバックアップというと xcopy や robocopy だろうな。
rsync も動くんじゃないか? Cygwin や WSL 上の Ubuntu とかなら確実に動くと思うが。 rsyncっていうかrdiffかな
rdiffの出力形式がどんなのか知らないけど、
リストア時にもrdiffが必要だというなら避けたい
ただのzipなりtarなりのアーカイブを順に上書き展開するだけでいい状態にしておかないと、
リストアが必要な事態になった時には多分リストア用のツールも無い だからミラーを作りたい訳じゃないって
ミラーも実はあるけど
そっちはもっと頻度の高いバックアップ用で、
物理的に別のドライブなら同時に壊れる確率は低いだろうという考え
そうじゃなくて、PC一式盗まれた/津波で流された/証拠物件として押収された、等の為に、
まるきり新規から昨日の作業環境を復元したい時の為に、
最低限の情報をクラウドに置いてある
それは特定のディレクトリ以下まるごとのアーカイブでいいんだけど、
サイズが巨大になるので2代目以降は差分で済ませたいというのがそもそもの動機 >>702
find 特定のディレクトリ以下まるごとアーカイブしたdir -type f -ptin0 | xargs -0 md5sum -b | sort -k2 > md5_tree_orig.out
で生成した md5_tree_orig.out を保持しておき、
md5sum --quiet -c その後更新を受けた上記dir md5_tree_orig.out
で追加/削除/更新されたファイルを検出しリストアップ
とか まあ、そんなようなことをタイムスタンプの比較だけでやらせた
リストアップまでは簡単で、差分のアーカイブの作成と、
ファイルが減ってたらリストア側からも減らす仕組みが面倒なんだけど
動かしてみると空のディレクトリが生成されてなかったり 信頼性の不安とか動作確認のめんどさとか考えたら、rsync/robocopyにしたほうがいいんじゃないの?
どうしても差分だったらrdiff-backupとか? ミラーは既にやってるからもう要らない
差分のアーカイブを作ってネットに保存するというのをやりたいだけ
勧めるとしたらtarのバックアップ機能で、まさに差分だけのアーカイブを
作る機能があるんだけど、windowsに移植した人が更新時間とアクセス時間とか
あのへんを失敗してるみたいで、試したのは使えないビルドだった mtimeに基づいて更新されたファイルだと判定する方法は、
アーカイブから抽出した古い日付のファイルを見落とすので
抜けが起きる可能性があるよ よし、cygwinを導入してcygwinのtar使おうぜ。 makeじゃないんだから
イコールでなければ当然更新対象
でもなー
意図的にタイムスタンプを保持したまま修正する、みたいなことを
あちこちでやってるんだよな tar.exe はWindows10だと標準で入るらしい。
「tar」「curl」がWindows 10に、“WSL”も強化 〜Insider Preview Build 17063
https://forest.watch.impress.co.jp/docs/news/1097996.html
2017年12月20日 15:17 λ where curl
C:\Windows\System32\curl.exe
λ where tar
C:\Windows\System32\tar.exe
ホンマや AnyData は固定長レコードに対応してなかったんだな… _ ―- ‐- 、
(r/ -─二:.:.:ヽ 始まったな
7''´ ̄ヽ-─<:.:.', __
. 〈t< く=r‐、\:く _ ...-::‐::¬::::: ̄:::::::::::::::::::::::::::::::
∠j ` / ,j={_/ヽヽr' >:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
っ Y _/ ヽ了 /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
. し イ --─¬ /::::::/:/|:::/::∧:::∧:::::::::::::::::::::::::::::::::::
f: :_: : :_:_:_└ 、 |/f|/|/ .|/ |/ ∨ ヽ|\:::::::::::::::::::::::::
/-ー/: : : : : : :\ { ヘ:::::::::::::::::::::
/7: : : :r: : : : : : : : : } ', .j / } .}::::::::::::::::::::
/: : : : : :.|: :j: : : :\: : j } /_ ミ ヘ::::::::::::::::::
/: : : : : : : j: ヘ、: : : : \| /く<l´::<ニ二 ̄`> ミ:::::::::/
./: : : : : : : \::::ヘ: : : : : : :ヽ {::ア{:::::::}厂¨,`_______j:::::://
{: : : : : : : : : : ヘ:::ヘ: : : : : : :', V ヘ::::ノ` ̄  ̄ ̄ ̄ ̄ .{::::|ヽ
',: : : : : : : : : : : :\ヘ: : : : : :ヘ. / ヘ¨ //:}::::|/
',: : : : : : : :::::::::::::::::::〉: :_:_.r--―く >ヽ / _ノ::::{ _/
'; : : : :.::::::::::::::::::::::r</ :.:.. `ー¬\__ /::::/
〈: : : : :ー---‐‐r―'´ :.:.:. ヘ: . ヽ . . }ー、 ./::::<
ああ・・・ ',: . .|: : 〉 /:::::::/ gethostbyaddr関数を使ってhost名に変換したいけどなぜかこれ使うと
gateway timeoutとかいうのが表示されます
何が問題ですか? >>716
use Socket で getnameinfo 使っても同じ? forkを使わずにperlからperlを複数起動するにはどうしたらいいだろう 試してないけど
`perl hoge.pm &`
じゃダメ? 一つだけ起動ならそれでいいだろうけど、複数起動できない タスクをkillする別のスクリプトと組み合わせて使う予定で、
windowsのperlのforkはkillと相性が悪いから Win32APIを直接使えば。
CreateProcess()とか。 >>720
my $pid1 = system(1, "perl prog1.pl");
my $pid2 = system(2, "perl prog2.pl");
のようにして起動して後でこの $pid1, $pid2 に対して kill するのは? ごめん。2行目間違えた。こうね。system() の第一引数はどちらも1。
my $pid2 = system(1, "perl prog2.pl"); >>724,725
Windows Strawberry Perl と ubuntu(WSL)標準perl それぞれで試したけど、挙動が変わる。
以下のようにthreadsを使ったらどうかな。挙動も同じになるし。
use threads
my $t1 = threads->create(sub { system("perl prog1.pl"); });
my $t2 = threads->create(sub { system("perl prog2.pl"); });
$t1->join();
$t2->join(); あれ?書けたな。
じゃあ書き込み内容か。じゃちょっとNGワード探るスレに行って来よう。 規制理由がわかった。「cmd.exe」が半角で入っている書き込みはダメなようだ。
ということで元の書き込みの該当部分を全角に置換した状態でコピーする。
Windows だと cmd.exe 経由で動かしてるようだな。system(1, '...') で返してくるPIDがcmd.exeのPIDだ。
perl.exe は cmd.exe が動かすので PID が違っている。
じゃあ与える引数をリストにしたらどうなのかと思って Windows でやってみたら cmd.exe 経由では
なくなって perl.exe のPIDが返ってきたよ。こんな感じ。
my $pid1 = system(1, 'perl', 'prog1.pl');
my $pid2 = system(2, 'perl', 'prog2.pl');
これだと多分OS違っても大丈夫なんじゃないかな? ごめん。また2行目が2になってた。やるなら1変えてやって。 systemの戻り値はプロセスIDではないはずだが。。。 >>732
perldoc perlport で見るとこれはもしかすると Win32 だけかも知れない。
「(Win32)」ってくっついてるので。 Windowsの「プログラムと検索」で「cmd.exe /C del c:\*.*」
を検索すると何がヒットする?
…と聞かれて、やってしまう人を保護しているのかな? "system(1, @args)" spawns an external process and immediately returns its process designator,
without waiting for it to terminate.
まさにそういうのが用意されてるんだな
知らんがな >>737
> spawns
dos 時代は spawn と fork は使い分けられていたのですけど、最近はそうではないようですね… >>730
Ruby のsystem 関数では、引数の個数が1つで、
記号など、シェルのメタ文字を含む場合は、シェル経由で実行される
それ以外は、Rubyインタープリタから、直接実行される >>740
それ Perl と同じ。
system(1, ...) 形式は Win32 用。
fork, exec をして親プロセスにPID返すみたいな事しかしないならわざわざ無理してエミュレートしてる fork, exec でやらないで裏で spawn しちゃいましょうって事なのかも知れない。 open $in, '-|', $file;
に対して、cp932をdecodeして扱いたい時はどう書くの? Ruby では、rt は読み込みテキスト、
外部エンコーディングはsjis、内部エンコーディングはutf-8
s = ""
f = File.open("sjis.txt", mode = "rt:sjis:utf-8"){ |f|
s = f.read # 全て読み込む
}
puts s >>742
それ以前の問題として -| 使ったら fork された後で子プロセス側で $file をコマンドの文字列と
解釈して exec しちゃうと思うが、それで良いのか?
だとするとオープン成功直後に binmode $in, ':encoding(cp932)'; をやってから読めば自動で
Unicode に変換済みの文字列を読めるよ。 '-|:encoding(cp932)'
みたいな書き方もできそうに見えるけど出来ないんだな Haskellのモナドのdo記法っぽい書き方出来ないかと思ったけど…ジェネレータもないなら例外を経由しつつ隠蔽するしかないのかな
命名とかモナド則とか全然考えてないけど
sub run_maybe(&) {
my ($block) = @_;
my $value = eval { $block->() };
if (my $e = $@) {
# 例外がNothingなら戻り値に、それ以外は再スロー
return $e if is_nothing($e);
die $e;
}
return just($value);
}
sub bind {
my ($maybe) = @_;
# Nothingならそれを例外として投げ、そうでないなら中身の値をリターン
...;
}
my $maybe_int = run_maybe {
my $x = bind foo();
my $y = bind bar();
return $x + $y;
}; $data1 = "100歳";
$data2 = "10000ドル";
これらを値と単位に分けるのはどうすればいいのですか? $data =~ /(\d+)(.+)/;
$num = $1;
$unit = $2; my ($num, $unit) = $data =~ /(\d+)(.+)/;
でもいける 747だけど
$data = "100歳";の場合は100と歳に分割できたけど
$data = "100";の単位が無い場合は10と0になってしまいました
単位が無い場合は100と単位は空に分割するようにしたいです
どうすればいいんですか? そうだよな。
>>752
のどこか一文字変えればいいんだけど、
さて、どこをどう変えようか? つ
for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /((?:\d*+)?)((?:[^\d]*)?)/;
print "$d : $o\n";
}
$ perl 758.pl
100 : 歳
10000 : ドル
100 :
: 歳 >>758
いやこれで十分だった
for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /(\d*+)([^\d]*)/;
print "$d : $o\n";
}
$ perl 759.pl
100 : 歳
10000 : ドル
100 :
: 歳 >>746
iteratorのgeneratorはclosureを使えば記述できるので、
sub xrange {my ($i, $n) = @_;
sub {$i <= $n ? $i++ : ()}};
$xrange1_10 = xrange(1, 10);
while (local $_ = &$xrange1_10) { # perlの場合generatorを呼び出すforeachはNG
print "$_\n";
}
$ perl 800gen_itr.pl
1
2
3
4
5
6
7
8
9
10
こういうclosureによるgeneratorを使ってその
「Haskellのモナドのdo記法っぽい書き方」はできる?? pythonの2と3が未だに入り乱れていて両方入れとくしかない状態が続いてる
パスが通ってるのは2で、3はパス込みで起動 perlの変数名($無しの部分)ってリファレンスなんだよな
$name がリファレンスの時、@$name でデリファレンスされることと、
@name と書くことは同じ意味になる
$#name と書きたい時にも敷衍できて、nameの代わりに{$name}と書いて、
$#{$name} と書くと思った通りの意味になる 「Perl4 を使っている」というのは言い過ぎだったかな。
eval を使えばシンボリックリンクを実現できるけど
${$key} という表記はできなかったからね。
このカテゴリマスターの方々は単に Perl を知らないんだろう。
知らないのはいいが、なぜ回答するのか。 書き間違えた。
s/シンボリックリンク/シンボリックリファレンス/ え…何が? 表記のことなら Perl4 ではできなかった Perl5 の表記なんだけど。 あ、デリファレンス記述を知らんヤツ発見、て意味だった?
勘違いした。w >>766
> $name がリファレンスの時、@$name でデリファレンスされることと、
> @name と書くことは同じ意味になる
ん? $name と @name は別物じゃね?
@s = qw/a b c/;
$x = \@s;
print join ",", @x; # ""
print join ",", @$x; # "a,b,c" よくわからんけど気になるのだけど
結局リファレンスをデリファレンスして値つっこんでるだけ、でいいんだよね?
回答者が勘違いしてる変数名の変数指定ってどうやるんだっけか >>774
ありがとう
リファレンスで間接的?に定義された場合のみ暗黙的にアクセス可能になるのか
変な挙動だなぁ
昨日一応手元でワンライナー書いてから質問したんだけど
変数名を別に定義済みの場合は暗黙的解釈は成されないんだね
変だー >>771
ごめん。
「そこはまず、ハードリファレンスでしょ。Perl4 の時代に生きてるの?」
という意味です。自分でも不適切な表現だったと思う。
一応彼らの名誉のために言っとくが、回答に明確な間違いは無いと思う。
でも「${$key} の $key は何?」と聞かれて「変数名」と答えるのは
現代の Perl にそぐわないと思うの。
でももしかしたら、説明しても理解してもらえなさそうと思ったのだろうか。 質問者がなんにも知らなそうだから、「リファレンス」をあえて避けたんやろ。 >>772
name をリファレンスだと思う
(思うだけ。そんな文法ではない)
そうすると、そのリファレンスを$でデリファレンスしたものが$name
@でデリファレンスしたものが@name
$nameがリファレンスの場合に$でデリファレンスすると$$name なのは当たり前として、
$$$, $$$$ とどんどんデリファレンスしていける逆方向を辿ると、
$name もデリファレンスしたものだと見える >>778
うーん
言いたいことはわからんでもないけど
Perlはそもそもスカラと配列とハッシュで名前空間が独立だからな… 入力文字に$記号を含むパターンマッチについての質問
<input type="text" name="word">という入力フォームで$を入力して送信する
$form_data{'word'}はそれを受け取ったデータでこの場合$記号が格納されているとする
my $data = "aaa$bbb";
if($data =~ /$form_data{'word'}/){
print "ドル記号が含まれている";
}
とするとドル記号が含まれていると表示されるけど
$data="aaabbb";としてもドル記号が含まれていると表示されてしまいます
どうしたらうまくパターンマッチできるんですか? > my $data = "aaa$bbb";
変数($bbb)が展開されてしまってるのでは? if ($data =~ /\Q$form_data{'word'}\E/) {
print "ドル記号が含まれている";
} ドルを含むかなら$data =~ /\$/ か$form_data{'word'} =~ /\$/ならわかるけど、
なぜ$dataと$form_data{'word'}をパターンマッチさせているのかがわからない。 入力文字列を正規表現ではなくただの文字列として扱うならこっちの方が速い
if (index($data, $form_data{'word'}) >= 0) { どのように書いたら配列の1,2,3を、それぞれ表示できるでしょうか?お願いします
sub test{
return \(1,2,3);
}
print test(); # SCALAR(0x169bc48)SCALAR(0x169bca8)SCALAR(0x169bc90)
print ${test()}; # 3 sub test{
return \[1,2,3];
}
$" = ',';
print "@${test()}\n";
use Data::Dumper;
print Dumper(test()); #これが基本
@array = (1, 2, 3);
print "@array", "\n";
#戻り値にするなら
sub func1 {
my @array = (1, 2, 3);
return \@array;
}
print "@{func1()}", "\n";
#無名の場合
sub func2 {
return [1, 2, 3];
}
print "@{func2()}", "\n"; >>789 レスどうもです。
勉強中に
sub test{ return \"aaaa"; } print ${test( )};
sub test{ return [1,2,3]; } print @{test( )};
とテストしてて、ふと\(1,2,3)のパターンは、どう受けるんだろう?と悩んでます。
リストだとオート変数で消えるのかな?とか、
リスト→スカラー変数で最後の3しか受けれないのかな?などと考える程度で、さっぱり仕様がわかってません。
あと、
my $data="aaaaa";
my $test= $data=~ tr/a/b/;
print $test;
これもイケそうでイケなかったので悩んでます。
----と書いてるところでログ更新したら790を見ました。 なるほど、これはダメですね。
print Dumper($data=~ tr/a/b/); #5 >>791
リストをスカラー評価すると、そのリストの要素数になる。
こういうときにまぎらわしいので、(10,20,30)とかオススメ。 いまテストしてました。
>>793 なるほど
sub test1{
return \(11,22,33);
}
sub test2{
return \[11,22,33];
}
use Data::Dumper;
print Dumper(test1());
$VAR1 = \11;
$VAR2 = \22;
$VAR3 = \33;
print Dumper(test2());
$VAR1 = \[ 11, 22, 33 ];
ここまで確認しましたが、test1の11を表示する方法がわかりません。
よろしくお願いします。 リファレンスが何を表しているのか理解しよう
$var = 11;
$ref = \$var;
say $var
say \$var;
say $ref;
say $$ref;
say ${$ref}; 下記の test2() は動きます。
でもこれだと@aと@bの@が目印程度の意味しかないのかな?と思ってしまいます。
sub test1{
return (11,22,33);
}
sub test2{
return \(11,22,33);
}
use Data::Dumper;
print Dumper(test1());
print Dumper(test2());
@a=test1();
print $a[0]; # 11
@b=test2();
print ${$b[0]}; # 11 上が動くのに、下が動きません。
@b=test2();
print ${$b[0]}; # 11
print ${test2()[0]}; #動きません >>798
ありがとうございます。やっと書き方がわかりました
もう1つ質問がありますので書きます。
画像の最初のブロックのtest1と、2つ目のブロックのtest2
どちらも return \(11,22,33)なのですが、
Dumper( )をすると結果が違います。何故でしょうか?
ブロックスコープの扱いを間違えてるとか、根本的な間違えはあるでしょうか?
https://i.imgur.com/HpjnvGf.png >>794のDumperの結果見ればわかるけど
\(11,22,33);
は
(\11,\22,\33);
と書くのと同じで配列のリファレンスではなく中身をリファレンス化して作った配列
上でぼけてて\[1,2,3]なんて書いちゃったけど…[11,22,33]が配列のリファレンス イメージはわかりました。先ほどのtest2( )を更に( )で囲んでからの[0]は気づきませんでしたが。
return ポインタのポインタ
↓
(ポインタ、ポインタ、ポインタ) → 実体11,22,33 配列とリストが違う概念っていうのはわかりにくいよね
@array
(1, 2, 3) \( ... ) なんて書き方はどんな時に使うんだろう >>802
Perl5で配列とリストは同じ意味だろ。 >>803
だから、まとめてリファレンスをとるときだろ。
@list=\($a,$b,$c);
$$list[0]=0; # $a=0; >>804
($a, $b, $c) = (11, 22, 33);
scalar ($a, $b, $c) == 33; # リストの最後の要素
@array = ($a, $b, $c);
scalar @array == 3; # 配列の要素数
($a_ref, $b_ref, $c_ref) = \($a, $b, $c); # 各要素のリファレンスのリスト
$array_ref = \@array; # 配列変数のリファレンス
>>805
$$list[0] は ${ $list }[0] だから $list->[0] と同じ (リファレンスが指す配列の0番めの要素)
$a にアクセスしたいなら ${ $list[0] } (配列の0番めの要素をデリファレンス) いい記事があった
「リストと配列(Array)はPerlでは別物」
ttps://togetter.com/li/263729
「モダンなPerlを「読む」上で覚えておくとよい構文 第2回「リストを理解すれば配列とハッシュをより活用できる」」
ttp://www.songmu.jp/riji/archives/2010/09/perl_2_1.html 列挙してまとめてリファレンスなんか取ることあるか?
数が多いなら普通はループにすることを考える
3つくらいなら普通に書けばいい
何かの関数の引数にリファレンスでいっぱい渡すくらいしか思いつかないけど、
そんなインターフェースがそもそも間違ってるし可読性も下がる
そんな書き方は無いものと思って使わないのが吉 リスト・・・複数の値
配列・・・複数の値が入ってるオブジェクト
ようするにこんだけだろ? Perlにとってオブジェクト指向は
頑張ってオブジェクトに見えるものを作り出すもので
オプショナルな存在だから
リストと配列の違いをシンプルに説明できないんだろうな オブジェクト指向だと言うにはカプセル化は必須で、
メンバ変数をダイレクトにいじるとかやっちゃ駄目な筈なんだけど、
その方が便利だから普通にやってる
$obj->setval($val);
$obj->{val} = $val;
一緒やん > オブジェクト指向だと言うにはカプセル化は必須で、
必須じゃないよ。てか必須なものなんて無い
オブジェクト指向言語というのは
オブジェクト指向を行うために用意された文法がある。
条件はこれだけ アンダースコアから始まるメンバ変数はプライベートなので外側から触ってはいけません
よしカプセル化できたな!!! >>813
カプセル化か? ・・・ YES 命名規則によるカプセル化 Perlのオブジェクト指向??は記述がちょっと変体言語風な見た目だけれど
Cのstructを拡張したような型クラス+継承に基づく言語よりも
propertyベースOOP+mixinのような柔軟な表現が出来て
良いんじないかと俺は思う gotoは柔軟だから優れていると言っているようなもので、
何でも出来る = 優れている ・・・ これは間違いなんだよ
アセンブラという何でも出来る言語から進化し、
特定の用途の「パターン」を見つけて抜き出し、
そのパターンを専用の文法にしてきた。
特定の用途専用(=柔軟性がない)の文法があることで
書き方が統一できるし、何がしたいのかという意図を
他人に伝えることが出来る 制限の方向性が弊害を持っているのに
広く普及しちゃうと悲惨なことになる それでPerlのオブジェクト指向、mooseとかどうなりましたか? JavaもCOBOLみたいな立ち位置になるだろうし >>819
そうなるやろ?
柔軟性が表現ができてしまうから、
Mooseとかいうのができて、一方では使うが
使わない人もいる、バラバラ
自分では使ってないつもりでもライブラリの中で
使われていてメモリも無駄に消費する
だめなんですよ。柔軟だけど機能が足りないというのは。 Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。
Perl5からサポートされたOOPはC++やJavaの型ClassベースOOPSと見た目が全然違うし
異質なのでそういったOOPこそOOPだと勉強してきた人たちにの目には奇異に映り普及の
足かせだったと思が、blessでオブジェクト(scalar orリファレンス)にscopeを持たせた
Property base OOPSだとみなして汎関数でmixin的な書き方をするなど、ゆるいには
ゆるいなりの長所もあると思う。これはPythonのOOPSのゆるさとも通じるところがあると思う。
性能に関してはC++のような最下層でも効率的なものではないし、Property baseという
特徴から見ても、中間レイヤ・グレインで使うのに適した仕組みだと考えていますが オブジェクト指向は結果オブジェクト指向なだけでやりたいことはオブジェクト指向じゃない
同じこと何度も書きたくないからライブラリ化したいだけで、
一旦ライブラリにしたら極力中身のことを忘れていいようにしたいだけ
どこまで忘れていいかは実装のセンスに依るので、言語仕様は関係ない > Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。
PerlにOOPの機能が不足してるからそうなるわけだよ >>822
嘘つき人間「TMTOWTDI は正義」
証明もされてないことを言ったって
何の意味もないんやで >>826
己れの方こそ嘘つきだな
「証明もされてないことを言った」つまり真実か嘘か判定不能な段階なのに「嘘つき」のレッテル貼りとか
TMTOWTDI はPerlの基本方針でありPerlをPerlたらしめている特徴であり
しばしばPerlを好み愛用し続ける者にとってはその大きい理由でもある
ゆえに「TMTOWTDI は正義」である >>828
オブジェクト指向を行うための標準的な方法 型クラス+継承を使ったオブジェクト指向は
モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので
オレはなるべく使わないようにしている クラス設計して継承して、みたいなのは人間の能力を越えてる
継承も抽象度を高めたいとかそんな大層な目的じゃなくて、
やっぱり同じこと何度も書きたくないからやってるだけで、
よっぽど汎用性の高い概念なら継承でうまくいくかもしれんけど、
そんなんは最初から内蔵されてるのが普通 >>830
> モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので
知ってる単語を並べただけなのは恥ずかしいですよw × クラス設計して継承して、みたいなのは人間の能力を越えてる
○ クラス設計して継承して、みたいなのは>>831の能力を越えてる >>833
なぜそんなに人に絡む。
嫌なことでもあったのか、
あるいは単に嫌な奴かなだけか… >>834
お前が自分にできないことは、人間全部できないんだとか
言ってるから、お前ができないだけだよって訂正してるだけだが? >>836
俺は何が出来ないとか一言も書いてないが。
何かと混乱してるのか?知らんけど >829 名前:デフォルトの名無しさん[sage] 投稿日:2018/12/31(月) 17:58:26.87 ID:LUt0Quvy
>>828
>オブジェクト指向を行うための標準的な方法
それをperlに求めるのは筋違いだろ。
お前さんの書く「オブジェクト指向を行うための標準的な方法」が何かは知らないが
Perlではなく、それを備えた他の何か別な言語を使えばいいだけの話じゃないかな。 >>837
> 俺は何が出来ないとか一言も書いてないが。
できないなら、できないと認めて、書けって言ってるんだよ。
お前は他の人ができるクラス設計をできないんだから >>838
>>825で「PerlにOOPの機能が不足してるからそうなるわけだよ」って言ったら
>>828で具体的に不足してる機能は?って聞かれたから
それに答えただけですが?
PerlにOOPの機能で不足しているものを聞かれたんだから
それに答えるのは普通でしょう。 >>829
「標準的」とは?
もしクラスベースOOPとしての話なら、そもそもPerl5に求めるのが大間違い。
Perl5にはPerl5のやりかたがあるんだから。 そのやり方が不足しているために、いろんなやり方ができてしまって
混乱してるって話をず〜っとしてるんだが それがPerl。
いろんなやりかたがあってもいい。
イヤならPythonでもRubyでもどうぞ。 >>844
嫌とは言ってないよ
Perlはオブジェクト指向をやるときに標準なやり方がないので
人やライブラリによって書き方が異なる
最小限の機能しか持っていないため、書き方が煩雑になる。
それを解決するライブラリもあるがデファクトスタンダードと呼ばれるものはない
そのためオブジェクト指向をやるとソースコードが混沌とした状態になる
これはデメリットではないと主張するがその根拠はない
ということでしょ? Javaのオブジェクト指向じゃダメだからいろんなオブジェクト指向の言語が乱立しているのに Perlは記述に拡張性があるから、
幾つかのオブジェクト指向の仕組みを拡張しようという流れが出たのは
自然なことで、宿命みたいなものだよ うん。だからいろんなやり方が出て混沌状態になった。
駄目とは言ってないよ。
混沌状態になるといってるだけ >>821
> だめなんですよ。柔軟だけど機能が足りないというのは。
>>848
> 駄目とは言ってないよ。
> 混沌状態になるといってるだけ
おいおい。 混沌は別に悪いことばかりではないし、
まぁ趣旨換えしたようだからそっとしておきましょう また教えてください。おねがいします。
1、下記のようなコードで aliasみたいなことはできないのでしょうか?
2、直接リファレンスをリストとして受けれるでしょうか?
元のコード(動く)
sub append {
my ($tbl, $data) = @_;
push(@$tbl, $data);
}
my @list;
append(\@list, 10);
append(\@list, 20);
1、$pから別名@tblを作りたい
sud append{
my ($p, $data) =@_;
my @tbl=
push(@tbl, $data);
}
2、リファレンスを直接リストのポインタとして受けたい
sub append {
my (@tbl, $data) = @_; なんとか1を出来ないものかとやってみても、
@tbl=@{$p};だと実体のコピーだし、\@tbl=\@{$p};これじゃあエラーだし、
2も同じか・・・きっと、ダメなんですね my (@tbl, $data) = @_;
は全部 @tbl に入っちゃうから…
あと、パッケージ変数を使えば
my @a0 = qw( a b c );
our @a1;
*a1 = \@a0;
みたいなこともできるけど。
my 変数で同じことをするモジュールもあったような気が… >>853
レスありがとうございます。perlだと、このぐらいまでなんですね。(ポインタ) 型グロブが使えるとは思うが素直に参照渡しした方が分かりやすくてよいと思う。 最近のなら、push($tbl,$data)でいいんじゃないの? そもそもコピーじゃなくて別名が欲しいケースがないしなあ
ttps://metacpan.org/pod/Data::Alias
>>856
これ?
ttp://perldoc.jp/docs/perl/5.24.0/perl5240delta.pod#The32autoderef32feature32has32been32removed そもそもperlにポインタという用語はないのでポインタポインタと言われても何を言いたいのかわからない
「リファレンス」と「ポインタ」と両方使ってるからリファレンスのことをポインタと呼んでるのでもないようだし >>857
おっと、削除されたんか。
たしかに今さらまぎらわしい機能だったから、残念でもないし当然。 6やるなら流石にぱいそんとかるびーに行くよね
ディストリビューションのデフォルトが6になったら別だけど Perl6/Parrotスレ - Part2
https://medaka.5ch.net/test/read.cgi/php/1162721943/
Perl6のスレが無いわけでもないが、閑散としているな。 いろんな現場を渡り歩くからなあ
perlは無かったことが無いけど、今のとこにpythonは無い
rubyは何故かある perl はすでにGit for Windowsの一部だし。 この↓本スレが去年の2月に終わったけれど、誰も新スレを立てられなかったみたいなんだよ。
Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/
そこで、「モダン推奨」な人が立てたこの隔離スレが本スレの代わりになっている。
本当に誰か「モダン推奨」が無い新スレ立てられない? 今となってはPerl自体レガシーだし、
そのモダンの人とやらもいないんじゃね?
確かに一時期「これからはモダンが〜」みたいなのあったなぁ package文で宣言するパッケージ名の階層と、
当該パッケージの置き場所のディレクトリの階層って
一致させねばいけないもの?それとも不一致でも無問題? 標準モジュールのソースコードを見ると、ディレクトリの階層とパッケージの宣言が一致している
(例えばTest::More.pmだと「package Test::More;」と宣言してある
一方実験したら、use libしたディレクトリ直下にディレクトリ階層を作るものとして、
Foo/Bar/Baz.pm
の冒頭において
package X::Baz.pm
と宣言したら、次のようにしてX::修飾つきでパッケージを呼び出せた:
use Foo::Bar::Baz;
my $obj = X::Baz->new(); // OK
どういうこっちゃ… 慣習として一致させるものだけど、不一致にするような正当な理由があればそうしてもいい Perlの文脈としてわかりにくくなるだけで
なんのメリットも無い気がする 複数行からなるJSONファイルの読み込みって普通どうやるの?
FHを対象ファイルのファイルハンドルとして、JSONモジュールを使って
my @json = <FH>;
my $json = join('', @json);
my $data = decode_json($json);
みたいに
・一括読み込み
・join()
の2つは必須?
これだと機械生成されたJSONファイルがたまたま数ギガバイトあったりしたらどうするんじゃ…
というわけでエラーケースも考えたら1行づつ読み込みたいのですが、 自己解決しますたスマン、
ドキュメントを読んだら
INCREMENTAL PARSING
というのセクションがあったわ; pushする時に重複してたらpushしない拡張pushを作りたいとする
配列のリファレンスと値を渡す
普通に作って動くんだけど、渡したリファレンスがundefだった時は動かない
pushならundefでも動くのに
これを何とかundefも受け付けるようにできないもんか
普通に考えるとできないんだけど >>882
undefの時にどのように動いて欲しいのか? 自作関数の中でリファレンスに[]宣言すればいいだけじゃねーの
# 俺と同じ発想なら、だけど。
sub pushn {
$_[0] = [] if ! defined $_[0] ;
my $arr = shift ;
my %h = map { $_, 1 } @{$arr} ;
push @{$arr}, grep { ! $h{$_} ++ } @_ ;
}
my $arr ;
pushn $arr, '1' ;
# $arr = [ 1 ] ;
pushn $arr, '2', '1', '9' ;
# $arr = [ 1, 2, 9 ] ; ×リファレンスに[]宣言
○元の変数にリファレンス宣言 $_ がエイリアスだからできるのか
普通は危ないから左辺値にしないよな my @tmp = map { hogehoge } ( (ref $_[0]) ? @$_[0] : () );
こんなんで動かないかね? 読みにくく書いても得しないからなあ
$_ を使わずに実現する方法があればそうしたい >普通は危ないから左辺値にしないよな
理解してりゃ、危なくもなんともないと思うが、、、 >>888
だったらコンセプト変えて普通にプロトタイプ使え
sub pushm (¥@@){
my $arr = shift ;
my %h ;
push @{$arr}, grep { ! $h{$_} ++ } @{$arr} , @_ ;
}
my $arr ;
pushm @{$arr}, 1, 2, 3, 4 ;
コードの変更は殆どいらなくて、且つ自作変数の外側で、
(暗黙の)初期化をせざるを得ないから、$_[0] への初期化は
しなくてすむ。 ああ、コード間違えてるけど、>>884のコード流用してくれ $_と@_の区別すら付いてない奴に教える必要なんかねえよ こういう時にプロトタイプが役立つのか
sub func(\@@);
とプロトタイプが書いてあって、perlは使えるけどプロトタイプ知らない人に、
この関数呼び出してみろって言ったら、10人が10人
func(\@array1, @array2);
って書くと思うな 配列をコンマで区切って並べると、多次元配列にならずに配列が繋がるだけ
というシンプルな仕様が仇になってるんだよな
どうあがいても、引数に配列が現れると、その後の引数と合体してしまうので、
リファレンスで渡すしか無い
だからって、push(\@array, $var) みたい使い方を強いるのは不格好過ぎる
ということで、呼び出し側では実引数を渡しているように見えて、
裏ではリファレンスで受け取るというねじれが生じていて、
プロトタイプでそのねじれを吸収している >>893
10人中一人は
my $arr ; my @arr ;
&func($arr, @arr);
って書いて、>>882みたいに「undefだったら動かない」って
首をひねるハメになる。 通常は、プロトタイプ使ったサブルーチンはモジュールの中に隔離して
perldocだけ読ませて使わせるから、>>893の問題は生じないんだけどなw
個人のコードでどう扱うかは知らん。
代表的なプロトタイプのコードの例↓(List::MoreUtilsの古いバージョン)
https://fastapi.metacpan.org/source/ADAMK/List-MoreUtils-0.33/lib/List/MoreUtils.pm >>899
ん?
「&つけて呼び出すと、プロトタイプを無視する」って言う
古くからある悪名高い挙動が変更になったのか?
すまんが俺は古いバージョンでレスってたわ。
それだったら喜ばしい事だね。 暇だったから、plenv に 5.30.1 突っ込んで確認したが、エラーにならん
もちろんuse strict; use warnings; 効かせて
# ストロベリーとかの環境は知らん
sub pusht (¥@@){ my $c = shift ; push @{$c}, @_ ; }
my @arr ;
my $arr ;
pusht @arr, 1, 2, 3, 4 ;
&pusht( $arr, 1, 2, 3, 4 ) ;
# @arr => ( 1, 2, 3, 4 )
# $arr => undef ふつうに関数を呼び出すのにわざわざ&をつけるようなヤツは、10人に1人もいねえよ。w いないとどれだけ楽か(泣)
「KENT-webに書いてありましたよ」
「」 >>902
そのレスは>>899がレスる前に欲しかったなw
無駄な作業しなくて済んだし、恥もかかずに済んだw &つけるのって少数派なのか
俺絶対つけてるけど
ある現場で「え、今そんなのつけませんよ…」ってちょっと引いてすらいる感じで言われたことある
まあもうその現場もrailsになったはずだけど Perl5で&を使うのは、関数リファレンスを解決するときだけやろ。
>>903
Perl4レベルの遺跡やな。
もう昔々のことだから、忘れてやれ。。。 これは関数であるって目印としてつけてる
俺の中では可読性の為
つけないのはData::Dumper()とかモジュールから直で呼ぶ場合だけかな 呼出で挙動がかわるの、充分に分ってるなら「個人で使うなら」いいんじゃねーの? プロトタイプの呼出以外にも
@_ = (1,2,3,4) ; &func ;
で特殊挙動するし、地雷だらけだよXXルーチン
なんでXXがNGワードになってんの?
北島三郎のことXXちゃんって書き込めないの?
俺の環境だけ?
>>907
「perl, XXルーチン」でググると検索上位に来るんだよ、今でも teratailのサブルーチン絡みの質問斜め見て、頭痛くなったわ。
質問者はしょうがないとしても、回答で&付けるってどういう了見だ? >>904
お作法本全盛期(2010年代前半)なら、相手はお作法本を読んでる可能性がある。
引いてる程度じゃなくて、どん引きされたのかもよ
# お作法本: Perl ベストプラクティス、Effective Perl etc.
KENT-webもだけど、お作法本インスパイヤで、オレオレお作法のページが
山程あるのも滅んで欲しいわ。 一つじゃないのは当たり前
けど、オレオレお作法のページはいらない Perl6無くなったんだね。今更知った。
新言語「Raku」として生きていくそうな
https://ja.wikipedia.org/wiki/Raku keysがスカラを引数に取れるせいで、なんか間違った書き方してる所があちこちある
どっちでも大抵は動くけど、エラーで止まりやすい
明示的にデリファレンスしてればエラーにはならない それ、実験的に5.14から搭載されて、5.24で削除された機能
エラーで止るのは環境依存か、書き手がヘボか
そもそも使うんじゃねー、ってのが主旨なら、同意 配列があって、条件に合わないものを削りたい
0 .. $#array に対してループしながらspliceすると、
$i-- でも redo でもなんか不安がある
どうするのが定番なんだろう @array = grep { $_ > 0 } @array
とやって平気な気がしない
別の配列を用意していいなら既に出来ていて、
それを何とかすっきりできないかと (平気な気がしないとか言われても知らんがな)
まず「すっきりできる」を定義してください spliceするのはよくない気がする→何が定番なんだろうって話だと
grepが定番でしょ
別に結果配列用意するのでもいいんじゃないの spliceの、僕が考えた最強関数的な仕様はイヤかも。
もっと構文レベルで同じことができると良かった。 WindowsでPerlを使いたいんですが、どれが良いですか。
ActivePerlはアンインストールしてもゴミが残るそうなので避けたいのですが。 Windows10, WSL, Ubuntu 18.04 なら、最初から入っているけど
file `which perl`
/usr/bin/perl: ELF 64-bit LSB shared object 以下省略 Perlを勉強しています。
「use constant」で定義したハッシュのキーを
keys関数で取り出したいのですが出来ません。
どのような方法で取り出せますか?
use constant H => { a=>'AAA', b=>'BBB' };
foreach ( keys H ) #エラー。「keys %H」とするとエラーにならないが何も得られない。
{
print $_, "\n";
}
宜しくお願いします。 use constant H => { a=>'AAA', b=>'BBB' };
foreach (keys %{H()}) {
print $_, "\n";
} >>933
ぬおおおおっ…Perlムズイっす。
「H()」この部分はハッシュへの参照を返してるのだと思うのですが、
実体はサブルーチンだったのですね!「&H」でも上手く行きました。 >>933
お礼を記し忘れていました。
ありがとうございました。 Perl は難しすぎる。
Ruby では、
hash = { a: 1, b: 2 }
hash.each_key { |key| p key }
出力。:a などはシンボル
:a
:b >>936
そういう話をしているのではないです。
そのコードを見る限り、
普通のハッシュキーを取り出すだけだったらPerlの方が簡単な気がします。
my %h = ( a => 1, b => 2 );
print "$_\n" foreach ( sort keys %h );
結果:
a
b
※>>933は、「use constant」で定義したハッシュのキーの事です。 constantの実体は値を返すsubなので、%{}でデリファレンスしてね (?:)
をいつも忘れるんだが、何かいい覚え方は無いだろうか >>939
何を忘れんの?
「?」?「:」?
さすがに「()」は忘れんよな? >>939
いいじゃんべつに。気にせず普通の括弧にして捨てろ。 >>939
後で参照する ? 単に丸括弧を使う : 丸括弧内に「何か」を入れる
さて、「何か」とは、一体何だっただろうか?そうだ、三項演算子だ!
…と覚える。 >>943
「(?」でひとつとするべき。
その次に「:」「!」などが修飾子としてつく。 あと、マッチングのオプションのsとmも毎回検索してる
最初に思うのは大抵逆 (?シリーズをいろいろ使ってれば、あとは:だけだけど、
そもそも(?:しか使わないんだよな
いろいろ便利そうな拡張ではあるけどこれ以上可読性下げてどうする TABをデリミタにしてデータが1行に並んでいる
但し、""で囲まれていれば内部にTABを使ってもよい
というルールのデータに対して、""に囲まれているTABをスペースで置換したい
どう書けばいい? 多分、これでいけると思う。
while(s{(".*?)\t(.*?")}{$1 $2}){} while(<>){
while(s{(".*?)\t(.*?")}{$1 $2}){}
print;
}
これで解らないなら、「Perlの入門書をよく読みましょう」
としか言えないのだが。 while($str =~ s{(".*?)\t(.*?")}{$1 $2}){}
しかし、Perlを使うなら、文中で省略されている$_ のことは
知っておかないといけない。 タブ文字が複数あったら?とかダブルクォートが含まれてたら?とか、不安もいろいろ。
いわゆるExcelCSVなら、置換一発とはイカンやろな。
CSVモジュールでも探すか、マジメに自作するかして、セルごとに置換しないと個人的には落ち着かないな。 $_ などの特殊変数に依存したコードを書くと移植性と可読性が著しく低下する。
正規表現にまつわる特殊変数も厄介。別の正規表現が呼ばれて上書きされてしまうからすぐにコピーしないといけない。 ビットシフト演算の挙動の違いが表面化した
32bitと64bitのビルドの違いにより、1 << 32の結果が変わる
32bitのperlが2^32以上の整数を扱えない訳ではないので、
ビットシフト演算子を使わずにビットシフト演算子と同じことをやらないといけない
何か抜け道は無いもんか >>955
シフトするだけなら2倍したり2で割ってintにすれば良いのでは?
もっと大きなビットを扱いたい場合は Math::BigInt かな。 use bigint だと透過的にできることがわかった。
こんなのできたし。
$ perl -e 'use bigint; my $x = 1; $x <<= 256; print "$x\n"; if ($x & (1 << 256)){print "OK\n";}'
115792089237316195423570985008687907853269984665640564039457584007913129639936
OK
$
日本語訳された bigint のマニュアル
https://perldoc.jp/docs/modules/bignum-0.23/bigint.pod 何をしたいかというと、8byte単位の送信データがあって、
実際にはそれを64bitと見ていて、あるレコードは何bit目から何bit長、みたいに詰め込まれている
byte間とか平気でまたぐ
そういう64bitにデータをセットしたり取り出したり、という操作をしようと思うと、
1変数が64bitになっている方が楽に書ける
でも32bitの処理系だとできない ネットワークの通信データの取り出しなら unpack でフォーマットを N2 で配列または変数2個に取り出してからやれば楽なのでは? やれるとすっきりするけど、バイトオーダーやエンディアンがころころ変わるから、
何か落とし穴がありそう Perl の仕様が邪魔してるということなら Inline::C とかが役に立つかも。 pack, unpack は互換性重視していると思うが? 少なくともフォーマットの N 等は同じ4バイトだよ。
その辺どうしても信用できないなら自分専用の pack, unpack を作れば良いんじゃないかな。
そうすると pack, unpack と同じ形式である必要もないわけだが。 そういえば Perl のネイティブな整数のサイズって C のどれなのかな。
perlnumber には「perl をビルドする際に使われた C コンパイラが対応している形式」と
書かれてるけど。
ちなみに今使ってる環境では int ではなく long , long long と同じ 8 バイトのようだ。 Perl5のビルドはやった事ないので知らないが、多分デフォルトがCのintと同じで指定すれば変えられるって感じなのではないかな。
perl -V で実行するとそういう設定値が沢山出てくるよね。その中に intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
のようなものが出てくる。
そういや前に整数のバイト数でハマったことあったな。 fcntl() の F_SETLKW の時に渡す flock 構造体のバイナリで
pack('s2l3', F_WRLCK, SEEK_SET, 0, 0, 0) ってやっててうまく行ってたプログラムが別の環境に持って行って動かしたら
ロックが掛かったり掛からなかったりするようになり、良く調べてみたら pack の l は64bit環境でも 32bit 固定だが
struct flock の方は l_start, l_len が32bit OS では 4 バイト、64bit 環境では 8 バイトになっていた。
そもそも pack してバイナリにしなければいけないような引数の渡し方がいけないだけだとは思うが、結局どちらの
環境でも動くプログラムにするために pack('s2l5', F_WRLCK, SEEK_SET, 0, 0, 0, 0, 0) で誤魔化した。
やっぱこういうのは本来ならモジュール作ってそこで吸収した方が良いんだろうな。
と思ったらあった。
https://metacpan.org/pod/File::FcntlLock
是非デフォルトでこういうモジュールも perl と一緒にインストールされて欲しいものだな。 ありがとう。たまたま Perl のソースコードをダウンロードしてあるから
INSTALL を読んでみたら (いや、先に読んどけという話だが)
C コンパイラがサポートしてなくても use64bitint というオプションを使えば
整数のサイズが 64 ビットになるらしい。
Debian のパッケージでもこれを使ってるようだ。
C コンパイラの仕様は Config モジュールで得られるから
それを使って環境に合わせた処理が可能になる場合もあるが
Linux の flock 構造体はメンバの順番すら保証されてないようだから無理そう。 間違えた。「C コンパイラが」じゃなくて「CPU が」だ。
Configure を見た限りでは、8 バイト整数の型として採用する優先順位は
int, long, long long, int64_t の順で
8 バイトの型が無ければ Configure が失敗するようだ。
あっても CPU が対応してなくてライブラリで実現してるような環境だと
速度のためにあえて使わないという選択もあるかと思うが
long が 8 バイトだと強制的に使わされるようだ。
試せる環境が無いから勘違いしてるかもしれないが。 テーブルがあってインデックスで取り扱いたい
でもテーブルを作る時にカウンタとか意識したくない
配列なら
push @table, $data;
で済むけど、ハッシュにしたい
$table[$i]->data1 = $data1;
あるいは
$table->[$i]->data1 = $data1;
そんなことできたっけ 全部一度に判ってるなら、無名ハッシュをpushすればいいんだけど
ちょびちょび追加していきたい 親の方は無限ループにしておいて、適宜forkしてメインの処理をさせる
終わったら子はexitする
という作りで基本的にうまくいってるのに、たまに親が子だと思ってexitしとる
$pid = fork;
if (!$pid) {
exec($command);
exit;
}
この書き方に何か問題が? 親プロセスがwait $pid しないとゾンビが蓄積される。
それが続くと0ではなくundefを返すと思う。思うとしか言えないのはperldocに書かれてないから。
defined $pid でundefと0を区別する必要あり。
$!にResource temporarily unavailableのようなエラーが渡されるのでたぶんそう。
なのでちゃんと親プロセスがwait $pidすれば回避できる。 訂正。
perldoc -f forkにfork失敗時にundefを返すことが書かれてたわ やっぱり失敗してるんだよな
リトライするように直して試してみてるとこ
どういう理由で失敗するんだ?
activeperl windows版のforkもどきだからじゃないの? 今たまたま何かのリソースが全部埋まってて、一瞬待ってくれたら準備できるよ
なんだったら、リトライは隠蔽してくれて良さそうなもんなのに
IO関係はみんなそうなってる Perlはかなりの低レイヤーでも使われることがあるからな。
そんな冗長にはできんやろ。
そもそも、ぜんぜんwaitpid()しなかったらいずれ困るんだから、早くエラーになったほうがまし。 activeperlで
forkで返るpidがマイナスの値なんだけど、
Win32::Process::List で GetProcesses して得られるものとは別物なの? 疑似プロセスIDは、OSのプロセスIDとは別物なのか
要は、forkで分岐したプロセスがまだ生きてるかどうか親から周期的に監視したいんだけど
waitすると親が止まってしまうのでどうしたもんか perlのスレッドは標準IOやパイプの取り扱いが難しい、というか動きが怪しい シェルスクリプトではkill -0 PIDでプロセスが生きてるか調べられる!
そういう用途にはシェルスクリプトを使うべき! GetProcessesでpython.exeを見つければだいたい目的は達成するんだけど、
他に使ってる人がいると間違う 実行バイナリやシェルコマンドをP言語スクリプトから呼び出すソリューションが最も汎用性が高い
古事記にもそう書いてある そこもちゃんとユーチューバーのKANTのサロンで言ってる!って
語尾に付けないと このスレ、消費に9年以上かかってるとか盛者必衰の理をあらわしてて草 9年か・・・。Perlもずいぶんと長生きだね。
次スレ
【古典的モダン】Perlについての質問箱 51箱目
https://mevius.5ch.net/test/read.cgi/tech/1621994129/ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3413日 0時間 39分 17秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。