X



【モダン推奨】Perlについての質問箱 50箱目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2012/01/21(土) 10:56:39.03
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辺り


0002デフォルトの名無しさん
垢版 |
2012/01/21(土) 11:38:32.23
[プログラミング自体の経験が無い奴はまずココを読め]
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/
0003デフォルトの名無しさん
垢版 |
2012/01/21(土) 11:39:11.92
[モジュール]
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
0005デフォルトの名無しさん
垢版 |
2012/01/21(土) 11:40:18.24
1レスで理解できるutf8フラグ

utf8フラグとい名前がまずかったね。
文字列フラグなどという名前だったらよかった。

文字列フラグはPerl固有のものだから
Perlコード外部から渡されるのは文字列ではない。
文字列でなかったらなにか?それはバイナリ。

バイナリを文字として扱いたければ、文字に変換しないといけない。
それがdecode。

ではソースコードに書いてあるのは、文字かバイナリか。
それはuse utf8を使えば文字で、そうでない場合はバイナリ。

話はこれだけ。
0008デフォルトの名無しさん
垢版 |
2012/01/29(日) 11:19:25.66
はてなキーワード > モダン
ttp://d.hatena.ne.jp/keyword/%A5%E2%A5%C0%A5%F3

書いているひとは 1. の意味で書いていそうだけど、読む人は(書いた時期
を考慮して) 2. や 3. の意味で解釈している。

よく印刷した資料に「最新版」とか書くひとがいるけどそれと似てるのかも
しれない。たくさんの最新版のうちどれが最新版なのか分からなくなる。
この場合の正解は版数を書くこと。

モダンの場合は、個別の技術の名称を書くことに相当する。

そうしないと「えっ?いまどきモダンPerl使ってるのかよ、お前w」なんて
ことになる。
0009デフォルトの名無しさん
垢版 |
2012/01/29(日) 11:38:31.81
個別の技術は是々非々で議論しましょう。
現状は、モダンという名のせいで盥水とともに赤子を流してしまっています。
0010デフォルトの名無しさん
垢版 |
2012/02/03(金) 01:55:40.19
モダンPerlと呼ばれているものは、過去の一時期のスタイルと結びついていて
今はもう使われていない。一方、レガシーPerlと呼ばれているものは現在でも
利用されていて、その名とうらはらに全くレガシーな気がしない。

思うにこれらの名称は、実態を正確に示していない点で失敗だと思う。

そういえば、モダンRubyやレガシーRubyという言葉は聞いたことがない。
名前重要っていうのは本当なんだな。
0011デフォルトの名無しさん
垢版 |
2012/02/03(金) 07:54:57.41
ルビーはバージョン毎に違うからなあ
新旧をバージョン番号以外で呼ぶ事は今後もないんだろう
0017デフォルトの名無しさん
垢版 |
2012/02/08(水) 22:53:51.78
結局、モダンって何だったの?
本を売りたかったとか、会社作ってみたとか、そういうことなの?
失敗だったの?
もうモダンには会えないの?
0018デフォルトの名無しさん
垢版 |
2012/02/09(木) 18:46:51.29
         _  , 、
     r‐v'´ ̄  `~ く     
  _.  7,‐、   r‐、  ヽ   だったら Perlのはじめて を
  (._ ^ヽ|{ 0 _l 0ノ   i
   ヽ (´ ̄  `_, ヶ  ノ   見に行こうよ 
     `、`ー-ヾ._.// )
     /      (_.ノV^) 「クルクルバビンチョパペッピポ、イア!イア!ハスターの
      i    _     「
    L_ _/  \_ _.ノ
0022デフォルトの名無しさん
垢版 |
2012/02/11(土) 00:04:56.56
ここはね、パークハイアット東京。
The Perl Confernce Japan の会場だょ。

まもなく、まつもとゆきひろさんのRubyのセッションが始まるょ。

(コーヒーがおいしいょ。)
0026デフォルトの名無しさん
垢版 |
2012/02/22(水) 14:11:38.18
Perlの長所であり短所であるTMTOWTDIによるコードの難読化を共通ルールっぽいテンプレで改善しようという風潮
0027デフォルトの名無しさん
垢版 |
2012/02/22(水) 21:13:46.02
変なこと考えるより、ポータブルCみたいにポータブルPerlで書けばいいと
思うんでそうしてる。書きやすいし読みやすい、おまけに長期的に保守
できる。これもTMTOWTDIのひとつの形態。
0029デフォルトの名無しさん
垢版 |
2012/02/24(金) 15:24:49.40
>>28
動いているものに手を入れるな。
手を入れるときは該当箇所にだけ入れろ
決して他の部分をいじるな。

ほとんど同じ処理でも既存の部分を
修正するなコピペして作れ。

これこそモダン
0031デフォルトの名無しさん
垢版 |
2012/02/25(土) 00:58:50.25
モダンが嫌いな人って、新しいものが嫌い。
だからデザインパターンもリファクタリングも
アジャイルも嫌い
0037デフォルトの名無しさん
垢版 |
2012/02/26(日) 21:09:36.58
「モダンPerl」の"モダン"はあさってな方向に行ってしまっているので、
一般的な単語のモダンとは意味が違っている。だから>>31の言っている
ことは間違い。
0038デフォルトの名無しさん
垢版 |
2012/03/02(金) 09:42:04.91
>>35
うそつけ。このスレを潰そうとする連中はみんなPerl4時代のコードしか書かないじゃんか。
0039デフォルトの名無しさん
垢版 |
2012/03/03(土) 00:51:07.30
Perl4も現役で使われているのでモダンですよ。
モダンではないのは(らくだ本が出版されていなかった)Perl3以前ですよ。
もちろん異論はありませんね?
0044デフォルトの名無しさん
垢版 |
2012/03/03(土) 15:18:20.72
まさかオマイラ、ディストリ付属のperlをそのまま使ってる、なんてことないよな?
0047デフォルトの名無しさん
垢版 |
2012/03/03(土) 19:02:12.13
>>45
root管理のパッケージと混ぜないために、cpanmやlocal::libを使うのよ。
ユーザ権限でユーザ領域に突っ込めるから、バックアップも楽だし、
いらなくなったらユーザごと消せばいいし。
Perl自体は、特に必要ない限り、システム付属使ってるけど。
0048デフォルトの名無しさん
垢版 |
2012/03/06(火) 23:18:42.91
ユーザが移行するのは、今までよりも分かりやすいもの、使いやすいもの。
今までよりも新しいもの、多機能なもの、ではない。
0049デフォルトの名無しさん
垢版 |
2012/03/06(火) 23:35:43.27
モダンなものってたいがいわかりやすくて
使いやすくなってるよね。

Time::Pieceとか。
0050デフォルトの名無しさん
垢版 |
2012/03/06(火) 23:43:48.61
でもそうじゃないから、"モダン"っていうラベルを付けて強引に勧めて
いるんだね。分かりやすかったら、使いやすかったら、ほっておいても
自然に使われるだろうから、わざわざ無理強いする必要はないもんね。
0051デフォルトの名無しさん
垢版 |
2012/03/06(火) 23:54:43.29
> 分かりやすかったら、使いやすかったら、ほっておいても
> 自然に使われるだろうから

それじゃ時間がかかりすぎる。
ようはオールドタイプはさっさと消えろってこと。

ネットの古い情報もさっさと消えて欲しいし、
今頃古いやり方を教えるやつもさっさと消えて欲しい。

だから俺は古いやり方を教えている奴を見つけたら
今はこうやる。こっちのほうがもっと簡単だと
情報を広めている。
0057デフォルトの名無しさん
垢版 |
2012/03/08(木) 00:51:37.53
もちろん情報は日々取得してるから知られてはいるんだろうけど、
使いやすくなかったらいつまでたっても使われることはないよね。
0058デフォルトの名無しさん
垢版 |
2012/03/08(木) 01:03:50.28
使われてるけどね。
Perlで作られてる他のプロジェクト見たこと有る?
(昔に作られて放置されてるのは除く)

Jcodeとか海外じゃ全く使われてないから。

0061デフォルトの名無しさん
垢版 |
2012/03/09(金) 02:06:51.28
>>58
海外で使われていないと、自分が日本語を処理するときに使っちゃいけないの?
日本では使ってもいいんでしょ?
そもそもモダンっていうのは禁止して不便にすることなの?
それにJcodeはオブジェクト指向なんだし十分モダンだと思うけどな
0062デフォルトの名無しさん
垢版 |
2012/03/10(土) 00:38:59.17
モダンPerlでいうところの"モダン"は、
 1.リリース時期のことをいっているのか
 2.実装手法のことをいっているのか
 3.はたまたインタフェースのことをいっているのか
ところで、インタフェースっていうのは
 a.新しければ新しいほど好ましいのか
 b.古ければ古いほど好ましいのか
このあたりの見解が一致しないと、具体的なモノがモダンなのか
そうでないのかが変ってしまうし「これはモダンだ」と言ったか
らって、そのものに価値があるのか無いのかは別問題になる
0063デフォルトの名無しさん
垢版 |
2012/03/10(土) 01:24:18.18
1.がモダンでも2.がモダンでも利用者にとって関係なく、単に供給側
の自己満足になってしまう。3.のことだとすると新しいもの好きはa.で、
人柱をかってでることになるわけで、そうでないならb.で問題ない。
0066デフォルトの名無しさん
垢版 |
2012/03/10(土) 02:45:52.84
あるよ。

開発速度が上がった。
少ないコードで、今まで以上のことができる。

なにより、プログラミング一般とPerlに関して
深い知識を手に入れられたのがいいね。

オブジェクト指向言語、関数型言語、
継承。ポリモーフィズム。mixin、
アスペクト指向、O/Rマッパー
フレームワーク、MVC・・・etc

Perlだけじゃ、世界が狭いからほかの言語をやるといい。
そうして戻ってくると、自然とモダンPerlな体になってるよ。
0067デフォルトの名無しさん
垢版 |
2012/03/10(土) 02:50:23.82
考え方が間違っていたかもしれない。

モダンPerlとは、Perlがモダンなのではなく
プログラマ的にモダンな開発手法、
それをPerlに取り入れたものではないのか?

よくよく考えたら、最近はやりのほかの言語の機能を
PerlでやれるようにしたがモダンPerlなモジュールではないだろうか。
0068デフォルトの名無しさん
垢版 |
2012/03/10(土) 11:58:33.08
モダンPerlはアンチPerlなのか...
それでPerl原理主義者の抵抗にあっているという構図か
0072デフォルトの名無しさん
垢版 |
2012/03/10(土) 15:44:56.75
どうにも架空臭がするモダンPerlだが最近ますますそう感じている。
(モダンPerlを構成するといわれる)個別の要素の議論で十分だと思う。
ひと括りにしてしまうせいで大事なものまで一緒に捨てられてしまう。
0073デフォルトの名無しさん
垢版 |
2012/03/10(土) 23:59:10.17
モダンPerlではなく、
Perlでモダンプログラミングといえば、
面白いように情報弱者が落ちていく。
0076デフォルトの名無しさん
垢版 |
2012/03/11(日) 02:15:55.91
単に"モダンPerl"と言いたいだけにしか思えない
Perlのリリースが予定通りじゃなかったり、らくだ本の改版に10年もかかっ
たりするからって、無理して話題を作る必要はない

5.14.3がリリースされない今はらくだフォーでつなぐのが吉
0078デフォルトの名無しさん
垢版 |
2012/03/11(日) 04:00:30.75
Perlのオブジェクト指向はどう考えてもいびつでおかしいのに
それを主張しても理解できない人の戯言にされてしまう。
0083デフォルトの名無しさん
垢版 |
2012/03/11(日) 12:59:34.63
>>78
Perlのオブジェクト指向はいびつ

じゃあいびつじゃない形にしましょう。それができるのがPerlの凄さだ

そうやってできたもの=モダンPerl


>>78
お前はPerlを使いこなせてないだけ。
0085デフォルトの名無しさん
垢版 |
2012/03/11(日) 19:50:09.03
モダン推奨者は自分が社会に適合しようとするんじゃなくて、社会を
自分に適合させようとしている。

結果、当然うまくいかなくて挫折する。

その繰り返し。
0091デフォルトの名無しさん
垢版 |
2012/03/12(月) 12:37:32.86
>>87
モダン、モダン言わなくても、周りに合わせられなければ、単に能力がないだけ。
つまり、モダンプログラミングと、周りに合わせられない事は別問題。

>>90
そこは迷うところだな。別の手を考えるか、そのまま自分で実装するか。
ある意味チャンスだ。
0095デフォルトの名無しさん
垢版 |
2012/03/16(金) 00:44:44.19
今までのインタフェースで実装できなくてだめだめなのをモダンPerlとか
言って取繕ってるだけでしょ
0099デフォルトの名無しさん
垢版 |
2012/03/16(金) 15:52:29.33
新しい手法・置き換えるモジュールがあれば、それを採用しましょうってのがモダンPerl。
Fatalプラグマよりautodieプラグマ。
switch,caseよりgiven,when。
evalとif($@)よりTry::Tiny。
という感じ。

置き換えられないモジュールを置き換えようとするのは多分違う。
0104デフォルトの名無しさん
垢版 |
2012/03/16(金) 21:48:33.88
モダンPerlは無駄なもの
なぜなら業界歴20年の俺が理解できなかったからだ
そこから役に立たないものだと結論づけた
0106デフォルトの名無しさん
垢版 |
2012/03/17(土) 00:38:01.50
プログラムはプログラマだけのものじゃなくて、依頼者や使用者のものでも
あって、依頼者視点での保守、使用者視点での保守をしていかないとならない。
その場限りのソフトウェアならモダンPerlでも構わないかもしれないが、
保守するのであれば、流行で作ったものは時間が経つと「変な髪形」になっ
てしまう。それが分かってないのは、おまいのしりが青い証拠だ。
0109デフォルトの名無しさん
垢版 |
2012/03/17(土) 00:54:53.13
>>106
受託ってやつ?
ウェブサービス作ってるんじゃないの?

俺にとってプログラムは自社のもので、自分たちが
開発しやすいように最善の方法を目指してるんだけどさ、
客に足を引っ張られるのって、ちょっと可哀想に思う。
0111デフォルトの名無しさん
垢版 |
2012/03/17(土) 02:46:55.30
依頼者は何も指定しなかった場合、
古いPerllで作ろう。

それが依頼者のためになるんだ。
0113デフォルトの名無しさん
垢版 |
2012/03/17(土) 03:04:12.17
>>106
客が要求するのがモダンではないと決めてかかってる。
客がモダンを要求したらどうするつもりだ?
単にお前は、モダンPerlが書けないだけ。
0115デフォルトの名無しさん
垢版 |
2012/03/18(日) 01:23:00.96
逆になんでモダンにこだわるの?変なとこにこだわって成果がでないんじゃ
本末転倒じゃないの?成果とモダンとどっちが優先なの?
0117デフォルトの名無しさん
垢版 |
2012/03/18(日) 03:15:04.19
>>115
モダンを諦めれば、成果が出るとでも思ってるの?

むしろ、モダンを使う=成果が出る
なんだが。
0118デフォルトの名無しさん
垢版 |
2012/03/18(日) 07:42:28.32
一旦モダンって名前を頭から消して普通にPerlコードを書かせてみるとする
そいつのコードがKENTみたいなやつだとして、それが他の人が誰でも保守できるようなシロモノになるとは到底思えない
0122デフォルトの名無しさん
垢版 |
2012/03/20(火) 19:21:50.84
これまでの積み重ねがないと例えば会社が終わりになったときに技術的にも
全てを失うことになるよ。
0124デフォルトの名無しさん
垢版 |
2012/03/20(火) 20:23:18.91
わざわざ不便なものを選んで苦しむのが積み重ねか
古いんだよそんなスポ根的発想は!
0125デフォルトの名無しさん
垢版 |
2012/03/20(火) 22:46:00.37
青尻くんは、プログラムは実現したいこととその解決方法の両方を記述する
ためのものだってこと、ちゃんと理解してるの?そうか、してないのかまだ
青いのか。
0126デフォルトの名無しさん
垢版 |
2012/03/20(火) 23:19:46.15
普通にわかれよ。
モダンperlがいいものだとしたら普通に普及する。
駄目なもので無理やり普及させたいのには訳がある。

本や講演などで稼ぎたい人もいるってこった。
0132デフォルトの名無しさん
垢版 |
2012/03/24(土) 12:30:46.46
かわいいの♪ステマつげるぅ〜♪
いーないーな♪それいいなぁー♪
つげるタイプの魔法だょ〜♪
0133デフォルトの名無しさん
垢版 |
2012/03/25(日) 07:17:46.89
ステルスマーケティング用語か。個々の技術とまったく関係ない話だな。
要は互換性のなさをごまかそうとしているんだな。ばればれだぞw
0135デフォルトの名無しさん
垢版 |
2012/03/27(火) 21:08:40.38
長期に渡る保守が予想されるソフトウェアは一時期の流行に合わせて
書くのではなく、将来を見据えた記述をするのが正解。
0136デフォルトの名無しさん
垢版 |
2012/03/27(火) 21:29:13.75
意固地に10年前の書き方を押し付ける必要はない
今使える書き方と今使えるモジュールで書けばいい
0137デフォルトの名無しさん
垢版 |
2012/03/28(水) 05:29:06.98
今使えない書き方で書けと読めてるお前がおかしい
ワンライナーや売り切り逃げ切りのソフトならお好きにどうぞ
0138デフォルトの名無しさん
垢版 |
2012/03/28(水) 06:14:36.83
モダンは互換性がないのと将来のメンテナンスが不安なのが弱点か。
モダンゆえに時間軸の過去も未来もだめってことか。それは困る。
0140デフォルトの名無しさん
垢版 |
2012/03/28(水) 06:46:19.55
>>138
>互換性がない
何と?
>将来のメンテナンスが不安
将来のメンテナンスを考えると何を使えばいいの?
0141デフォルトの名無しさん
垢版 |
2012/03/28(水) 21:48:50.07
素のPerlや標準モジュールが思いつかないあたり、いい、すごくいいよ、
青尻くん。だんだん気に入ってきた。
0142デフォルトの名無しさん
垢版 |
2012/03/28(水) 22:59:03.49
たとえば標準モジュールの例としては、
http://perldoc.perl.org/index-modules-A.html

・文字コード関係
Encodeモジュール
(Jcodeは×)

・日付関係
Time::Piece、Time::Seconds
(もろもろある日付モジュールは×)

・オブジェクト指向関係
Object::Accessor、Class::Struct

データベース関係(ファイル以外)は、何もありません。

>>141が言っていることはこういう意味です。
0143デフォルトの名無しさん
垢版 |
2012/03/28(水) 23:57:43.96
がんばって標準モジュールを列記してみたものの、やっぱり素のPerlは
思いつかないところ、青尻くん、すばらしい。すごくいい。

「モダンPerl使いなのでlocaltimeは使えません。」キリッ

職場で一度言ってみたい。。。試用期間で終わるだろうけどw
0146営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/03/29(木) 02:28:11.13
> 素のPerlや標準モジュールが思いつかないあたり

って言っておきながら、標準モジュールをあげたら今度は

> がんばって標準モジュールを列記してみたものの、やっぱり素のPerlは
> 思いつかないところ

もしかして、自分の知らない標準モジュールばっかりで
方向転換したのかいな?
0150デフォルトの名無しさん
垢版 |
2012/03/30(金) 21:55:40.66
なんだ、そうだったのか。てっきりlocaltimeも満足に使えないのかと
思ってたよ。失敬、失敬、こりゃ失敬。
0151営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/03/31(土) 00:55:04.25
念のため言っとくがlocaltimeから
リストコンテキストで取得するのは古いやり方だからな。

最近のやり方はlocaltimeからTime::Pieceオブジェクトを返す方法。
もちろん標準モジュール。
0152デフォルトの名無しさん
垢版 |
2012/03/31(土) 01:09:11.56
で、Time::Pieceのインタフェースってlocaltimeと互換性あるの?
例えばリストコンテキストで使うと同じように値が戻ってくるの?
0155デフォルトの名無しさん
垢版 |
2012/03/31(土) 02:46:36.36
職場にようやく5.8が入ったんでよーし、これからはモダンPerlだぞ!と
意気込んできたらTime::Pieceは5.10以上と知ってがっかり。
らくだ本に載ってるTime::localtimeを使って愛想笑いでごまかすしかない。
0159デフォルトの名無しさん
垢版 |
2012/03/31(土) 12:09:29.38
やっぱりモダンっていうのは供給者側の視点であって、利用者側の視点が
抜け落ちているな。残念。
0161デフォルトの名無しさん
垢版 |
2012/03/31(土) 15:55:14.37
おれに合わせる必要はない。逆におれはおれでperl4が使われているところも
あるから、がんばってlocaltimeで書くと。需要ベースで考えるしかない。
残念。
0168営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/04/01(日) 12:23:36.71
windowsXp:ActivePerl環境で、perlをタスクスケジューラからバックグラウンドで実行させたい。
wperl.exeで実行すればよいとgoogle先生が教えてくれたんだけど、
↓でやっても実行時にウィンドウが一瞬だけ開いてしまう。
C:\Perl\bin\wperl.exe sample.pl

↓だと↑より長くウィンドウが表示されるので、wperl.exeが効いていないわけではないっぽい。
C:\Perl\bin\perl.exe sample.pl

うーん、なぜだ
誰か教えてください
0170デフォルトの名無しさん
垢版 |
2012/04/02(月) 01:47:27.43
% pp --gui --verbose --output=sample.exe sample.pl
でスクリプトをexeファイルにする。

ttp://search.cpan.org/~rschupp/PAR-1.005/lib/PAR/Tutorial.pod
0171168
垢版 |
2012/04/03(火) 00:54:00.46
デバッガあててみたら↓が原因だった
our $mech = new WWW::Mechanize(autocheck => 1);

手前は中で何やってるんだよ・・・
これ以上解析するのはめんどいが、
ウィンドウが表示されるのは耐え難いので
暇なときに中をのぞいてやる

>>170
なんかすごそう
暇なときにやってみる
0172営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/04/07(土) 01:50:55.99
ハッシュに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...

回避方法あるでしょうか?
0173172
垢版 |
2012/04/07(土) 02:55:30.64
投稿の際に行数を節約しようと修正した部分で動かないところがありました

×*$AUTOLOAD = sub : lvalue { my ($self) = @_; $self->{$1}; };

my $name = $1;
*$AUTOLOAD = sub : lvalue { my ($self) = @_; $self->{$name}; };
0174営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/04/07(土) 17:14:55.67
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 {}

ここまで来ると普通のハッシュでよくね?
あと、ネタすれなんで、本スレで質問しる。
0175営利利用に関するLR審議中@詳細は自治スレへ
垢版 |
2012/04/07(土) 19:05:08.57
在日韓国・朝鮮人や,
働かないで金をせびるクズ人間を取り締まってくれや。
追うも国士館,追われるも国士館頼むぞ。

http://www2.ocn.ne.jp/~hirohito/photo/s6116.jpg
http://www.masuko.co.jp/school/img/otona/4men_2.jpg
http://keiten.net/image/070804kokushi/kekki.htm

規律ある大学生活
http://daiminsya.exblog.jp/2750544/

国士舘OBの回想
http://www.youtube.com/watch?v=LBtSNMhree4&feature=related

国士舘アルバム
http://www.youtube.com/watch?v=5vZmce3qPGg&feature=related

0176172
垢版 |
2012/04/07(土) 23:31:22.35
>>174
おおーありがとうございます。AUTOLOAD自体をlvalueにするというのは気づきませんでした。
実際のプログラムはもう少し複雑ですが、正しく動作しています。

>>普通のハッシュでよくね?
たしかにw
一応オブジェクトであってはほしいのですが、ハッシュ記法であれば何の不都合もなく
$obj->{name} = 'bar';
と書けるわけですしね。
オマケでメソッド呼び出しも、と考えてたらハマってしまった格好です
0179デフォルトの名無しさん
垢版 |
2012/04/14(土) 14:38:18.13
>>171
事前にSTDOUT、STDERRをつぶして
おいたらどーなる?

ウインドウアプリで、そこに吐くと、
自動的に新規コンソールが開く、
とかだったような。
0180デフォルトの名無しさん
垢版 |
2012/04/17(火) 22:06:08.88
>>179
タスクのウィンドウが表示されなくなってうれしいものの、その他の
ウィンドウも一切表示されなくなりました ;_;
(D-SUB抜いて試しました)
0183デフォルトの名無しさん
垢版 |
2012/04/29(日) 06:35:31.99
再開
0184デフォルトの名無しさん
垢版 |
2012/04/29(日) 06:52:54.09

  ∧∧
  ( ゚Д゚ )∩
 ⊂   ノ
  /  0
  し´
えっ…と、
ここかな…、と
 ∧∧ ∧∧
∩゚Д゚≡゚Д゚ )
`ヽ     |)
  | __ |〜
  ∪  ∪
      ドスッ
  ∧∧.ミ. _
  (   )┌┴┴┐
  /   つ.再開│
〜   ./ └┬┬┘
 ∪∪    ││_ε3
     ゛゛゛゛
0190デフォルトの名無しさん
垢版 |
2012/05/15(火) 18:28:38.45
cpan でモジュールインストールしんたいんだけど
install やら make やら make install やら全部 OK
でたのに
perldoc -l インストールしたモジュール名
やるとそんなのないて怒られる。
なんで?
0192デフォルトの名無しさん
垢版 |
2012/05/16(水) 07:35:09.36
>>191
cpan>install Math::Vector::Real
でいれて
全部 make やら make install やら全部 OK と出たが
ないようだった。

cpanplus でインストールしてみたらいけたのだが原因がわからない。
0193デフォルトの名無しさん
垢版 |
2012/05/16(水) 19:04:48.32
Regexp::Assembleでマッチした時って
後方参照使えるの?
0194デフォルトの名無しさん
垢版 |
2012/06/20(水) 00:40:13.88
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") と、マッチするものすべてを得たい場合、
どうすればよいでしょうか。

0195デフォルトの名無しさん
垢版 |
2012/06/20(水) 01:29:26.87
なんか面白そうなお題なのでとりあえず最悪くさいものを作ってみた
素晴らしい人がボロクソにけなしてくれると期待しつつ投げてみる

$str='ABCD';
{
my $tmp=$str;
while($tmp=~/AB|BC/){
push @a,$&;
$tmp = $&.$';
$tmp=~s/^.//;
}
}
print join' ',@a;
0196194
垢版 |
2012/06/20(水) 02:51:53.45
>>194
場当たり的に色々試していたら
@a = $str =~ /(?=(AB|BC))/g;
で、(AB,BC) が取得できました。
(?= で、次の走査開始点を移動させないようにしたから、でしょうか?
0197デフォルトの名無しさん
垢版 |
2012/07/15(日) 14:22:38.65
一過性のモダンPerlはもう終わり。
らくだ本の発行によって本来のPerlへの回帰が始まっている。
0201デフォルトの名無しさん
垢版 |
2012/07/20(金) 06:04:14.97
まあソースをみて改良したりとか前向きな動機はほぼゼロで99.99%はこのメーカー
困らせてやれって開示請求なんだろうな。
0203デフォルトの名無しさん
垢版 |
2012/07/25(水) 02:06:14.30
USP(Universal Shell Programming)研究所は、UNIX/Linuxの基本思想である、
「小さな道具」(コマンド)を組み合わせて「問題を解決する」(シェルス
クリプト)手法の研究・普及を行っています。この開発手法(ユニケージ
開発手法)は、従来のウォーターフォール型開発や、オブジェクト指向言
語・データベースソフトを用いた開発手法と一線を画し、圧倒的な開発生産
性 圧倒的な柔軟性を特徴としています。

ttp://www.usp-lab.com/
0204デフォルトの名無しさん
垢版 |
2012/07/30(月) 19:45:03.06
本スレも、荒しに常駐されてぐだぐだだし、
WebProgの方も同じみたいに、スレ違いの会話が
ぐだぐだ続いて終了したし、終りかなあ。

ここのスレの方がまだ真面にperlの話をしてた気がするよ。
0205デフォルトの名無しさん
垢版 |
2012/07/30(月) 20:56:12.50
まあモダンには2つあって、ひとつはすぐに古くなるモダン。
もうひとつはいつまでも古くならないモダン。
おれは断然古くならないモダンのほうがいいな。
0207デフォルトの名無しさん
垢版 |
2012/07/30(月) 23:47:25.65
軟便スキー独りか知らんが、
韓国ネタのコピペしたり
hoge煽りしたり
ググれ煽りしたり

馬鹿じゃねーの?
0209デフォルトの名無しさん
垢版 |
2012/07/31(火) 00:27:00.96
進歩というものは過去を捨てることではない。
過去に加えて積み上げるものなのだ。
0211デフォルトの名無しさん
垢版 |
2012/08/04(土) 17:51:38.53
過去のソフトウェアと作法やインタフェースが異なる言い訳としてモダンと
いう用語を使うのはまずい。今までより苦労が増えるなら移行は進むはず
がない。
0213デフォルトの名無しさん
垢版 |
2012/08/05(日) 20:56:46.40
すまん、53箱目の続きあった。“54目”になってたんで検索に引っかからなかったわ。
0214デフォルトの名無しさん
垢版 |
2012/08/06(月) 18:23:11.89
以下のように時刻と曜日が書かれたlogファイルがあります。

Jun 6 00:07:41 xxxxx
Aug 8 00:14:34 yyyyy
Aug 8 00:16:26 zzzzz

(以下略

現時刻から一時間前のログのみ抽出して、抽出したログの行数だけ出したいのですがこの処理って一行(ワンライナー)で書けますか?※重複とかは無視して単純に一時間分のログが引っこ抜ければ良いです。

詳しい人教えてください。
0217デフォルトの名無しさん
垢版 |
2012/08/07(火) 18:06:48.10
>>216
やり方教えてください!
一時間前の日付時刻と現在の日付時刻を比較して条件を満たせば該当行を出力みたいなことをやれば良いとおもうんですが、どう書けば良いのかわかりません
0218デフォルトの名無しさん
垢版 |
2012/08/07(火) 18:12:29.44
横レス(別人)
$ 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 あたりでググる。
0222デフォルトの名無しさん
垢版 |
2012/08/08(水) 18:20:12.98
というより、「年」は全部今年として扱えばいい。
年が明けてから1時間はまともにログを拾えなくなるけど。
そもそもログデータに「年」の情報が入っていないんだから、
厳密に処理するのは無理だべ。
0223デフォルトの名無しさん
垢版 |
2012/08/08(水) 18:36:12.52
>>218に対して言ってるのなら、
最初からそれを念頭に書いてないか?
コードは既にそうなってるし、
説明文の方は質問者に向けたもんだし、
改造しやすいように除算は態々、2012 -1900 にして残してあるし。

それともtime関数に、年を除外するオプションでもあんの?
0224デフォルトの名無しさん
垢版 |
2012/08/08(水) 19:02:57.22
>>223
年が変わるごとに 2012 を 2013 だの 2014 だのに書き換えるの面倒だろうから
「年」のところはログの日付も現在の時間も全部localtimeの「今年」という前提で
扱えば毎年コード書き直さなくてもよくなるだろっていってるんだよボケ。
0225デフォルトの名無しさん
垢版 |
2012/08/08(水) 19:09:28.99
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、了解した。
0226デフォルトの名無しさん
垢版 |
2012/08/08(水) 19:17:05.60
で、試しに自分でも書いてみた。
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使えばあとからでもわかるしね。
0228デフォルトの名無しさん
垢版 |
2012/08/08(水) 19:28:58.56
>>226
> 218の方がすっきりしてるか。なぜかうちの環境だとエラー吐いて動かなかったけど…。
> (Day 'Jun' out of range 1..31 at -e line 1 て言われた)

なぜエラーが出たかわかった。自分でテスト用に切り出して作ったログファイルの
各行頭にスペースが入っていたからだった。(ありがち)
0230デフォルトの名無しさん
垢版 |
2012/08/09(木) 03:59:05.87
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オブジェクトの除算が変だ。なんで?
0231デフォルトの名無しさん
垢版 |
2012/08/09(木) 05:09:37.92
>>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ベースになっちゃうけど引き算の結果は正しくなる。
という訳で、けっこういろいろとメンドくさいもんですね。
0233デフォルトの名無しさん
垢版 |
2012/08/09(木) 08:03:44.22
レスくれた人ありがとうございます>>214です。
まだperlは入門書読み終わった程度なので右も左も分かりませんが、教えて頂いたコードを参考に色々書き方を研究したいと思います。
0238デフォルトの名無しさん
垢版 |
2012/08/15(水) 05:40:02.45
>>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'
0239266 (未来より参上)
垢版 |
2012/08/15(水) 16:15:51.26
>>238
おおうスタイリッシュ。
state とか使ったことなかったけど便利そうだな。参考にさせていただきます。
ワンライナーはあんまし書かないのもあってオプションも -i -n -p -e くらいしか
普段使ってなかったりしますんで。-E すら滅多に使わないな…。nもpもなしに
while(<>)埋め込むのもループの前後で処理が必要な時とかは普通にやってるし。
その程度のスキルでもとりあえず動くものは書けるってのがPerlのメリットでもあり
欠点でもあると…まあこの場合メリットということで。TMTOWTDI。(覚えづらいよなこれ)
0240デフォルトの名無しさん
垢版 |
2012/08/16(木) 22:01:16.60
なんで隔離スレで真面目に質問箱してんのよ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くっつけるだけ。


それにしても、バルサン炊いたみたいに、人がいなくなったな本スレと初心者スレ。
実際の所は、ハイエナが肉に夢中になってるだけだろうけど。
0241デフォルトの名無しさん
垢版 |
2012/08/19(日) 22:14:32.47
初めてのPerl第6版とPerl5.16.1のことだね。
Unicodeサポートの問題に今頃気づいたって読める。
第5版のときはまだ気づいていなかったのかな?
まあ、そんときは使ってなかったんだろうけどな。
0242デフォルトの名無しさん
垢版 |
2012/08/20(月) 05:51:33.20
今上天皇侮辱発言の祭りが落ち着いたから、戻って来たぞゴキブリ。
でも、まあ、5割くらい減ったんじゃねーかな?
0249デフォルトの名無しさん
垢版 |
2012/09/01(土) 09:59:22.19
どうやらモダンパールは時代遅れみたいですね
本家のパールはすでにその先に進んでます
テキスト処理90%のPerlが文字列を楽に扱えないなんてたちの悪い冗談でしか
ありません
0251デフォルトの名無しさん
垢版 |
2012/09/03(月) 01:19:39.59
テクノロジーはスクラップアンドビルドなものと考える連中はとほほの内容が
古いと考えるようだ
0252デフォルトの名無しさん
垢版 |
2012/09/08(土) 14:37:07.80
かってに「モダン」とか名乗るなや
0254デフォルトの名無しさん
垢版 |
2012/09/09(日) 08:13:34.65
リャマ本第6版までモダンに毒されてるよ
おまいらリャマ本は第1版こそ至高・正義だ
定価より高くても中古で第1版を買え!
0257デフォルトの名無しさん
垢版 |
2012/09/10(月) 00:59:47.94
赤らくだ本だとか赤リャマ本の序文、それにポケットリファレンスの序文でLarryはふざけ過ぎてしばらくの間O'reillyから干されていた。今回「まじめに書く」と誓ったためようやく第4版の執筆許可が下りたらしい。
0258デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:04:41.71
結局らくだ本的にはモダンPerl(=perl5.8)はスルーってことか
最近は重いモジュールも避けられる傾向にあるしな
0259デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:11:25.67
重いモジュールも避けられる傾向にあるしな(キリッ
とか言う奴は十中八九List::Utilとかを使わない
0261デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:31:53.70
モダンperlと言われているもののうち一部の重たいモジュールを持ち出して
重たいモジュールは避ける傾向にあるからモダンperlも避ける傾向だよねー
なんてどんな詭弁だよ
0262デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:33:07.74
確かにLarryはモダンPerlについて多くを語ろうとしないな
きっと軽いスクリプトが好きなんだろうなList::Utilとか使わない
0263デフォルトの名無しさん
垢版 |
2012/09/12(水) 00:55:43.31
List::UtilはXSで書かれてるから自分でPerlで書くよりよっぽど高速なわけだが
てかとってつけたようにLarry様の名前出すなよw
0264デフォルトの名無しさん
垢版 |
2012/09/12(水) 01:36:14.68
GUIやバイナリファイル扱うときにXSを使って効率を上げるのは分かるが
そうでないときにXS使ってスクリプトの利便性を下げるのは簡便だな。
0272デフォルトの名無しさん
垢版 |
2012/09/15(土) 22:16:30.43
結局モダンかどうかは気持ちの問題だし、供給者側の主張次第でしょ
利用者側にとってはちゃんと使えればどうでもいいよそんなもん
0273デフォルトの名無しさん
垢版 |
2012/09/19(水) 01:43:10.30
モダンパールは単なる自己満足であったか
そもそも書いたときはモダンでも後で読むときはモダンではないわな
モダンと言われると互換性がないんじゃないかと思って警戒するひとも
いるかもしれないしな
0276デフォルトの名無しさん
垢版 |
2012/09/20(木) 13:14:19.79
バイナリでの文字列置換をしています

$str =~ s/\xFF/\x00/g;

という書き方ならうまく行くのに、

$src = '\xFF';
$dst = '\x00';
$str =~ s/$src/$dst/g;

ではうまく行きません
$srcの部分は思い通り検索できるのに、
$dstの部分はバイナリではなく \x00 という文字列に置換されます
どうすればいいですか
0278デフォルトの名無しさん
垢版 |
2012/09/20(木) 13:31:02.66
確かにそういうことなのですが、
何故$dstという変数を使うかというと、その中身が不定だからです
$dst に '00' とか '01' とかいろんな文字列が入った場合の置換の書き方はありませんか

とりあえず、pack("C", hex($dst)) と書いて eオプションで評価すれば
うまく行くのは確認したのですが、$srcみたいなスマートな書き方はできないものかと
0279デフォルトの名無しさん
垢版 |
2012/09/20(木) 14:11:13.98
packするのが一番マシじゃないだろうか
ただ置換内ではなくその直前に追い出したいけど
0280デフォルトの名無しさん
垢版 |
2012/09/20(木) 14:30:17.21
後半が文字列で表現されている時に、
それをテキストとして見ていいのかバイナリとして見ていいのか、
両方の解釈が有り得るのが問題なんだな

書いたままだよ、というルールで統一されていれば納得するものを、
コードに埋め込んだ時はバイナリだけど、変数が来たら文字列、という解釈をして、
しかも、置換の前半部分は変数でもバイナリとする変態文法
逆に前半を文字列として認識させたい時はどうするんだろう
0281デフォルトの名無しさん
垢版 |
2012/09/20(木) 22:51:50.63
すみません、何がなんだか分からないのでゆっくりと、そして複数の質問で
あるのなら分割して1つずつ質問してもらっていいですか?
中卒なんで
0283デフォルトの名無しさん
垢版 |
2012/09/21(金) 00:33:30.46
よくある
$str =~ s/%([a-zA-z0-9]{2})/pack("C", hex($1))/eg;

こんな置換を、packやらhexやら使わずに書いてみそ
という問題
0286デフォルトの名無しさん
垢版 |
2012/09/21(金) 11:42:35.55
どうやってもスマートじゃないな
前半も後半も素直にpackしておくのが一番分かり易い
なまじ前半に書けてしまうのがおかしい
0287デフォルトの名無しさん
垢版 |
2012/09/22(土) 06:20:20.87
文字列とバイナリを区別する時点から問題が発生していると思うので、
区別しなければ解決するのだと思う
0288デフォルトの名無しさん
垢版 |
2012/09/22(土) 12:20:01.08
楽になるために区別するのならよいわけだけど、
区別したがゆえに苦労するのであれば、区別しなければ苦労はない。

過去にとらわれるのはもうやめです。進歩しませんよ。
0289デフォルトの名無しさん
垢版 |
2012/09/22(土) 15:03:36.74
どっちに解釈するか文脈で判断、ということをperlはあちこちでやっていて、
それは多くの場合正しいので表面化しないけど、
こんな風に不合理を露呈する場合もある
0290デフォルトの名無しさん
垢版 |
2012/09/22(土) 20:40:59.67
プログラムはテキスト、処理するデータはバイナリ
 対
プログラムはバイナリ、処理するデータはテキスト

深い質問だな、これは
0291デフォルトの名無しさん
垢版 |
2012/09/22(土) 22:17:29.81
Win7上で、Strawberry Perl と SQL Server2008 を使用して開発をしています。

DBD::ODBCでDBにアクセスをして、データを操作しています。

質問
・DBIでSQL Serverのデータベースにconnectを作成し、あるキーとなる情報を取得するSQLを
 prepare、execute、fetchrow_arrayを使用して取得し、取得したキーをもとに別なSQLを作成し、
 実行しようとしましたが、「接続がビジーです」といった内容のエラーが返ってきます。
 fetchrow_arrayでデータを参照しつつ、同一のデータベースから同じようにデータを取得する
 ことはできないのでしょうか?
 
何か情報がありましたら、教えてください。
よろしくお願いいたします。
0292デフォルトの名無しさん
垢版 |
2012/09/22(土) 23:59:54.07
2つのSQL文をひとつにまとめるのが正攻法に思えるが「参照しつつ」をやめて「参照し終わってから」にすればいいんじゃないかと言ってみた。
0295デフォルトの名無しさん
垢版 |
2012/09/23(日) 11:27:29.98
プログラムはテキスト(簡便)、処理するデータはバイナリ(簡便)

プログラムはバイナリ(勘弁)、処理するデータはテキスト(勘弁)
0296デフォルトの名無しさん
垢版 |
2012/09/23(日) 11:29:56.95
$str = 'aaa[bbb[c]ddd]eee';
$str =~ s/\[.+?\]//;

こんな感じにした時に
aaa[bbbddd]eee
になって欲しい
gを付けたら、
aaaeee
になって欲しい

うまい書き方はありますか
0299デフォルトの名無しさん
垢版 |
2012/09/23(日) 16:22:38.40
$str = 'aaa[bbb[c]ddd]eee';
$str =~ s/\[[^\[\]]+?\]//;
print "($str)\n";

# /g とは違うけど
$str = 'aaa[bbb[c]ddd]eee';
while($str =~ s/\[[^\[\]]+?\]//){}
print "($str)\n";
0300デフォルトの名無しさん
垢版 |
2012/09/23(日) 20:34:01.47
スカラーで置換した数を返す、という仕様は
whileで使ってくれと言ってるようなもんだな
0301291
垢版 |
2012/09/24(月) 00:26:24.29
>>292-293
ありがごうございます。
ただすみません、自分の書き方も悪かったのですが・・・

取得した情報で、その後の処理を変更しています。
そのため、発行するSQLもselectだけでなく、insert,update,deleteなどもあり、
単純にSELECTを見直すというわけにもいかず。
0303291
垢版 |
2012/09/24(月) 22:40:47.72
>>302
ありがとうございます。
こんなものがあったんですね。知らなかったです。
0311デフォルトの名無しさん
垢版 |
2012/10/06(土) 16:46:58.45
少数のエリートが良かれと思っても多数派の一般民が取り入れないと意味がない
ひとがプログラミングする訳だから、フィーリングを大事にしないとだめだな
0312デフォルトの名無しさん
垢版 |
2012/10/14(日) 16:56:04.97
開発効率のことだけで言うと
モダンPerlの方が効率がいいね。
0313デフォルトの名無しさん
垢版 |
2012/10/14(日) 23:37:41.19
俺が好きなのはポストモダンPerlだな
0317ハートマン軍曹
垢版 |
2012/10/15(月) 18:43:05.44
お前の顔はモダンアートの醜さだ!
0318デフォルトの名無しさん
垢版 |
2012/10/16(火) 00:31:08.75
もうPerlは5.16の時代ですよ。
5.12とそれより前はサポート終了しました。

10年前のPerlのことなんか、
考える必要ないんですよ。
0319デフォルトの名無しさん
垢版 |
2012/10/16(火) 00:42:38.62
5.6とか使いたい奴は自分らで勝手に使ってたらいい
ただし5.6を他人に強要したり、5.6向けに書いた古臭いスクリプトを他人に押し付けて保守させたりするな
0322デフォルトの名無しさん
垢版 |
2012/10/16(火) 01:37:39.47
とにかくコードが手元の環境で動くのが正義
そして長期間に渡るメンテが可能で楽なのが正義
localtimeは標準モジュールより格上の標準関数

ポータブルPerlこそがこの世の正義

319による保守は誰も期待していない
0324デフォルトの名無しさん
垢版 |
2012/10/16(火) 02:00:05.08
ポータブルPerlって
Perlのバージョンはなんだ?
言ってみろよwおらおらw
0326デフォルトの名無しさん
垢版 |
2012/10/16(火) 02:06:12.86
>>322
> ポータブルPerlこそがこの世の正義

つまり手元の環境で動きさえすればいいってもんじゃないってか?
0327デフォルトの名無しさん
垢版 |
2012/10/16(火) 02:06:57.24
>>322
> localtimeは標準モジュールより格上の標準関数

格上わろす
0330デフォルトの名無しさん
垢版 |
2012/10/17(水) 18:24:12.99
うるさいゴミ
0331デフォルトの名無しさん
垢版 |
2012/10/20(土) 13:36:25.82
リストコンテキストとスカラーコンテキストの違いとか printf とかはモダン
うんぬんの前に知らないとだめだろ。

モダンなゆとり世代。壮大な実験に付き合わされたモルモット。かわいそす
0332デフォルトの名無しさん
垢版 |
2012/10/20(土) 14:30:09.12
刹那的なモダンPerlでは自分が書いたスクリプトを数十年に渡って保守する
ことは不可能と悟り本来のPerlに戻ってくる。で、localtimeで書く。
0333デフォルトの名無しさん
垢版 |
2012/10/20(土) 14:43:54.03
>>332
perl本体に組み込まれた関数が何十年後も互換を維持してるとは思えないがな
0335デフォルトの名無しさん
垢版 |
2012/10/20(土) 15:54:12.00
数十年後も使い続ける物はCで書いとけよ。
Perl5自体、メンテされてるかどうか分からんぞ。
0337デフォルトの名無しさん
垢版 |
2012/10/20(土) 20:08:44.97
Cで書いたら実行環境の違いを記述するコードでアプリケーションが
埋め尽くされるんだろーなー
0338デフォルトの名無しさん
垢版 |
2012/10/20(土) 20:25:13.96
>337
Linuxのソース見たけど、
一部の層で吸収しているから
ほとんどのコードは実行環境の違いなんて関係ないよ。

ま、お前にはそんな芸当出来ないだろうがな。がはははははwwww
0340デフォルトの名無しさん
垢版 |
2012/10/20(土) 20:34:13.97
「Linuxしか習わなかった」と判断した理由を書いてください。

ゆとりの脳内はよくわかりませんのでw
あ、書かなくても(逃げても)構いませんよwww
0341デフォルトの名無しさん
垢版 |
2012/10/20(土) 20:54:05.91
書いてもいいんだけど、Linuxのソースが、Linux以外のオペレーティング
システム上でperlを実行したときの実行環境の違いを吸収できると考えて
いるひとには理解できなそう
0343デフォルトの名無しさん
垢版 |
2012/10/20(土) 21:21:01.55
やっぱゆとりだったかw

実行環境の違いなんてそれを埋めるレイヤーに固めるから
アプリケーションがそんなコードで埋まることはないってのが
一番の趣旨だろ。

こういう作り方ってのは普通にやることだし、そんなことが
思いつかないってのは自分でやったことがないってことw

そこからこのセリフにつながる

ま、お前にはそんな芸当出来ないだろうがな。がはははははwwww
0344デフォルトの名無しさん
垢版 |
2012/10/20(土) 21:42:31.78
>>343
意味不明
0345デフォルトの名無しさん
垢版 |
2012/10/20(土) 21:47:19.43
意訳 馬鹿だから理解できないw
0346デフォルトの名無しさん
垢版 |
2012/10/20(土) 22:34:46.28
興奮してるのか脳に障害があるのか分からないが
文章が無茶苦茶だな
0347デフォルトの名無しさん
垢版 |
2012/10/20(土) 23:27:28.93
たぶんではなくて完全に無理です。コンテキストの理解を求める俺のほうが
完全に悪かったです。printf も覚えようとしなくて結構です。

どうもすみませんでした。
0348デフォルトの名無しさん
垢版 |
2012/10/20(土) 23:55:00.68
モダンPerlが脳障■者を集めるのか、脳障■者がモダンPerlを好むのか

これって日本だけの現象なの?モダンRubyとかも同じ状況なの?
0349デフォルトの名無しさん
垢版 |
2012/10/21(日) 00:21:29.73
いいから黙ってろって
0350デフォルトの名無しさん
垢版 |
2012/10/21(日) 00:34:27.55
>>343
> こういう作り方ってのは普通にやることだし、そんなことが
> 思いつかないってのは自分でやったことがないってことw
>
> そこからこのセリフにつながる

罵倒を目的とした文章で代名詞の頻度が上がるのは、脳に良くない変化が起きていることを現すから気をつけた方がいい。
0352デフォルトの名無しさん
垢版 |
2012/10/21(日) 00:46:26.95
>>350
> 罵倒を目的とした文章で代名詞の頻度が上がるのは、脳に良くない変化が起きていることを現すから気をつけた方がいい。

そんなデータはありませんwww
大丈夫?
0354デフォルトの名無しさん
垢版 |
2012/10/21(日) 02:33:32.41
実行環境の制約(機器であったり、OSであったり、その会社の規則だったり)で
ポータブルなスクリプトを書かなければならないことはあるだろうけど、
制約によってモダンPerlで書かなければならないってことは現実にあるんだろ
うか?

その前にポータブルなスクリプトとレガシーなスクリプトの違いはちゃんと
理解できているのだろうか?

モダンPerlは結局のところ単なる自己満足なのだろうか?回答を求む。
0355デフォルトの名無しさん
垢版 |
2012/10/21(日) 02:48:51.74
> ポータブルなスクリプトを書かなければならないことはあるだろうけど
お前のポータブルの意味って何?
新しいPerlを入れればいいだけだろ。

お前が言ってるのは、ポータブルなスクリプトを書く。ではなく
古いPerlにも対応したスクリプトを書くって話。

ポータブルとは関係ない。
0356デフォルトの名無しさん
垢版 |
2012/10/21(日) 08:22:34.33
古いPerlって、どれくらい前のPerlの事を言ってるの?
CPANライブラリが動かないような古いPerlも視野に入れて開発しないといけないの?
どうして、そんな古いPerlに固執してるの?バージョンアップできないの?

正直モダンPerlって呼ばれてるような書き方をしてはいけないなんて制約がある方が特殊すぎ
0357デフォルトの名無しさん
垢版 |
2012/10/21(日) 14:23:20.43
自分の書くプログラムのスタイルなら、モダンだろうとクラシックだろうと好きに書けばよい。
でも、モダンPerl!モダン!モダン!って言う連中って、CPANとかのライブラリを使って書くことを
モダンだと言ってることが多い。

ライブラリを自分で抱えるのでなく、システムに入れろっていうのは横暴だし無理だろう。
すでに作られているシステムに、あとからCPANライブラリを追加したら、
既存のPerlスクリプト全ての再検証必要となるからね
0359デフォルトの名無しさん
垢版 |
2012/10/21(日) 15:03:26.42
今のモダンPerlの世界は
perlbrew + cpanminus + local::lib を使って
システムに入れずに最新Perlを使うのです。
0361デフォルトの名無しさん
垢版 |
2012/10/31(水) 01:25:45.68
書いたときにモダンなのは当たり前だろう
モダン推しは時間軸の視点が抜け落ちているんだな
0363デフォルトの名無しさん
垢版 |
2012/11/04(日) 17:39:50.59
なんでEncodeモジュールを追加しただけで
再検証が必要になるんだ?

Encodeモジュールは最近のPerlには標準搭載されてるだろ。
まさか最新のPerlで動かないコード書いてるのか?
0364デフォルトの名無しさん
垢版 |
2012/11/06(火) 01:19:20.40
>>318 >>319
フリーソフトはそもそも AS IS だからサポート切れとかはない
今までのどのらくだ本にも最初に書いてある

で、強要だの押し付けただのってしたことあったっけ?
0366デフォルトの名無しさん
垢版 |
2012/11/06(火) 23:57:40.03
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
0370デフォルトの名無しさん
垢版 |
2012/11/07(水) 21:58:36.93
Inline CとPerlとの
XSUB変換がperlgutの必須必要事項だと
会社の上司に言われたのですが、最後の

READMEに乗ってる
ようにmakeコマンドが生成されません。基本は
h2xs -A -n ExtModuleを実行し、種々の
実行環境を整えます。
参考URL:
http://d.hatena.ne.jp/perlcodesample/20100809/1278596435
0372デフォルトの名無しさん
垢版 |
2012/11/07(水) 22:04:16.52
#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ファイルらしき物は一向に
生成されません。
0373デフォルトの名無しさん
垢版 |
2012/11/07(水) 22:06:14.66
ちなみに
コマンドプロンプトから

..
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
のディレクトリが成立しています
0376デフォルトの名無しさん
垢版 |
2012/11/07(水) 23:28:00.83
Makefile.PLはこの作業を自動化するmakeファイルを生成してくれます。
↑これが原因か
何とも罪作りな記事だな
そのページのコメント欄に質問として書いちゃえよ
0378デフォルトの名無しさん
垢版 |
2012/11/08(木) 07:22:49.06
初歩的なミスを
した物のどの記事もWin系なのかUni系
なのかわからん記事ばかりで

一応
WindowにGnuWin32を通した物の

make: *** `makefile' に必要なターゲット `C:\Perl\libConfig.pm' を make するルー
ルがありません. 中止.

なんてエラーが
返って来る。結局Windowユーザーは
Xsubpp覚えなくてもいいってことか。
0387デフォルトの名無しさん
垢版 |
2012/11/18(日) 01:18:35.04
文字列がtest_1やtest_2やtest_3のように
test_○のような形になっているかを正規表現で調べるにはどうすればいいんですか?
○の中は数字のみです
0389デフォルトの名無しさん
垢版 |
2012/11/19(月) 11:30:45.47
>>387←正規表現スレじゃなくてここできいてるこの基地害なに?
0390デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:36:01.64
あげ
0391デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:36:59.73
モダン厨のすくつ
0392デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:38:10.24
さらに一文字減らせた!

($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
0393デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:38:50.82
printfの後のスペースなくても動いた!

($d,$m,$y)=(localtime)[3..5];printf"%04d"."-%02d"x2,1900+$y,$m+1,$d
0394デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:44:06.73
そんなに短さにこだわるなら、無理やり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
0395デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:49:11.82
おっと馬鹿が勝手に条件変えてきたぞ
0396デフォルトの名無しさん
垢版 |
2012/11/25(日) 00:51:05.56
>>394
print localtime->ymd;

これでいいんじゃね?

useまで入れたとしても短い。

use Time::Piece;print localtime->ymd;
($d,$m,$y)=(localtime)[3..5];print 1900+$y,"-",$m+1,"-",$d
0400デフォルトの名無しさん
垢版 |
2012/12/09(日) 15:03:54.83
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 )));
}
0401デフォルトの名無しさん
垢版 |
2012/12/09(日) 15:04:52.27
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
0403デフォルトの名無しさん
垢版 |
2012/12/09(日) 15:13:07.96
なお、提出期限は本日中とする。
0404デフォルトの名無しさん
垢版 |
2012/12/09(日) 20:41:15.31
確かRETVALて
マジック変数だよな。Perl側にアウトライン
した時に恐らくマジックに変異してるジャマイカ?

そして、またXSに入りINT2PTRで閲覧しよう
とする。うんで、マジックが掛かってるとキズかず
隠蔽された構造体にアプローチしようとしてとする。

上手く考えが定まらず、マジックやら
文法そのものやらに、あっちやこっち浮気し
まくってたらいつの間にやら難題に押しつぶされそうになってた。

もう資料の少ないマジックに手をださないから
RETVALに代入した後の処置を教えください。
0409デフォルトの名無しさん
垢版 |
2014/01/06(月) 16:11:01.27
解析するならPythonじゃね?
クラックコンテスト上位者はみんなPython使いのようだし。
0412デフォルトの名無しさん
垢版 |
2014/01/17(金) 08:52:36.67
倍幅文字を含んだ文字列を端末にテーブル状に整形して表示したいのですが,

==================================
# ソースの文字コード: utf8
printf "%04s\n", 'ab';
{
  use utf8;
  printf "%04s\n", 'あ';
}
{
  no utf8;
  printf "%04s\n", 'あ';
}
===================================
00ab
000あ
0あ

use utf8 だと文字数でカウントしてるようなので
倍幅文字を含んだ行と含まない行とでズレてしまいます.

no utf8 だとバイトでカウントしているようなので
やはりズレてしまいます.

端末上に上手く整形して表示する方法はないものでしょうか?

非モダン質問箱の方は質問できる雰囲気ではなかったので
こちらで質問させて頂きました.
0413デフォルトの名無しさん
垢版 |
2014/01/17(金) 14:45:12.15
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を返す
0415デフォルトの名無しさん
垢版 |
2014/01/17(金) 17:55:39.71
ゴミ
0417デフォルトの名無しさん
垢版 |
2014/01/18(土) 19:55:51.97
与えられた文字列から適当な数値を求めたいんだけど
標準関数で簡単にやるにはなにかいい方法ある?
0425デフォルトの名無しさん
垢版 |
2014/01/18(土) 21:27:09.30
>>421
BigInt付けるか、他の方法を考えるかしたら?
文字列じゃなくて、変数ってんならアドレスとかの方法もあるけど、
0429デフォルトの名無しさん
垢版 |
2014/01/18(土) 21:32:59.96
そもそもこんなところで質問してあーだこーだ言わないと使えないんだったら、
Rubyをサクッと学習してやったほうが早い。
0433デフォルトの名無しさん
垢版 |
2014/01/18(土) 23:17:08.53
配列の配列を戻り値にしたいんだけど
どうしたらいい?
0439412
垢版 |
2014/01/19(日) 20:39:49.50
>>413
制御文字を除外するために文字が特定範囲にあるか調べる方法がテクいです

>>416
同じことを思ってる人はいるものですね.
使ってみた限りでは問題なく調整してくれるみたいです.
\p{East_Asian_Width} で定義されてるかどうか等で判定しているので
半角カナもちゃんと幅1で計算されます.


MBPrintf.pm の方を使って printf を置き換えることにしました.
HTMLとかにして出力するしかないかなと思っていたところ
さくっと printf を置換えするだけで綺麗に出力できそうなので
大変助かりました. 質問してみて良かったです.
レスありがとうございました.
0445デフォルトの名無しさん
垢版 |
2014/01/20(月) 06:18:02.59
コマンドラインで使う前提での質問なのにシフトJISってw
質問すら読解する能力無いだろ

ほんとにWebProgに帰れよドアホ
0450デフォルトの名無しさん
垢版 |
2014/01/24(金) 19:52:20.84
Config::INI とかTiny とかのライブラリで
コメント行は ; になっているけど
これを # にするようにできるライブラリはある?
0455デフォルトの名無しさん
垢版 |
2014/01/25(土) 15:26:50.61
その程度も自分で調べられないとか頭悪いんだろうな
調べたら3分かかからなかったけどな
0462デフォルトの名無しさん
垢版 |
2014/01/26(日) 19:27:54.97
ニーハオ!
パンニハムハサム ザパニーズニダアルヨ!
ショーグンサマ バンザイ!
テポドン バンザイ!
0463デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:25:52.75
文字列が二つあって、その比較をしたい
共通1 差分1 共通2 差分2 共通3
みたいな感じで、2箇所まで差分を抽出したい

現実的な速度で動くうまい方法ないかな
0465デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:37:38.58
>>463
はぁ?
自分でやったけど何秒かかって、これが何秒以内に終わるようにとかも書けねーの?
本当にお前ゴミだな
リアルでもどうせその調子なんだろ
リアルでもゴミだと思われてるけど気付いてる?
0466デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:44:06.43
自分で試すことすらしない猿未満の低能には言うだけ無駄
猿ですら目的達成のために試行錯誤するのに
0467デフォルトの名無しさん
垢版 |
2014/02/05(水) 19:54:20.78
$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文字とかでもう遅すぎて使えなくなる
0470デフォルトの名無しさん
垢版 |
2014/02/05(水) 21:26:16.47
2つの文字列を文字ごとに分解して2つの配列を作ってから↓
ttp://perldoc.jp/docs/modules/Algorithm-Diff-1.15/Diff.pod
0472デフォルトの名無しさん
垢版 |
2014/02/05(水) 22:39:45.84
diffは多少一致してない部分があってもいい、みたいな曖昧な判定をするから、
余計にややこしいんだよな
0475デフォルトの名無しさん
垢版 |
2014/06/20(金) 08:07:41.06ID:w/WZ2GYd
say "";
0476デフォルトの名無しさん
垢版 |
2015/02/07(土) 15:14:06.33ID:yYV1uKlQ
ネットで検索する時は単語をスペースで区切ってそのANDで結果を得るけど、
同じことを正規表現でやりたい時はどう書けばいい?
0477デフォルトの名無しさん
垢版 |
2015/02/26(木) 19:17:26.46ID:0RIBJGtF
「$s が hello と world の両方にマッチする」なら、単に

$s =~ /hello/ && $s =~ /world/

と書くだけじゃないの?質問がよく分からないのだけれども
0478デフォルトの名無しさん
垢版 |
2015/02/26(木) 20:48:44.94ID:G3LqtZtx
>>476
あえて無理やり正規表現のみでやるなら否定先読みを使う

if( /(hoge|piyo).*(?!\1)(hoge|piyo)/ ){ print "成功\n"; }
0479デフォルトの名無しさん
垢版 |
2015/02/26(木) 21:43:04.63ID:dwtaxn6g
否定の先読みなんかせんでも
print ‘foobar’ if /(?:foo.*?bar|bar.*?foo)/ ;
で良いんじゃねーのか
0481デフォルトの名無しさん
垢版 |
2015/02/27(金) 00:27:41.82ID:xTYPuOZ2
仮に検索エンジンみたいなのを書くにしても
何を対象にするのかとか、検索単位とかを決めてもらわんと書きづらいぞ
「同じこと」の通り「対象:Webサイト、単位:ページ」ならGoogleに投げりゃ済むし
0482デフォルトの名無しさん
垢版 |
2015/02/27(金) 00:34:35.35ID:dW0+IHnO
検索対象も文字列に決まってるだろ
正規表現でのマッチングだっつってるんだから

逃げてないで考えてみれ
0483デフォルトの名無しさん
垢版 |
2015/02/27(金) 01:46:02.77ID:xTYPuOZ2
>>482
文字列?
テキストでもファイルでもなく?
それって何に使うんだろか…結局、目的は何よ?って話だよ
もしかしたらもっと良い方法があるんじゃ?と勘ぐってしまうのよどうしても
0484デフォルトの名無しさん
垢版 |
2015/02/27(金) 06:35:52.51ID:dW0+IHnO
またよく判らん屁理屈を
検索の単位が文字列に対してで、それがどこから来たかは問題にならないだろ
まあ、大抵はファイルからだろうけど

で、ファイルならこんなツールがあるよ、みたいな感じで本題から逃げたいのが見え見え
0485デフォルトの名無しさん
垢版 |
2015/02/27(金) 09:44:40.27ID:xTYPuOZ2
>>484
いやまあ、文字列に対してなら

my $hit = 1;
for my $ptn (split(" ",$search)) {
$s =~ /$ptn/ or $hit = 0;
}

こんなんで出来ると思うけど、こんなんで本当に良いのか?
後出し条件とか大量に出てきそうな感じがするんだが
0486デフォルトの名無しさん
垢版 |
2015/02/27(金) 20:22:44.34ID:JIR4zlR2
お前は、「ワンライナーでどうやりますか」って質問に
スクリプト作成して答えるのか?

「正規表現でどうやりますか?」って質問には、
普通に正規表現で答えりゃいいだろうが。
実際、質問への答えは、
>>477->>479で終了してる。

後出しを心配するなら実際に後出しされてから
盛大に罵倒しろよ
0488デフォルトの名無しさん
垢版 |
2015/02/28(土) 16:50:40.78ID:05aMjvqG
元々の要求はただのスペース区切りだから、パラメータ数は不定で、
パラメータ抽出して、その全部に対してマッチングを繰り返すという当たり前の処理になる

でも、そんなことは最初から判っているのでわざわざ聞く筈がない

スペース区切りの文字列をそのまま使ってマッチングがしたいなら、
残念ながらperlの正規表現でそんなことは出来ない、が答えとなる
0490デフォルトの名無しさん
垢版 |
2015/02/28(土) 17:35:55.35ID:e1yM9CPU
質問者のレベルまで勝手に想定するし、、、

>>476から読み取れるのは、拡大解釈しても
「ワンセンテンスの正規表現で書くにはどうしたらいい?」
程度だろーに
0491デフォルトの名無しさん
垢版 |
2015/02/28(土) 19:58:12.22ID:HemDgo4Q
◯正規表現で、AND検索の実装って、どうやんの?
×正規表現で、「スペースを使って」AND検索の実装って、どうやんの?

「わざわざ聞く筈がない」まで、分かってんなら、
自分の解釈の仕方が間違ってないか、
自問しろよ
0492デフォルトの名無しさん
垢版 |
2016/01/10(日) 13:39:26.30ID:/ndDSiBm
971 名前:名無しさん@七周年[] 投稿日:2006/11/11(土) 00:56:10 ID:M8+ahUZV0
自称スーパープログラマー某

強烈加齢臭
メール見ない メール無視
ドキュメント見ない ドキュメント無視
説明聞かない 説明無視
話聞かない 話無視
ガム→むっちゃー むっちゃー むっちゃー むっちゃー
煎餅→バリバリバリバリバリバリ
菓子パン→モグモグモグモグモグモグモグモグモグモグ
カップアイス→むっちゃー むっちゃー ペロペロペロペロ

フロアすべてに響き渡る 超ばかでかいくしゃみ 当然手でおさえない

異音と異振動
ドスーン!ドスーン! ドカーン!ドカーン! バコーン!バコーン! ズドン!ズドン!
机が近いとマウスポインターが飛ぶ 誤操作誘発
書類だしたりしまうだけでドカンドカン

30秒ごとに口と鼻から異音
ふんっっ!    ふんっっ!   

備品破壊 貸与P C 破壊 他人のもの破壊

奴の作ったスクリプトとプログラムは使えない バグ製造機

電話や共有携帯電話 キーボードが油ベタベタ
奴に電話とPCとコンソールは触らせてはいけない
0493デフォルトの名無しさん
垢版 |
2016/01/10(日) 17:45:28.72ID:lr/f1ZoA
Perl 5 version 16の正規表現で、地の文の一部としてマッチさせたいときに
バックスラッシュでエスケープせねばならない文字の一覧を教えてください
文字集合[ ]の内外で違うとか、文脈依存があればそれも知りたいです
0494デフォルトの名無しさん
垢版 |
2016/01/10(日) 22:39:51.49ID:iK/aBQIt
何をしたいのか知らないけど
http://perldoc.jp/index/core
で疑問のほとんどは解決すると思う。

まあ、エスケープすべき文字を知りたいということならそれは「英数字以外」だ。
\Q と quotemeta 関数について調べてみてほしい。
0495デフォルトの名無しさん
垢版 |
2016/01/11(月) 19:10:22.91ID:JutXF6Cv
>>494
ありがとうございます。
質問の動機は単に手で正規表現を書くときエスケープすべきかどうか
悩ましかったから(実際には「+」や「:」や「#」とか「[ ]」の外の「-」はエスケープ無しでも通っていそう)
だったからですが、エスケープして無害ということであればそうします

それはそうとしてquotemeta便利杉、
0497デフォルトの名無しさん
垢版 |
2016/01/23(土) 06:03:31.81ID:mGQek17v
>>496
おるけど?

まだ後10年は掛る。
触る必要無し

処理速度とか早くなってんのかも知れんけど、
起動が遅くて、使い物にならん。
挙動もバギー、docも揃ってない。
止事無き事情から、アルファ版を正式版として
リリースしただけじゃね?
0498デフォルトの名無しさん
垢版 |
2016/02/07(日) 22:53:45.48ID:zQAcaA+r
外部コマンドの話が出てて思い出したけど、
外部コマンドを実行するときに任意の文字列を外部コマンドの引数として渡したい場合、
Linux環境でエスケープすべき文字は?
シングルクォートとバックスラッシュだけエスケープして、それをシングルクォートで括ればOK?
0499デフォルトの名無しさん
垢版 |
2016/02/09(火) 22:03:18.36ID:390QsJXI
なんかPerl 5.16.1のウィンドーズ版のUTF-8対応は中途半端な希ガス、
use utf8;としてUTF-8でソースコードを書いても
open()のファイル名とかsystem()に与えるコマンド文字列とかが'shiftjis'(正確には'cp932')のままだし、
コマンド引数も'shiftjis'(正確には'cp932')のままだし、
なんでああなんですかね…
0500デフォルトの名無しさん
垢版 |
2016/02/09(火) 23:41:10.97ID:J9+y92l0
dankogaiがのらりくらりうまく回避しちゃうからじゃない?
俺はもうperlでsjis処理するのはあきらめた。
0501デフォルトの名無しさん
垢版 |
2016/02/12(金) 00:23:06.63ID:kq1OODWj
いろいろ面倒なんで、俺は use utf8; を使わないことにしたよ。
0502デフォルトの名無しさん
垢版 |
2016/02/13(土) 14:58:53.06ID:vq3C3FT5
>>498
シェルを経由するのならシェルのマニュアルを読みなさいとしか言えない。
bash の場合なら「定義」の項のメタ文字と「クォート」の項。
シングルクォートなら大体大丈夫なはずだけど。
そういう心配をしなきゃならないならシェルを呼ばない方が無難。
シェル経由でなければシステムコールするだけだから。
0503デフォルトの名無しさん
垢版 |
2016/02/14(日) 22:17:05.33ID:ctVTXhCg
>>498
もしかして、普段は Windows 使ってるからコマンドラインを作って渡す方法しか知らないとかそういうこと?
0504デフォルトの名無しさん
垢版 |
2016/02/14(日) 22:28:48.47ID:d+6VipxK
思い付きで気軽にコマンドライン作って出力をキャプチャできるのがLLの良いところなのにね。
0505デフォルトの名無しさん
垢版 |
2016/02/15(月) 12:21:34.14ID:9WjYXC66
>>504
助けてあげる気が無いなら引っ込んでてくれないか?
0506デフォルトの名無しさん
垢版 |
2016/02/15(月) 15:10:01.24ID:8Z92Uy24
>>498
" " 内では、「$(変数展開) \ `(コマンド置換) !(ヒストリ)」が展開される。
' ' 内では、展開されない。
\ は直後の1文字の機能を無効化する

メタキャラクタ・特殊文字なら、他にも多数。
? * > >> < << | ~ & など

ただし、「! ~」は、bashのみ
0509デフォルトの名無しさん
垢版 |
2016/02/17(水) 00:23:01.67ID:wnysiCN2
なんと!もう発売されていましたか!
0510デフォルトの名無しさん
垢版 |
2016/02/23(火) 20:40:57.84ID:RqQoWDN5
これからPerlを学ぶメリットってある?
0512デフォルトの名無しさん
垢版 |
2016/02/24(水) 02:40:25.37ID:lkPqYQmC
UNIXの歴史をエッセンスにしてUNIX以外でも使えるようにした言語だから学ぶ価値はある。
おれの場合はWindows上で毎日使ってる。慣れの問題もあるが他の言語だとこうはいかない。
0514デフォルトの名無しさん
垢版 |
2016/02/24(水) 05:22:56.15ID:0U45vlYv
バージョンをきにしなくていいなら、Perlは、Windows 2000のパソコンでもつかえる。
現在のRubyは、インストーラがうごかない。インストーラがうごいても、実行時にDLLがどうのこうのいってエラー
Pythonも同様だろう、インストールがめんどくさいのは、損ですよ

Ruby, PythonでもCygwinならいけるかも
Cygwinがきらいなひとは、こまります
0516デフォルトの名無しさん
垢版 |
2016/02/26(金) 20:40:22.77ID:S1uVBK59
今時Cigwinなんて使ってるやついるの?
使う理由が見当たらないんだけど…。
0522デフォルトの名無しさん
垢版 |
2016/02/28(日) 11:39:02.77ID:w1saw6Ta
>>521
その場合、Perlの部分は同じ。違うのは cmd.exe と bash (またはzsh) なので
コマンドプロンプトで出来ないこととは、シェルとシェルスクリプトの実行ということになる。

つまりbash(zsh)の快適な操作性が、cmd.exeにはない。
LinuxやMacで動くシェルスクリプトがcmd.exeでは動かない。
0523デフォルトの名無しさん
垢版 |
2016/02/28(日) 22:48:20.46ID:Ozi57itY
パスに日本語使わない運用ならね
でもそれって制限きついよね?仕事で使うのはまず無理だな
0524デフォルトの名無しさん
垢版 |
2016/02/28(日) 23:03:09.55ID:w1saw6Ta
そういやcygwinはファイル名に日本語ついていても
ちゃんと動くよな。凄いことだよな。

>>523
お前何の話してんのー?
0526デフォルトの名無しさん
垢版 |
2016/07/18(月) 23:24:13.82ID:RVsoZVBC
ロブ・パイク語録。
>「UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている」 - 1991年ごろ
(中略)
>「そういった日々は過ぎ去り、賛辞は Perl にもたらされた」 - [7] 単機能ツールについて
賛辞は Perl にもたらされた!
0528デフォルトの名無しさん
垢版 |
2017/04/14(金) 21:43:32.26ID:zXRfLbO9
win7でactiveperl
`コマンド` からの応答をファイルに書き出したい
テキストならうまくいくけど、バイナリで失敗する
書き出し用のファイルはbinmodeにしてるので、受取側がおかしい
binmode STDIN
にはしてるけど変わらないみたい

C:> コマンド > file.bin
でリダイレクトすると成功するので、コマンド自体はちゃんと動いてる

何が悪いんだろう
0530デフォルトの名無しさん
垢版 |
2017/04/14(金) 22:32:15.06ID:zXRfLbO9
バイナリエディタとか無いから詳しくは判らないけど、
pptファイルを開こうとしても怒られる
0533デフォルトの名無しさん
垢版 |
2017/04/15(土) 15:50:50.88ID:40tq7pz4
exe単体のもあるしそれさえアウトでも家の環境で再現させられるだろ
つか業務関連なら会社で聞けば
0534デフォルトの名無しさん
垢版 |
2017/04/15(土) 16:02:38.46ID:4y1tBhnC
知らないなら黙ってればいいのに

何かバイナリを標準出力に吐くコマンドなら何でも試せる筈
なかなかそういうサンプルが無いけど
0536デフォルトの名無しさん
垢版 |
2017/04/15(土) 20:14:19.75ID:4y1tBhnC
これだけの情報で判らないならコード見ても判らないよ

binmode STDIN;
$result = `SomeCom.exe`;
open $out, '>', 'outfile.bin';
binmode $out;
print $result;

これだとNGで、
C:> SomeCom.exe > outfile.bin
これならOKになる
0538デフォルトの名無しさん
垢版 |
2017/04/15(土) 21:14:47.45ID:klGQGN6C
>>536
どう見ても標準出力に吐いてるんだけどそのコードで再現することは当然確認したんだよね?
0540デフォルトの名無しさん
垢版 |
2017/04/16(日) 00:22:01.12ID:h3ZKvGOL
open $in, '-|', 'SomeCom.exe';
binmode $in;
$result = <$in>;

こんな感じか
` ` を使う限り解決できない?
0541デフォルトの名無しさん
垢版 |
2017/04/16(日) 00:23:16.22ID:h3ZKvGOL
あ、違う
@result に受けて結合か
そこでもまた改行コードが何かしそうな不安が
0542デフォルトの名無しさん
垢版 |
2017/04/17(月) 21:59:30.64ID:MMDneckh
>>539が正解でした
ちなみに、結果を変数に受ける必要はなくて、
入力から出力にそのまま流す方がスマート
0543デフォルトの名無しさん
垢版 |
2017/04/23(日) 22:19:57.91ID:RpWO8O1f
答えを知ってる人はシンプルにいきなり正解のみを示すんだよな

で、必要な知識のない人が見当違いのことをいろいろ書いて掻き回す
0544デフォルトの名無しさん
垢版 |
2018/02/16(金) 06:37:50.13ID:W1XJdyx1
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
0545デフォルトの名無しさん
垢版 |
2018/02/16(金) 20:54:02.63ID:YSXjevvC
あれ?そういやこのスレは消化されないまま残ってたの?ちょっと前に63箱目が1000になったんだけど。
じゃあ新スレ立てずにそのままここ使う?
0546デフォルトの名無しさん
垢版 |
2018/02/17(土) 13:11:36.41ID:m8W4h2UJ
>>545 ここで良いんじゃない?

Windows7 で ActivePerl 5.16.3 を使っているんだけど、改行が CR LF (0D 0A) のファイルを
<> で読み込むと、行末が LF (0A) だけになる。これはなぜに?
0549デフォルトの名無しさん
垢版 |
2018/02/19(月) 12:04:01.90ID:9O6KBvIf
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)

▼前スレ
0551デフォルトの名無しさん
垢版 |
2018/02/20(火) 09:05:34.87ID:67uqfrCT
これが次スレになったのね。
おいらもそうだが、
最近、スレが立てられなくなった人が多いのかな?
0552デフォルトの名無しさん
垢版 |
2018/02/20(火) 10:46:08.66ID:vE/Q7KOY
>>550
もしやあなたはCGIとPerlの区別がつかない人?
0553デフォルトの名無しさん
垢版 |
2018/03/03(土) 15:00:12.27ID:y3R+TCM+
websocketをやってみたいんですが、Net::WebSocketというのとProtocol::WebSocketというのが検索で掛かります。
どっちを使うのでしょうか
0554デフォルトの名無しさん
垢版 |
2018/03/03(土) 15:02:25.59ID:y3R+TCM+
サーバにしたいです
0556デフォルトの名無しさん
垢版 |
2018/03/05(月) 16:53:07.80ID:vyqV3ojD
>>555
フレームワークは勉強の為に避けようと思います。
0557デフォルトの名無しさん
垢版 |
2018/03/05(月) 18:51:20.07ID:p13q4iUt
正直websocketやるのにPeal選ぶ意味は無い気がする
やりたいってんなら止めないけど
node.jsとかgoでいいような
適材適所というか
0558デフォルトの名無しさん
垢版 |
2018/03/06(火) 11:48:05.65ID:tpILJMN5
汎用的なものが作れないかと思っています。
スピードを求めるならjavaで作ろうと思います。
0560デフォルトの名無しさん
垢版 |
2018/03/18(日) 10:31:45.09ID:cNEg10A5
perlでサーバーAで計算した値をサーバーBに送り表示することってできますか?
できるならどうやるんですか?
できればモジュールなくても使える方法がいいです。
0561デフォルトの名無しさん
垢版 |
2018/03/18(日) 11:47:09.15ID:JGqM6rnc
サーバーAで計算した値をサーバーBに送るとはどういうことか、何に表示したいのか
perlの前にここを明らかにした方がいい
0562デフォルトの名無しさん
垢版 |
2018/03/18(日) 12:33:37.42ID:cNEg10A5
>>561
もっとわかりやすいように質問変更する
サーバーAでログインIDとパスワード入力して
サーバーBに置いてあるユーザー情報と比較してログイン成功なら
サーバーAにログイン成功だと言う情報を送りたい
こういうこと
0563デフォルトの名無しさん
垢版 |
2018/03/18(日) 13:33:56.77ID:JGqM6rnc
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で使うならこんな感じで行けるんじゃない
0566デフォルトの名無しさん
垢版 |
2018/03/18(日) 20:51:03.76ID:Cc3+LG/u
鯖へのログインなのか、それともHTMLページ等でのログインなのかも分からん
0567デフォルトの名無しさん
垢版 |
2018/03/30(金) 12:35:13.04ID:5tmqHLck
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こちらも待てど暮らせど進みませんでした。
一括で取得する方法はありませんでしょうか。
0568デフォルトの名無しさん
垢版 |
2018/03/30(金) 12:48:02.51ID:TlFsJGTt
>>567
ノンブロッキングのソケットってできなかったっけ?
fcntl()で指定するんだったような気がするが。
まあでもこの辺はOSによって微妙に違うかも知れないのでよく調べてみて。

で、ブロックしないようにしておいて受信したやつをとにかく全部読んで最後に \0 が6つあるかどうか見ると。
0569デフォルトの名無しさん
垢版 |
2018/03/30(金) 13:25:36.98ID:5tmqHLck
>>568
ありがとう
試してみた感じとまらなくなりました。
助かりました。
0570デフォルトの名無しさん
垢版 |
2018/03/30(金) 20:15:44.88ID:1Iia3Fde
while(1) {
  PROC1;
  if (COND) {
    last;
  }
  PROC2;
}

こんなような処理を、while(1)とかlastとか使わずにスマートに書けない?
0571デフォルトの名無しさん
垢版 |
2018/03/30(金) 20:22:24.29ID:x2Z4e+RC
>>570
PROC1はCONDの値を返さないってこと?
0573デフォルトの名無しさん
垢版 |
2018/03/30(金) 20:55:20.44ID:dOU2138G
>>569
non-blocking にするとデータが何もきてない時にほとんど素通りするので
selectとか使って自分で待たせることを忘れずに。そうしないと入力待ち
ループが物凄く早く回ってしまい無駄にCPUタイムを食うことになる。
0574デフォルトの名無しさん
垢版 |
2018/04/14(土) 09:32:20.00ID:3ZAO+EKI
x が100000〜100500 なら y=1000
100501〜100700 なら y=1001
100701〜120000 なら y=1002

みたいな感じになってるとする
xはある範囲を全部埋めていて、yはある範囲で連続

で、xが与えられた時にyを求めたい
どんなデータ構造にするのが一番効率的だろう
0575デフォルトの名無しさん
垢版 |
2018/04/14(土) 14:29:40.83ID:lJIoGN24
Perl関係無いような…
俺だったらxのfrom値をキーにハッシュ作って値にy入れるかなぁ
0576デフォルトの名無しさん
垢版 |
2018/04/16(月) 09:41:27.92ID:h6scVdPk
>>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モジュールが必要。
0578デフォルトの名無しさん
垢版 |
2018/04/16(月) 19:16:06.77ID:jtdCSi5V
yを0から999までに単純化して、
下限だけ入れた配列を毎回0から見つかるまで舐める

という実装にしたら、余裕で一瞬で終わるので、これで十分だった

個人でDBが要るようなケースって、まず無い気がする
0579デフォルトの名無しさん
垢版 |
2018/04/16(月) 19:54:02.09ID:Njbya+hs
>>578
ちなみに、DBを使ったことある?

個人的には、個人用途でもあれば便利。
保存関連がかなり楽になる。
0580デフォルトの名無しさん
垢版 |
2018/04/16(月) 20:29:20.27ID:jtdCSi5V
仕事でaccess使ったくらいだけど、
規模的にはテキストでも全然構わないレベルだった

excelと連動させたいからそういう手段が選べないだけで、
個人なら最初からexcelそのものを使わない
0581デフォルトの名無しさん
垢版 |
2018/04/17(火) 09:50:37.14ID:CpeCFbdf
扱うデータが多くて一々考えるのが面倒な時は使ってみると良い。
0582デフォルトの名無しさん
垢版 |
2018/04/17(火) 18:45:22.69ID:O41FhP2w
データの規模よりは、構造の複雑さだろうな
いろんな属性がいっぱいくっついてて、それらが相互に関連してるようなデータを
テキストベースで作るのはなかなか大変

で、個人でそんなデータを扱う機会はやっぱり無い
家計簿をコンビニ別に統計を出したいとか、そんなことは思わないし、
そうできるようにデータ入力するのが面倒すぎて挫折する
0583デフォルトの名無しさん
垢版 |
2018/04/17(火) 20:55:41.70ID:jy0h/NRq
こんな単純なデータ構造のものをDBにしたら遅くなるのは目に見えてる
単純に2つの配列か、独立してるのが嫌なら、2つの要素を持つオブジェクトの配列でいいだろ
0584デフォルトの名無しさん
垢版 |
2018/04/17(火) 21:07:35.33ID:O41FhP2w
しまうのはそれでいいけど、検索できんだろ

数が莫大になっても短時間で検索できるようにしまっといてくれるのがDBのいいところ
でも高々1万とかならリニアで十分
100万とかあると探索アルゴリズムが威力が効いてくる
0585デフォルトの名無しさん
垢版 |
2018/04/17(火) 21:08:16.86ID:IUYvc0m6
小規模だと遅くなるだろうな。
0587デフォルトの名無しさん
垢版 |
2018/04/18(水) 02:06:34.84ID:yJ81KmRv
>>586
DB使って、どういうキーでクエリー出すの?
俺は詳しくないから考え方だけでいいので教えて
・x>=キーのものの中からMINを取って、それのyを出力?
・x>=キー and 次のレコードのx<キー?(次のレコードって見れるのかは知らんけど)
・x,yの他にx2として範囲の最後をデータとして追加しておき、x<=キー and x2<キー?
何かベストマッチな方法がありそうだけどね
(上記の方法ではとてもDBの検索が効率よくいけるとは思えんので)
0588デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:06:20.17ID:kaO6I25j
単純にSELECT y FROM hoge WHERE x BETWEEN a AND bで
実態はSQL側で最適化してくれるよ
データを扱うことに特化した高級言語な訳だし

個人的にはDB使うかどうかって、
データの流動性(?)がポイントな気がする
弄る機会が多ければ多いほど恩恵受けられる訳だから
0589デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:22:30.21ID:yJ81KmRv
>>588
BETWEEN a AND bって、aからbの間ってことじゃなかったっけ?
x=100502の場合のyを求めるのにどう書くの?
BETWEEN 100502 AND 100502でいいんだっけ?
0590デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:27:30.58ID:yJ81KmRv
これって例えば、10000から11000の間にあるデータxを全部抽出したい場合とかに使うものなのでは?
0591デフォルトの名無しさん
垢版 |
2018/04/18(水) 03:58:19.16ID:yJ81KmRv
>>587の例って全部おかしかったので書き直しとく
・MAX(x<=100502)
・x<=100502 and (次のレコードのx)?>100502
・x<=100502 and x2>=100502
0592デフォルトの名無しさん
垢版 |
2018/04/18(水) 11:34:48.13ID:gg2GabAw
表は x の最大と最小(xmin,xmax)と y をただ入れといて select y from xytbl where x between xmin and xmax みたいにすればいいじゃん。
xmin + 1 が次の xmax と一致するので無駄があるが xmin, xmax にインデックス作っておけば多分速くはなるだろう。
どうしても無駄をなくしたい場合は xmin と y だけにして xmax はビュー作ってそちらであるかのように見せかけておくか、または複雑になるが一つのSQL文にするかだ。
0593デフォルトの名無しさん
垢版 |
2018/04/19(木) 02:32:23.49ID:h5gs+kbl
>>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
なら全レコードがマッチするよ
0594デフォルトの名無しさん
垢版 |
2018/04/19(木) 03:01:26.91ID:h5gs+kbl
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
と同じってこと
0595デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:18:42.11ID:XRkJ53+o
>>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 両方出している。
0596デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:19:56.20ID:T9/zIgZR
ごめんびとうぃーん言い出しっぺだけどダメだね
感覚と言うかノリだけで書いてしまった
実際書くと即だめじゃんってなるやつ
0597デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:22:29.59ID:XRkJ53+o
PerlからDBI経由でDBアクセスするならxtbl不要でxの部分はprepareで'?'にしておいてexecuteで実際の値を渡せば良い。
0598デフォルトの名無しさん
垢版 |
2018/04/19(木) 10:28:26.42ID:T9/zIgZR
真面目に今考えた結果
Select y From hoge Where ? < x Order by x Desc Limit 1;
で多分取れる
0599デフォルトの名無しさん
垢版 |
2018/04/23(月) 17:03:26.38ID:YcjqEwjB
$$で取得するプロセスIDはどんな環境でも最大4桁までですか?
0600デフォルトの名無しさん
垢版 |
2018/04/23(月) 17:19:28.43ID:AJxfAl3T
>>599
んなこたなかろう。Linuxで ps -fe とかやれば5桁ぐらいのが沢山出てくるぞ。
かといって最大5桁で作って安心してはいけない。
将来的に変わるかも知れないしLinux以外ではもっと桁数あるかも知れないからな。
0601デフォルトの名無しさん
垢版 |
2018/05/01(火) 17:33:53.54ID:Jzi33zXB
全く初歩的な質問ですいません
ググってみたのですがそのものズバリの例を見つけることができませんでした。
やりたいことは、連装配列に配列を入れて取り出すことです。
最後の出力行が [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.
[]
0606デフォルトの名無しさん
垢版 |
2018/05/01(火) 21:42:46.89ID:4WtZiQYp
デリファレンス側もちょっと不満があるな

printf( "[%s]\n", ${$hash01{"name"}}[0] );
こうか
printf( "[%s]\n", $hash01{"name"}->[0] );
こうがいい
0608デフォルトの名無しさん
垢版 |
2018/05/02(水) 08:00:00.39ID:lnsF+QsJ
#自分ならこうするかな
my $hash01;
my @array01;

@array01=(2,4,6,8);

$hash01 = {
name => \@array01 ,
foo => \@array01 ,
bar => \@array01 ,
# .... 多分こういうふうに増えるだろうし
};

printf( "[%s]\n", $h->{name}->[0] ); # -> があると目が滑りにくい!
0609デフォルトの名無しさん
垢版 |
2018/05/05(土) 20:27:28.60ID:yJAqb+uF
正規表現でマッチした部分を$1,$2などで取り出すけど
$いくつまであるかわからない場合$1,$2...$nをまとめて配列に入れる方法ってどうやるんですか?
0610デフォルトの名無しさん
垢版 |
2018/05/05(土) 21:54:57.88ID:ddSxgz72
>>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);
0612デフォルトの名無しさん
垢版 |
2018/05/06(日) 12:36:15.67ID:Bse1bLkg
>>611
え?困らんだろ。普通に $10 とか $11 とか書けば良いだけだし。
0613デフォルトの名無しさん
垢版 |
2018/05/06(日) 13:41:43.10ID:1K09Bg92
Perl のことだとは言ってないな。正規表現の話なら 9 までしか使えない方が多数派だ。Perl でさえ昔はそうだった。
まあ、そういう話なら $10 ではなく \10 と書くべきかもしれないが。
0614デフォルトの名無しさん
垢版 |
2018/05/06(日) 18:20:08.93ID:Bse1bLkg
いやこのスレは「Perl についての質問箱」なわけで・・・
0615デフォルトの名無しさん
垢版 |
2018/05/15(火) 01:25:39.67ID:bz5cqKe9
ユーザ定義関数のリファレンスを変数に代入しておき、そのリファレンス変数を
参照することによって関数を呼び出すことができます。たとえばこんな感じに。
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.

となってしまします。何かいい方法をご存知でしたら教えてくださいませ。
0617615
垢版 |
2018/05/15(火) 23:35:25.73ID:fP8R1+3G
>>616
\&CORE もためしたけれど

$r = \&CORE::print;
print "$r\n";
$r->(3.14, "\n");

実行すると

Undefined subroutine &CORE::print called at 〜.pl line 3.
CODE(0x3919c)

となるのよ。
できなことなのかね…
0618デフォルトの名無しさん
垢版 |
2018/05/16(水) 00:12:42.68ID:uHifQt6J
ttps://perldoc.perl.org/CORE.html
COREパッケージの関数もリファレンスを取得したり別名を定義することができる(pushなど)
ただし一部はベアワードでしか呼び出せない(printなど)

>組み込み関数についても、リファレンスを変数に代入しておき、変数を参照することによって組み込み関数を呼び出すことができないか
結論: ものによる
0619615
垢版 |
2018/05/16(水) 01:13:39.26ID:N7L5seGg
>>618
ありがとう。
0621615
垢版 |
2018/05/16(水) 07:58:19.21ID:lqxKAjJz
>>620
そうすれば機能的に可能だけれど、
ユーザ関数のコードがワンクッション間に入るので
パーフォマンス的にみて、
できれば組み込み関数を直接、第一級関数としてクロージャーなどに
使えないか調べていた、ってわけですのよ
0623デフォルトの名無しさん
垢版 |
2018/05/23(水) 19:29:13.97ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

U85LY
0625デフォルトの名無しさん
垢版 |
2018/05/24(木) 12:17:56.05ID:62mXzMMG
bless
それは祝福
0627デフォルトの名無しさん
垢版 |
2018/05/26(土) 06:15:15.44ID:qdFYQfps
さすがにリファレンスですらない変数だと怒られた
でも、勝手に作った偽オブジェクトを食わせたりはできる

他の言語はそのへんの安全装置はどうなってるんだろう
0628デフォルトの名無しさん
垢版 |
2018/05/26(土) 11:44:11.22ID:nibGH99w
blessは、オブジェクトにパッケージを関連付けるだけだろ。
どんな「安全装置」が必要なのか?

ちなみに、RubyもJavaScriptも、動的に後からメソッドとか足し放題だな。
まあ、スクリプト言語としては残念でもないし当然。
0629デフォルトの名無しさん
垢版 |
2018/05/26(土) 11:59:50.95ID:qdFYQfps
メソッドを足すのと、コンストラクタが生成してないものを使うのは全然違うだろ
0630デフォルトの名無しさん
垢版 |
2018/05/26(土) 15:30:59.65ID:NxLTutQ0
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
0632デフォルトの名無しさん
垢版 |
2018/06/08(金) 21:09:03.47ID:JtDK6GNM
例えばファイル名を入れて関数を呼んで、
処理結果を入れた配列なりのリファレンスを戻り値で返す
別のファイル名で同じ関数を呼んで、結果のリファレンスを別の変数で受ける

それで普通に動くんだけど、
なぜ同じ関数のmyで宣言した変数が違うオブジェクトを指しているのか、
なぜ古い方は消えてしまわないのか、
そもそもいつまで残ってるのか、
みたいな部分が何となく不安

参照カウントの仕組みを理解しても、やっぱり不安
0633615
垢版 |
2018/06/09(土) 01:53:50.05ID:dh6JCgcP
>>632
気持ちはなんとなく分かるけど、
こういう人に対して何と言って分かりやすく説明したら
よりよいかは
少し考えてしまうな…
0634デフォルトの名無しさん
垢版 |
2018/06/09(土) 05:26:23.38ID:uYb8xFM5
大丈夫。参照されなくなったやつは自動で消える。
0635デフォルトの名無しさん
垢版 |
2018/06/09(土) 08:22:42.99ID:VVS81UdD
消えないことに対する不安じゃないんだよな

肉体は既に滅びているけど、どこかにある名簿にまだ名前があるお陰で、
辛うじて魂だけまだ現世に留まってる感じ

リファレンスを戻り値で受けるんじゃなくて、
自分で宣言した変数のリファレンスを引数で渡して、
そこに入れて貰う方式なら安心できる
意味は同じなんだけど
0636デフォルトの名無しさん
垢版 |
2018/06/09(土) 08:45:10.02ID:ngqKHOqq
strdupの仕様の気持ち悪さ
無名関数のリファレンスの気持ち悪さ
みたいなやつなら、俺も感じる
0637デフォルトの名無しさん
垢版 |
2018/06/09(土) 17:49:06.89ID:uYb8xFM5
うーん。しかし、そういうのは言語を実現する環境の実装にバグがあるかどうかの問題だよなあ。
そのバグを気にするならどんな言語も使えなくなるのでは?コンパイルする言語でもバグってて
変なコード作られたら終わりだしなあ。
0638デフォルトの名無しさん
垢版 |
2018/06/09(土) 19:13:31.22ID:sS73Mbwb
信頼性の話じゃないだろ。
言ってしまえば、リファレンスとかオブジェクトとか、なんかふわふわしてて、なんとなく納得がいかん、てだけ。

感覚的には慣れの話でしかないと思うけど、どうしてもというなら、C++でもやってみればいいのでは。
newとかヒープとかを把握できれば、実はぜんぜんふわふわしてないことが理解できるはず。

余計に混乱するかもしらんけども。w
0639デフォルトの名無しさん
垢版 |
2018/06/09(土) 19:58:15.52ID:VVS81UdD
C言語で関数内にstatic変数を持ってて、
そこに何か格納してそのポインタを返す、みたいな仕組みなら安心する

何回呼んでも同じポインタが返ってきて、前回の内容は保存されていない
だから必要なら呼んだ側の責任で保存しとかないといけない
家がない子はいない

perlのsub内のmy変数のリファレンスも見かけはそれと似てるけど、
実際の動作が全然違って、実体は動的に生成される
じゃあC言語のauto変数みたいなもんかというと、関数が終わってもスコープを抜けない
かといってずっと存在する訳でもなくて「要らなくなったら消える」というルールが人智を超える

うまく動くように出来てるんだから、怖がらずに飛んでみろ的な
0640デフォルトの名無しさん
垢版 |
2018/06/09(土) 20:16:55.67ID:vLAdQtfD
もはや信じるか否かという宗教的問題か?
0641デフォルトの名無しさん
垢版 |
2018/06/09(土) 20:29:44.29ID:VVS81UdD
変数の寿命なんて本来はコードから静的に判るものだったのに、
それを動的にする代わりに管理を手放して機械に任せることにした
それはなかなかのパラダイムシフトである筈なのに、
オブジェクト指向のデータ隠蔽とセットで隠蔽されてあんまり気にしてない

コンストラクタさんに任せとけば全部うまくやってくれるから
0643デフォルトの名無しさん
垢版 |
2018/06/10(日) 05:50:21.80ID:eOmqsLdO
>>639
それだとマルチスレッドの時に困るわけだな。呼び出し側でバッファ作ってそのポインタを渡すという手もあるが、
量が動的に変化する場合はそれだけでは実現できない。で、malloc() 使うわけだが、そうするとどこかで必ず
free() する必要が出てくる。これが煩わしいので自動でなんとかならないかと色々やってるのが今時の言語。
とはいっても Perl は30年以上前に作られた言語だけどね。
0645デフォルトの名無しさん
垢版 |
2018/06/10(日) 18:52:31.32ID:7xflXXzg
個人環境をMariaDBに代えてみたけど
DBD::MariaDBがgithubにしかなくてMySQLに戻したわ(´・ω・`)
こういうとこ困るなー枯れてると
0648デフォルトの名無しさん
垢版 |
2018/06/11(月) 13:01:10.20ID:FLjqN/A3
枯れてるって、不具合とか掘り尽くされて安定してるって言ういい意味と
動きが無いって言う悪い意味の両面がある気が
0649デフォルトの名無しさん
垢版 |
2018/06/11(月) 13:04:00.52ID:FLjqN/A3
>>646
my.conf的な(my.confではない)、恐らくMySQLにあってまりあDBに無いファイル読みにいってこける。
たぶん簡単に修正できるけど、CPAN取得ファイルは弄りたくないから様子見にしたわ
0651デフォルトの名無しさん
垢版 |
2018/06/11(月) 17:21:23.85ID:FLjqN/A3
>>650
この場合「枯れる 言語」のが適切だと思うけど…
俺は文脈でどっちの意味でも使ってたわ
0652デフォルトの名無しさん
垢版 |
2018/06/11(月) 19:02:34.25ID:HvQh9O78
不具合が枯れたなら分かるけど、動きがないはよくわからん。
ユーザー数は関係ないってこと?C言語はどっち?
0653デフォルトの名無しさん
垢版 |
2018/06/11(月) 19:30:59.90ID:giD/kjqV
%cat = (%hash1, %hash2);
みたいにするとハッシュが結合できる
keys %cat でkeyの配列が取得できる

でも、keys (%hash1, %hash2)
とすると怒られる
keys {%hash1, %hash2}
ならいけるけど、5.12では通らない

どうすれば
0655デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:25:55.72ID:C5cAV0Rs
それだけだと同じキーがあった場合に2つ出て来るのでもう一捻り必要ということになるんだろうな。

こうかねえ?

keys map { $_ => 1 } keys %hash1, keys %hash2
0656デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:27:28.65ID:bgvsbZyV
>>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
$
$# できるといえばできるけど、君がやってるやり方をおすすめするよ。その方が余計なバグを防止できる。
0657デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:37:24.11ID:giD/kjqV
怒られる方法が何故悪いのかがよく判らんのだよな
普通に無名のハッシュになるんじゃないのかと思うんだけど、
> Type of argument to keys on reference must be unblessed hashref or arrayref
hashでもarrayでもない何かのリファレンスになってる?
0658デフォルトの名無しさん
垢版 |
2018/06/11(月) 21:46:36.09ID:C5cAV0Rs
{}で括ってるからhashrefと思ったとか
0659デフォルトの名無しさん
垢版 |
2018/06/11(月) 23:58:04.20ID:kxBy2s6A
keys()が引数にリファレンスをとれるようになったのは最近(でもないけど)だから、曽野せいなんでは。
>>657
0661デフォルトの名無しさん
垢版 |
2018/06/12(火) 00:01:02.77ID:DCSlzX2w
%hash1 = (a => 1, b => 2);
%hash2 = (c => 3, d => 4);
$ref = (%hash1, %hash2);
print $ref;

さて、何が表示されるでしょう?
0662デフォルトの名無しさん
垢版 |
2018/06/12(火) 02:21:03.71ID:zyhS8Ljg
perl -e "use Data::Dumper; %hash1 = (a => 1, b => 2); %hash2 = (c => 3, d => 4); $ref = (\%hash1, \%hash2); print Dumper($ref);"
0663656
垢版 |
2018/06/12(火) 13:02:00.90ID:0nDO7HX7
>>660
つっこみありがとう。もう長いこと Perl 使ってるからね、そこはデリファレンスしたいんだよ。
そもそも Perl4 にはリファレンスが無かったんだ。
C でも関数ポインタ使うときは (*p)() みたいな書き方してるよ。
0664デフォルトの名無しさん
垢版 |
2018/06/13(水) 02:19:57.94ID:mK+NhzCY
>>661
2/8 と出た。何が出てるんだこれ?
0665デフォルトの名無しさん
垢版 |
2018/06/13(水) 06:32:37.33ID:a9+2+9qX
>>661
通常はそこはリスト値に展開されて %hash2 の要素のどれかが全体のスカラ値になるはずだけど、そうなってないね。
その仕様は公式ドキュメントのどこに書かれてるの?
通常の評価をしてもらうにはどう書けばいいの?
0666デフォルトの名無しさん
垢版 |
2018/06/13(水) 07:40:41.18ID:3GuASBgR
>>664
5.26からは挙動が変わったので注意
ttp://perldoc.jp/docs/perl/5.26.0/perl5260delta.pod#scalar40-37hash41-32return32signature32changed

>>665
リスト値が展開されてから代入されるのではなく
左辺がスカラコンテキスト -> リストの一番右側の値が代入される -> %hashをスカラコンテキストで評価
と思われ
0667デフォルトの名無しさん
垢版 |
2018/06/13(水) 10:44:03.43ID:a9+2+9qX
ありがとう。perldata は読んでたけど理解できてなかった。
0668デフォルトの名無しさん
垢版 |
2018/06/15(金) 22:18:58.35ID:Cep0TxDe
正規表現のマッチ結果って、どこかのデフォルト変数に入ってないの?
($match1, $match2) = ($1, $2);
とやる代わりに、
($match1, $match2) = @_;
みたいにやりたい
0669デフォルトの名無しさん
垢版 |
2018/06/15(金) 22:34:53.18ID:+TY+tyj1
リストコンテキストで評価すれば$1とか使わず代入できる
($hours, $minutes, $second) = ($time =~ /(\d\d):(\d\d):(\d\d)/);

ttp://perldoc.jp/docs/perl/5.22.1/perlretut.pod#Extracting32matches
0673デフォルトの名無しさん
垢版 |
2018/06/16(土) 14:40:46.76ID:QsFR7Mzm
どうやっても、($1, $2)に相当するような配列は、自分で作らないと無いんだけど、
そもそもそのやり方は便利なのか? という問題があって

括弧の数を左から数えて、挿入したら間違えずにずらして、というやり方は、
どう考えても避けるべきテクニックなので、わざわざ改良版でそんな方法を
準備したりはしない
0674デフォルトの名無しさん
垢版 |
2018/06/17(日) 02:57:43.02ID:rS3/QTqY
>>669
ちょっと捻ってこうすると配列に入るね。

@t = ($time =~ /(\d\d):(\d\d):(\d\d)/);

で、マッチしなければ @t には何も入らないので if (@t) { マッチした時の処理 } のように書ける。
0675デフォルトの名無しさん
垢版 |
2018/06/17(日) 04:40:03.87ID:rS3/QTqY
if の中に突っ込んじゃえば見た目が元とあまり変わらなくなるな。

if (my @t = $time =~ /(\d\d):(\d\d):(\d\d)/) {
 # このブロックに入った場合は @t[0..2] に値が入っている。
}
0676デフォルトの名無しさん
垢版 |
2018/06/17(日) 09:21:55.81ID:jBtDb+3n
それが常套手段
でも、次の行で使うためだけにテンポラリの変数を命名して、
ということを避ける手段が大抵はあるのに、この場合は無さそうなのが気になる
0679デフォルトの名無しさん
垢版 |
2018/06/17(日) 17:43:24.21ID:jBtDb+3n
もう括弧を数えるのはやめようぜ、ということなのだろう
$1, $2 の代わりの配列があったとしても、数えないといけないのは同じなので、
明示的にラベルを付けて書くのが人間的
0680デフォルトの名無しさん
垢版 |
2018/06/17(日) 21:23:30.12ID:hnLcPBvl
あー。まあそうかな。
0681デフォルトの名無しさん
垢版 |
2018/07/04(水) 17:49:09.45ID:XD9RzW/r
使ってる Perl が 24.1 になったんだけど、どこかで do の仕様変わった?
do('.state')
がエラーになるんだが。
@INC に '.' を加えれば見つけてくれるけど
do('./.state')
と書いとくべきだったよ。
0684デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:16:13.94ID:gFgZc5FG
WCG
0686681
垢版 |
2018/07/05(木) 06:47:48.29ID:xxuahHpW
>>602
ありがとう。perl5241delta だったんだね。
@INC でなく do を探してたからわからなかったよ。
0687681
垢版 |
2018/07/05(木) 06:50:01.14ID:xxuahHpW
ごめん、>>602 でなく >>682 ね。
0688デフォルトの名無しさん
垢版 |
2018/07/06(金) 00:12:17.27ID:sx2dCES6
質問じゃないけど、愚痴なんで聞き流してください。

Perlが好きなんですが、モジュールを使って実践サンプルが多いんが、つくって覚えるだけなんで
すごいさみしいです。

Perlのモジュールプログラムは最高に面白いのに、なんであの本だけなんですかね?

あと、PythonのTKinterも好きだけど、全然出てない。
0689デフォルトの名無しさん
垢版 |
2018/07/06(金) 08:01:08.76ID:MZPdd74D
今回のプロジェクトは大掛かりだったので、
自分で使う用のツールを大量に作った

こういうの好き
0690デフォルトの名無しさん
垢版 |
2018/08/11(土) 13:47:45.26ID:DaBLZ7U5
perlの話でもなんでもないけど、再帰呼び出しの話

あるディレクトリから下の階層構造について、再帰的に調べたい
その時に、そのターゲットのディレクトリからの相対パスで出力させたい
それを再帰呼び出しを使ってやらせようとすると、
最初: ターゲット
次: ターゲット/file1
次の次: ターゲット/file1/file11
次の次の次: ターゲット/file1/file11/file111
が調べる対象で、単純に受け取った相対パスに対して
ターゲット/相対パス/ファイル名
を調べればいい訳ではないし、再帰的に渡す相対パス名も、
相対パス/ファイル名
と決め打ちすると最初だけ例外がある

何かスマートにやる方法は無いもんかなと
いっそフルパスで扱って、後から文字列置換でターゲット部分だけ削るという方法もあるけど
0691デフォルトの名無しさん
垢版 |
2018/08/11(土) 14:01:06.83ID:4zfRZVUI
>>690
台無しなこというと、ディレクトリ以下のファイルを列挙するシェルコマンドとプロセス通信したほうが速い。
0692デフォルトの名無しさん
垢版 |
2018/08/11(土) 14:16:49.10ID:DaBLZ7U5
再帰しなくてよくなるだけで、相対パスの問題は解決しないというか、
より遠のくような
0694デフォルトの名無しさん
垢版 |
2018/08/11(土) 20:53:56.37ID:4zfRZVUI
>>693
まさにFile::Findが遅い。シェルコマンドとプロセス間通信読み取りしたほうがいい。
具体的には以下のようなシェルコマンドをパイプ読み取りするといい。

unixの場合: find [path] -type f
windowsの場合: dir /B /S /A:-D [path]
0695デフォルトの名無しさん
垢版 |
2018/08/11(土) 21:20:05.57ID:DaBLZ7U5
まさにそんな感じになった

dir の結果になんかハングルとかSJISじゃないものが混じってて、
それをそのままbatファイルに吐いて、
batファイルを見ても・・・みたいに化けてても、
実行させるとちゃんと正常に動作する

何作ってたかというと、差分バックアップツール
tarコマンドでできそうで試したけどうまくいかないので作ったった

全ファイルのタイムスタンプ一覧を保存しておいて、
2代目からは差分だけのアーカイブを作る
消えてるファイルを削除する為のbatファイルも一緒に生成
0696デフォルトの名無しさん
垢版 |
2018/08/11(土) 23:09:00.44ID:v5OekXOz
Perlの話から外れるが、おらは差分バックアップにはrsyncに--backupオプションつけて使ってる。
0697デフォルトの名無しさん
垢版 |
2018/08/11(土) 23:21:12.60ID:DaBLZ7U5
windowsにもあればいいんだけど

差分バックアップツールそのものはいろいろあるんだよな
っていうか、windowsそのものにも内蔵されてたような

バックアップのデータをバックアップ対象のシステムと同じとこに置いててもあんまり意味ないので、
単一のアーカイブとしてクラウドかどっかに置きたい
しかも、専用ファイル形式とかでなくて、何もインストールせずに解凍するだけでリストアしたい
とか考えると条件に合うツールがなかなか無くて、
それでいて作るのはそんなに難しくもなさそうなので、自分で作るかと
0699デフォルトの名無しさん
垢版 |
2018/08/12(日) 05:29:09.82ID:5MmmYY5A
Windows でバックアップというと xcopy や robocopy だろうな。
rsync も動くんじゃないか? Cygwin や WSL 上の Ubuntu とかなら確実に動くと思うが。
0700デフォルトの名無しさん
垢版 |
2018/08/12(日) 06:37:38.09ID:I0JtNgg1
rsyncっていうかrdiffかな

rdiffの出力形式がどんなのか知らないけど、
リストア時にもrdiffが必要だというなら避けたい

ただのzipなりtarなりのアーカイブを順に上書き展開するだけでいい状態にしておかないと、
リストアが必要な事態になった時には多分リストア用のツールも無い
0701615
垢版 |
2018/08/12(日) 14:53:20.30ID:em9BUun6
>>697
robocopy
0702デフォルトの名無しさん
垢版 |
2018/08/12(日) 15:08:29.76ID:I0JtNgg1
だからミラーを作りたい訳じゃないって

ミラーも実はあるけど
そっちはもっと頻度の高いバックアップ用で、
物理的に別のドライブなら同時に壊れる確率は低いだろうという考え

そうじゃなくて、PC一式盗まれた/津波で流された/証拠物件として押収された、等の為に、
まるきり新規から昨日の作業環境を復元したい時の為に、
最低限の情報をクラウドに置いてある

それは特定のディレクトリ以下まるごとのアーカイブでいいんだけど、
サイズが巨大になるので2代目以降は差分で済ませたいというのがそもそもの動機
0703615
垢版 |
2018/08/12(日) 16:11:04.49ID:em9BUun6
>>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

で追加/削除/更新されたファイルを検出しリストアップ
とか
0704デフォルトの名無しさん
垢版 |
2018/08/12(日) 16:17:29.70ID:I0JtNgg1
まあ、そんなようなことをタイムスタンプの比較だけでやらせた

リストアップまでは簡単で、差分のアーカイブの作成と、
ファイルが減ってたらリストア側からも減らす仕組みが面倒なんだけど
動かしてみると空のディレクトリが生成されてなかったり
0705デフォルトの名無しさん
垢版 |
2018/08/12(日) 18:42:09.50ID:YGBUsYMx
信頼性の不安とか動作確認のめんどさとか考えたら、rsync/robocopyにしたほうがいいんじゃないの?
どうしても差分だったらrdiff-backupとか?
0706デフォルトの名無しさん
垢版 |
2018/08/12(日) 19:21:31.28ID:I0JtNgg1
ミラーは既にやってるからもう要らない
差分のアーカイブを作ってネットに保存するというのをやりたいだけ

勧めるとしたらtarのバックアップ機能で、まさに差分だけのアーカイブを
作る機能があるんだけど、windowsに移植した人が更新時間とアクセス時間とか
あのへんを失敗してるみたいで、試したのは使えないビルドだった
0707615
垢版 |
2018/08/12(日) 21:24:20.34ID:YC+nt/a3
mtimeに基づいて更新されたファイルだと判定する方法は、
アーカイブから抽出した古い日付のファイルを見落とすので
抜けが起きる可能性があるよ
0709デフォルトの名無しさん
垢版 |
2018/08/12(日) 21:37:14.43ID:I0JtNgg1
makeじゃないんだから
イコールでなければ当然更新対象

でもなー
意図的にタイムスタンプを保持したまま修正する、みたいなことを
あちこちでやってるんだよな
0715デフォルトの名無しさん
垢版 |
2018/08/22(水) 02:53:12.04ID:wb9Zg9xS
        _ ―- ‐- 、
       (r/ -─二:.:.:ヽ   始まったな
       7''´ ̄ヽ-─<:.:.',                  __
.      〈t<  く=r‐、\:く       _ ...-::‐::¬::::: ̄:::::::::::::::::::::::::::::::
      ∠j ` / ,j={_/ヽヽr'       >:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
       っ Y _/ ヽ了       /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.       し イ --─¬       /::::::/:/|:::/::∧:::∧:::::::::::::::::::::::::::::::::::
         f: :_: : :_:_:_└ 、     |/f|/|/ .|/ |/ ∨ ヽ|\:::::::::::::::::::::::::
        /-ー/: : : : : : :\      {            ヘ:::::::::::::::::::::
       /7: : : :r: : : : : : : : : }     ',  .j /     }   .}::::::::::::::::::::
      /: : : : : :.|: :j: : : :\: : j      } /_       ミ   ヘ::::::::::::::::::
     /: : : : : : : j: ヘ、: : : : \|    /く<l´::<ニ二 ̄`>   ミ:::::::::/
    ./: : : : : : : \::::ヘ: : : : : : :ヽ    {::ア{:::::::}厂¨,`_______j:::::://
    {: : : : : : : : : : ヘ:::ヘ: : : : : : :',    V ヘ::::ノ` ̄  ̄ ̄ ̄ ̄ .{::::|ヽ
    ',: : : : : : : : : : : :\ヘ: : : : : :ヘ.   /  ヘ¨       //:}::::|/
     ',: : : : : : : :::::::::::::::::::〉: :_:_.r--―く   >ヽ      /   _ノ::::{ _/
     '; : : : :.::::::::::::::::::::::r</ :.:..   `ー¬\__        /::::/
     〈: : : : :ー---‐‐r―'´  :.:.:.  ヘ: .  ヽ . . }ー、    ./::::<
                ああ・・・       ',: . .|: : 〉  /:::::::/
0716デフォルトの名無しさん
垢版 |
2018/09/05(水) 22:22:13.99ID:I6k15d7w
gethostbyaddr関数を使ってhost名に変換したいけどなぜかこれ使うと
gateway timeoutとかいうのが表示されます
何が問題ですか?
0717デフォルトの名無しさん
垢版 |
2018/09/06(木) 02:07:27.72ID:f49/P0Og
>>716
use Socket で getnameinfo 使っても同じ?
0722デフォルトの名無しさん
垢版 |
2018/09/16(日) 23:26:35.23ID:MQAfX2Z/
タスクをkillする別のスクリプトと組み合わせて使う予定で、
windowsのperlのforkはkillと相性が悪いから
0724デフォルトの名無しさん
垢版 |
2018/09/17(月) 02:58:47.55ID:voWgbO/q
>>720
my $pid1 = system(1, "perl prog1.pl");
my $pid2 = system(2, "perl prog2.pl");

のようにして起動して後でこの $pid1, $pid2 に対して kill するのは?
0725デフォルトの名無しさん
垢版 |
2018/09/17(月) 03:00:07.85ID:voWgbO/q
ごめん。2行目間違えた。こうね。system() の第一引数はどちらも1。

my $pid2 = system(1, "perl prog2.pl");
0727デフォルトの名無しさん
垢版 |
2018/09/17(月) 12:38:21.06ID:lUfJPVVO
>>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();
0728デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:28:41.27ID:voWgbO/q
あれ?規制されたか?
ちょっと書き込みテスト。
0729デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:29:55.17ID:voWgbO/q
あれ?書けたな。
じゃあ書き込み内容か。じゃちょっとNGワード探るスレに行って来よう。
0730デフォルトの名無しさん
垢版 |
2018/09/17(月) 20:36:45.38ID:voWgbO/q
規制理由がわかった。「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違っても大丈夫なんじゃないかな?
0733デフォルトの名無しさん
垢版 |
2018/09/17(月) 23:33:01.82ID:voWgbO/q
>>732
perldoc perlport で見るとこれはもしかすると Win32 だけかも知れない。
「(Win32)」ってくっついてるので。
0734デフォルトの名無しさん
垢版 |
2018/09/19(水) 08:37:16.87ID:wlIidQxJ
Windowsの「プログラムと検索」で「cmd.exe /C del c:\*.*」
を検索すると何がヒットする?

…と聞かれて、やってしまう人を保護しているのかな?
0735デフォルトの名無しさん
垢版 |
2018/09/19(水) 13:40:02.89ID:gcT5tzZy
>>734
del に /S 忘れてるぞ。
0737デフォルトの名無しさん
垢版 |
2018/09/21(金) 00:00:27.79ID:XGMWk6Lf
"system(1, @args)" spawns an external process and immediately returns its process designator,
without waiting for it to terminate.

まさにそういうのが用意されてるんだな
知らんがな
0738 ◆QZaw55cn4c
垢版 |
2018/09/21(金) 01:30:00.65ID:JP8I8TZy
>>737
> spawns
dos 時代は spawn と fork は使い分けられていたのですけど、最近はそうではないようですね…
0739デフォルトの名無しさん
垢版 |
2018/09/21(金) 03:06:25.03ID:m7KC0L1Z
ちんぴょろすぽーん
0740デフォルトの名無しさん
垢版 |
2018/09/21(金) 09:00:53.42ID:m8DL5ZJ4
>>730
Ruby のsystem 関数では、引数の個数が1つで、
記号など、シェルのメタ文字を含む場合は、シェル経由で実行される

それ以外は、Rubyインタープリタから、直接実行される
0741デフォルトの名無しさん
垢版 |
2018/09/21(金) 09:28:40.03ID:7bTZc31z
>>740
それ Perl と同じ。

system(1, ...) 形式は Win32 用。
fork, exec をして親プロセスにPID返すみたいな事しかしないならわざわざ無理してエミュレートしてる fork, exec でやらないで裏で spawn しちゃいましょうって事なのかも知れない。
0743デフォルトの名無しさん
垢版 |
2018/10/18(木) 00:25:47.59ID:/P5hGycw
Ruby では、rt は読み込みテキスト、
外部エンコーディングはsjis、内部エンコーディングはutf-8

s = ""

f = File.open("sjis.txt", mode = "rt:sjis:utf-8"){ |f|
s = f.read # 全て読み込む
}

puts s
0744デフォルトの名無しさん
垢版 |
2018/10/18(木) 03:30:55.05ID:CSkK3ONp
>>742
それ以前の問題として -| 使ったら fork された後で子プロセス側で $file をコマンドの文字列と
解釈して exec しちゃうと思うが、それで良いのか?

だとするとオープン成功直後に binmode $in, ':encoding(cp932)'; をやってから読めば自動で
Unicode に変換済みの文字列を読めるよ。
0746デフォルトの名無しさん
垢版 |
2018/11/08(木) 02:01:28.04ID:PVk/9YBB
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;
};
0747デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:15:33.75ID:iIDHqnJC
$data1 = "100歳";
$data2 = "10000ドル";
これらを値と単位に分けるのはどうすればいいのですか?
0749デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:34:11.14ID:iIDHqnJC
ありがとう^^
0751デフォルトの名無しさん
垢版 |
2018/12/11(火) 11:33:05.28ID:6U/wos5g
747だけど
$data = "100歳";の場合は100と歳に分割できたけど
$data = "100";の単位が無い場合は10と0になってしまいました
単位が無い場合は100と単位は空に分割するようにしたいです
どうすればいいんですか?
0758615
垢版 |
2018/12/15(土) 16:39:19.35ID:iCCNyy8F


for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /((?:\d*+)?)((?:[^\d]*)?)/;
print "$d : $o\n";
}

$ perl 758.pl
100 : 歳
10000 : ドル
100 :
: 歳
0759615
垢版 |
2018/12/15(土) 16:43:35.77ID:iCCNyy8F
>>758
いやこれで十分だった

for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /(\d*+)([^\d]*)/;
print "$d : $o\n";
}

$ perl 759.pl
100 : 歳
10000 : ドル
100 :
: 歳
0761615
垢版 |
2018/12/15(土) 17:04:09.15ID:iCCNyy8F
>>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記法っぽい書き方」はできる??
0762615
垢版 |
2018/12/15(土) 17:07:47.65ID:iCCNyy8F
>>760
そだねー
0764デフォルトの名無しさん
垢版 |
2018/12/16(日) 10:02:20.90ID:wu7F1Zb/
pythonの2と3が未だに入り乱れていて両方入れとくしかない状態が続いてる
パスが通ってるのは2で、3はパス込みで起動
0766デフォルトの名無しさん
垢版 |
2018/12/16(日) 12:34:40.06ID:wu7F1Zb/
perlの変数名($無しの部分)ってリファレンスなんだよな

$name がリファレンスの時、@$name でデリファレンスされることと、
@name と書くことは同じ意味になる

$#name と書きたい時にも敷衍できて、nameの代わりに{$name}と書いて、
$#{$name} と書くと思った通りの意味になる
0767デフォルトの名無しさん
垢版 |
2018/12/16(日) 13:33:32.09ID:sRmrp7hv
「Perl4 を使っている」というのは言い過ぎだったかな。
eval を使えばシンボリックリンクを実現できるけど
${$key} という表記はできなかったからね。
このカテゴリマスターの方々は単に Perl を知らないんだろう。
知らないのはいいが、なぜ回答するのか。
0771デフォルトの名無しさん
垢版 |
2018/12/17(月) 00:09:00.22ID:iB9eUrL3
あ、デリファレンス記述を知らんヤツ発見、て意味だった?
勘違いした。w
0772デフォルトの名無しさん
垢版 |
2018/12/17(月) 07:49:28.02ID:WGHllUkv
>>766
> $name がリファレンスの時、@$name でデリファレンスされることと、
> @name と書くことは同じ意味になる

ん? $name と @name は別物じゃね?
@s = qw/a b c/;
$x = \@s;
print join ",", @x; # ""
print join ",", @$x; # "a,b,c"
0773デフォルトの名無しさん
垢版 |
2018/12/17(月) 09:07:21.92ID:GlvD8kJn
よくわからんけど気になるのだけど
結局リファレンスをデリファレンスして値つっこんでるだけ、でいいんだよね?
回答者が勘違いしてる変数名の変数指定ってどうやるんだっけか
0775デフォルトの名無しさん
垢版 |
2018/12/17(月) 12:59:58.19ID:GlvD8kJn
>>774
ありがとう
リファレンスで間接的?に定義された場合のみ暗黙的にアクセス可能になるのか
変な挙動だなぁ

昨日一応手元でワンライナー書いてから質問したんだけど
変数名を別に定義済みの場合は暗黙的解釈は成されないんだね
変だー
0776770
垢版 |
2018/12/17(月) 17:36:00.20ID:fClvoBXn
>>771
ごめん。
「そこはまず、ハードリファレンスでしょ。Perl4 の時代に生きてるの?」
という意味です。自分でも不適切な表現だったと思う。
一応彼らの名誉のために言っとくが、回答に明確な間違いは無いと思う。
でも「${$key} の $key は何?」と聞かれて「変数名」と答えるのは
現代の Perl にそぐわないと思うの。
でももしかしたら、説明しても理解してもらえなさそうと思ったのだろうか。
0777デフォルトの名無しさん
垢版 |
2018/12/17(月) 19:18:45.78ID:iB9eUrL3
質問者がなんにも知らなそうだから、「リファレンス」をあえて避けたんやろ。
0778デフォルトの名無しさん
垢版 |
2018/12/17(月) 19:20:00.23ID:da/cFEJ/
>>772
name をリファレンスだと思う
(思うだけ。そんな文法ではない)

そうすると、そのリファレンスを$でデリファレンスしたものが$name
@でデリファレンスしたものが@name

$nameがリファレンスの場合に$でデリファレンスすると$$name なのは当たり前として、
$$$, $$$$ とどんどんデリファレンスしていける逆方向を辿ると、
$name もデリファレンスしたものだと見える
0779デフォルトの名無しさん
垢版 |
2018/12/18(火) 09:06:48.26ID:eR20sfLy
>>778
うーん
言いたいことはわからんでもないけど
Perlはそもそもスカラと配列とハッシュで名前空間が独立だからな…
0780デフォルトの名無しさん
垢版 |
2018/12/27(木) 15:34:57.10ID:6u25HEJq
入力文字に$記号を含むパターンマッチについての質問

<input type="text" name="word">という入力フォームで$を入力して送信する
$form_data{'word'}はそれを受け取ったデータでこの場合$記号が格納されているとする

my $data = "aaa$bbb";

if($data =~ /$form_data{'word'}/){

print "ドル記号が含まれている";

}

とするとドル記号が含まれていると表示されるけど
$data="aaabbb";としてもドル記号が含まれていると表示されてしまいます
どうしたらうまくパターンマッチできるんですか?
0781デフォルトの名無しさん
垢版 |
2018/12/27(木) 16:48:29.52ID:rm0epPGS
quotemeta 使えば?
0786デフォルトの名無しさん
垢版 |
2018/12/28(金) 18:58:04.24ID:Kla9dPfb
ドルを含むかなら$data =~ /\$/ か$form_data{'word'} =~ /\$/ならわかるけど、
なぜ$dataと$form_data{'word'}をパターンマッチさせているのかがわからない。
0787デフォルトの名無しさん
垢版 |
2018/12/28(金) 19:19:12.35ID:PEXz027h
入力文字列を正規表現ではなくただの文字列として扱うならこっちの方が速い
if (index($data, $form_data{'word'}) >= 0) {
0788デフォルトの名無しさん
垢版 |
2018/12/29(土) 10:19:08.15ID:UbMSpY+5
どのように書いたら配列の1,2,3を、それぞれ表示できるでしょうか?お願いします
sub test{
return \(1,2,3);
}
print test(); # SCALAR(0x169bc48)SCALAR(0x169bca8)SCALAR(0x169bc90)
print ${test()}; # 3
0790デフォルトの名無しさん
垢版 |
2018/12/29(土) 11:13:23.47ID:Q3TbjvxP
#これが基本
@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";
0791デフォルトの名無しさん
垢版 |
2018/12/29(土) 11:19:02.45ID:UbMSpY+5
>>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を見ました。
0793デフォルトの名無しさん
垢版 |
2018/12/29(土) 11:40:12.74ID:JLECNNE+
>>791
リストをスカラー評価すると、そのリストの要素数になる。
こういうときにまぎらわしいので、(10,20,30)とかオススメ。
0794デフォルトの名無しさん
垢版 |
2018/12/29(土) 11:45:55.56ID:UbMSpY+5
いまテストしてました。
>>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を表示する方法がわかりません。
よろしくお願いします。
0795デフォルトの名無しさん
垢版 |
2018/12/29(土) 11:56:22.23ID:JY4FTrNS
リファレンスが何を表しているのか理解しよう

$var = 11;
$ref = \$var;

say $var
say \$var;
say $ref;
say $$ref;
say ${$ref};
0796デフォルトの名無しさん
垢版 |
2018/12/29(土) 12:30:51.49ID:UbMSpY+5
下記の 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
0797デフォルトの名無しさん
垢版 |
2018/12/29(土) 12:33:10.04ID:UbMSpY+5
上が動くのに、下が動きません。

@b=test2();
print ${$b[0]}; # 11

print ${test2()[0]}; #動きません
0799デフォルトの名無しさん
垢版 |
2018/12/29(土) 13:09:45.93ID:UbMSpY+5
>>798
ありがとうございます。やっと書き方がわかりました

もう1つ質問がありますので書きます。

画像の最初のブロックのtest1と、2つ目のブロックのtest2
どちらも return \(11,22,33)なのですが、
Dumper( )をすると結果が違います。何故でしょうか?
ブロックスコープの扱いを間違えてるとか、根本的な間違えはあるでしょうか?

https://i.imgur.com/HpjnvGf.png
0800デフォルトの名無しさん
垢版 |
2018/12/29(土) 13:27:10.67ID:mEoLSW4X
>>794のDumperの結果見ればわかるけど
\(11,22,33);

(\11,\22,\33);
と書くのと同じで配列のリファレンスではなく中身をリファレンス化して作った配列
上でぼけてて\[1,2,3]なんて書いちゃったけど…[11,22,33]が配列のリファレンス
0801デフォルトの名無しさん
垢版 |
2018/12/29(土) 13:38:48.59ID:UbMSpY+5
イメージはわかりました。先ほどのtest2( )を更に( )で囲んでからの[0]は気づきませんでしたが。

 return ポインタのポインタ
 ↓
 (ポインタ、ポインタ、ポインタ) → 実体11,22,33
0806デフォルトの名無しさん
垢版 |
2018/12/30(日) 08:38:58.47ID:d/kczs//
>>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番めの要素をデリファレンス)
0807デフォルトの名無しさん
垢版 |
2018/12/30(日) 08:50:22.81ID:d/kczs//
いい記事があった

「リストと配列(Array)はPerlでは別物」
ttps://togetter.com/li/263729

「モダンなPerlを「読む」上で覚えておくとよい構文 第2回「リストを理解すれば配列とハッシュをより活用できる」」
ttp://www.songmu.jp/riji/archives/2010/09/perl_2_1.html
0808デフォルトの名無しさん
垢版 |
2018/12/30(日) 08:53:03.67ID:x1KM9vdn
列挙してまとめてリファレンスなんか取ることあるか?

数が多いなら普通はループにすることを考える
3つくらいなら普通に書けばいい
何かの関数の引数にリファレンスでいっぱい渡すくらいしか思いつかないけど、
そんなインターフェースがそもそも間違ってるし可読性も下がる

そんな書き方は無いものと思って使わないのが吉
0809デフォルトの名無しさん
垢版 |
2018/12/30(日) 08:53:43.65ID:/wKH6dhf
リスト・・・複数の値
配列・・・複数の値が入ってるオブジェクト

ようするにこんだけだろ?
0810デフォルトの名無しさん
垢版 |
2018/12/30(日) 08:56:13.19ID:/wKH6dhf
Perlにとってオブジェクト指向は
頑張ってオブジェクトに見えるものを作り出すもので
オプショナルな存在だから
リストと配列の違いをシンプルに説明できないんだろうな
0811デフォルトの名無しさん
垢版 |
2018/12/30(日) 09:00:51.60ID:x1KM9vdn
オブジェクト指向だと言うにはカプセル化は必須で、
メンバ変数をダイレクトにいじるとかやっちゃ駄目な筈なんだけど、
その方が便利だから普通にやってる

$obj->setval($val);
$obj->{val} = $val;

一緒やん
0812デフォルトの名無しさん
垢版 |
2018/12/30(日) 09:06:23.51ID:/wKH6dhf
> オブジェクト指向だと言うにはカプセル化は必須で、
必須じゃないよ。てか必須なものなんて無い

オブジェクト指向言語というのは
オブジェクト指向を行うために用意された文法がある。
条件はこれだけ
0813デフォルトの名無しさん
垢版 |
2018/12/30(日) 10:57:52.01ID:d/kczs//
アンダースコアから始まるメンバ変数はプライベートなので外側から触ってはいけません

よしカプセル化できたな!!!
0815615
垢版 |
2018/12/31(月) 00:31:18.84ID:Hr+PmI8P
Perlのオブジェクト指向??は記述がちょっと変体言語風な見た目だけれど
Cのstructを拡張したような型クラス+継承に基づく言語よりも
propertyベースOOP+mixinのような柔軟な表現が出来て
良いんじないかと俺は思う
0816デフォルトの名無しさん
垢版 |
2018/12/31(月) 00:44:01.46ID:LUt0Quvy
gotoは柔軟だから優れていると言っているようなもので、
何でも出来る = 優れている ・・・ これは間違いなんだよ

アセンブラという何でも出来る言語から進化し、
特定の用途の「パターン」を見つけて抜き出し、
そのパターンを専用の文法にしてきた。

特定の用途専用(=柔軟性がない)の文法があることで
書き方が統一できるし、何がしたいのかという意図を
他人に伝えることが出来る
0817615
垢版 |
2018/12/31(月) 01:09:11.59ID:Hr+PmI8P
制限の方向性が弊害を持っているのに
広く普及しちゃうと悲惨なことになる
0819615
垢版 |
2018/12/31(月) 01:12:14.36ID:Hr+PmI8P
>>818
あんまし使われていない
0820615
垢版 |
2018/12/31(月) 01:13:48.73ID:Hr+PmI8P
JavaもCOBOLみたいな立ち位置になるだろうし
0821デフォルトの名無しさん
垢版 |
2018/12/31(月) 01:16:04.10ID:LUt0Quvy
>>819
そうなるやろ?

柔軟性が表現ができてしまうから、
Mooseとかいうのができて、一方では使うが
使わない人もいる、バラバラ

自分では使ってないつもりでもライブラリの中で
使われていてメモリも無駄に消費する

だめなんですよ。柔軟だけど機能が足りないというのは。
0823615
垢版 |
2018/12/31(月) 10:01:45.42ID:2dwmQiqr
Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

Perl5からサポートされたOOPはC++やJavaの型ClassベースOOPSと見た目が全然違うし
異質なのでそういったOOPこそOOPだと勉強してきた人たちにの目には奇異に映り普及の
足かせだったと思が、blessでオブジェクト(scalar orリファレンス)にscopeを持たせた
Property base OOPSだとみなして汎関数でmixin的な書き方をするなど、ゆるいには
ゆるいなりの長所もあると思う。これはPythonのOOPSのゆるさとも通じるところがあると思う。

性能に関してはC++のような最下層でも効率的なものではないし、Property baseという
特徴から見ても、中間レイヤ・グレインで使うのに適した仕組みだと考えていますが
0824デフォルトの名無しさん
垢版 |
2018/12/31(月) 10:15:50.03ID:0rbvsgzk
オブジェクト指向は結果オブジェクト指向なだけでやりたいことはオブジェクト指向じゃない

同じこと何度も書きたくないからライブラリ化したいだけで、
一旦ライブラリにしたら極力中身のことを忘れていいようにしたいだけ

どこまで忘れていいかは実装のセンスに依るので、言語仕様は関係ない
0825デフォルトの名無しさん
垢版 |
2018/12/31(月) 10:44:08.74ID:LUt0Quvy
> Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

PerlにOOPの機能が不足してるからそうなるわけだよ
0827デフォルトの名無しさん
垢版 |
2018/12/31(月) 12:37:43.61ID:C6w6M91j
>>826
己れの方こそ嘘つきだな
「証明もされてないことを言った」つまり真実か嘘か判定不能な段階なのに「嘘つき」のレッテル貼りとか

TMTOWTDI はPerlの基本方針でありPerlをPerlたらしめている特徴であり
しばしばPerlを好み愛用し続ける者にとってはその大きい理由でもある
ゆえに「TMTOWTDI は正義」である
0830615
垢版 |
2018/12/31(月) 21:31:35.63ID:4xTPjQJE
型クラス+継承を使ったオブジェクト指向は
モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので
オレはなるべく使わないようにしている
0831デフォルトの名無しさん
垢版 |
2018/12/31(月) 22:05:38.48ID:0rbvsgzk
クラス設計して継承して、みたいなのは人間の能力を越えてる

継承も抽象度を高めたいとかそんな大層な目的じゃなくて、
やっぱり同じこと何度も書きたくないからやってるだけで、
よっぽど汎用性の高い概念なら継承でうまくいくかもしれんけど、
そんなんは最初から内蔵されてるのが普通
0832デフォルトの名無しさん
垢版 |
2018/12/31(月) 22:42:10.76ID:LUt0Quvy
>>830
> モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので

知ってる単語を並べただけなのは恥ずかしいですよw
0833デフォルトの名無しさん
垢版 |
2018/12/31(月) 22:42:33.80ID:LUt0Quvy
× クラス設計して継承して、みたいなのは人間の能力を越えてる
○ クラス設計して継承して、みたいなのは>>831の能力を越えてる
0834615
垢版 |
2018/12/31(月) 23:03:12.86ID:6bMDAT8f
>>833
なぜそんなに人に絡む。
嫌なことでもあったのか、
あるいは単に嫌な奴かなだけか…
0836デフォルトの名無しさん
垢版 |
2018/12/31(月) 23:09:17.73ID:LUt0Quvy
>>834
お前が自分にできないことは、人間全部できないんだとか
言ってるから、お前ができないだけだよって訂正してるだけだが?
0837615
垢版 |
2018/12/31(月) 23:11:32.50ID:6bMDAT8f
>>836
俺は何が出来ないとか一言も書いてないが。
何かと混乱してるのか?知らんけど
0838615
垢版 |
2018/12/31(月) 23:16:34.16ID:6bMDAT8f
>829 名前:デフォルトの名無しさん[sage] 投稿日:2018/12/31(月) 17:58:26.87 ID:LUt0Quvy
>>828
>オブジェクト指向を行うための標準的な方法

それをperlに求めるのは筋違いだろ。

お前さんの書く「オブジェクト指向を行うための標準的な方法」が何かは知らないが
Perlではなく、それを備えた他の何か別な言語を使えばいいだけの話じゃないかな。
0839デフォルトの名無しさん
垢版 |
2019/01/01(火) 00:42:39.69ID:WFGHAbKk
>>837
> 俺は何が出来ないとか一言も書いてないが。
できないなら、できないと認めて、書けって言ってるんだよ。
お前は他の人ができるクラス設計をできないんだから
0840デフォルトの名無しさん
垢版 |
2019/01/01(火) 00:44:50.00ID:WFGHAbKk
>>838

>>825で「PerlにOOPの機能が不足してるからそうなるわけだよ」って言ったら
>>828で具体的に不足してる機能は?って聞かれたから
それに答えただけですが?

PerlにOOPの機能で不足しているものを聞かれたんだから
それに答えるのは普通でしょう。
0841デフォルトの名無しさん
垢版 |
2019/01/01(火) 01:07:42.37ID:dsnk2i9g
>>829
「標準的」とは?

もしクラスベースOOPとしての話なら、そもそもPerl5に求めるのが大間違い。
Perl5にはPerl5のやりかたがあるんだから。
0842デフォルトの名無しさん
垢版 |
2019/01/01(火) 01:31:46.17ID:WFGHAbKk
そのやり方が不足しているために、いろんなやり方ができてしまって
混乱してるって話をず〜っとしてるんだが
0844デフォルトの名無しさん
垢版 |
2019/01/01(火) 03:40:45.46ID:qrGSiep2
それがPerl。
いろんなやりかたがあってもいい。

イヤならPythonでもRubyでもどうぞ。
0845デフォルトの名無しさん
垢版 |
2019/01/01(火) 04:42:46.75ID:WFGHAbKk
>>844
嫌とは言ってないよ

Perlはオブジェクト指向をやるときに標準なやり方がないので
人やライブラリによって書き方が異なる
最小限の機能しか持っていないため、書き方が煩雑になる。
それを解決するライブラリもあるがデファクトスタンダードと呼ばれるものはない
そのためオブジェクト指向をやるとソースコードが混沌とした状態になる
これはデメリットではないと主張するがその根拠はない

ということでしょ?
0846615
垢版 |
2019/01/01(火) 06:56:08.14ID:wEmHEx+3
Javaのオブジェクト指向じゃダメだからいろんなオブジェクト指向の言語が乱立しているのに
0847615
垢版 |
2019/01/01(火) 07:05:33.16ID:wEmHEx+3
Perlは記述に拡張性があるから、
幾つかのオブジェクト指向の仕組みを拡張しようという流れが出たのは
自然なことで、宿命みたいなものだよ
0848デフォルトの名無しさん
垢版 |
2019/01/01(火) 09:32:39.73ID:qcGL6dxE
うん。だからいろんなやり方が出て混沌状態になった。
駄目とは言ってないよ。
混沌状態になるといってるだけ
0849デフォルトの名無しさん
垢版 |
2019/01/01(火) 16:14:48.46ID:O6bdw0M8
>>821
> だめなんですよ。柔軟だけど機能が足りないというのは。
>>848
> 駄目とは言ってないよ。
> 混沌状態になるといってるだけ
おいおい。
0850615
垢版 |
2019/01/01(火) 18:05:00.64ID:XbYa03OK
混沌は別に悪いことばかりではないし、
まぁ趣旨換えしたようだからそっとしておきましょう
0851788
垢版 |
2019/01/07(月) 11:29:47.54ID:44u2lGi3
また教えてください。おねがいします。
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) = @_;
0852デフォルトの名無しさん
垢版 |
2019/01/07(月) 13:11:23.07ID:44u2lGi3
なんとか1を出来ないものかとやってみても、
@tbl=@{$p};だと実体のコピーだし、\@tbl=\@{$p};これじゃあエラーだし、
2も同じか・・・きっと、ダメなんですね
0853デフォルトの名無しさん
垢版 |
2019/01/07(月) 17:42:31.40ID:sY/RJhpW
my (@tbl, $data) = @_;
は全部 @tbl に入っちゃうから…
あと、パッケージ変数を使えば
my @a0 = qw( a b c );
our @a1;
*a1 = \@a0;
みたいなこともできるけど。
my 変数で同じことをするモジュールもあったような気が…
0855デフォルトの名無しさん
垢版 |
2019/01/07(月) 19:02:01.15ID:fnTlHl64
型グロブが使えるとは思うが素直に参照渡しした方が分かりやすくてよいと思う。
0857デフォルトの名無しさん
垢版 |
2019/01/07(月) 22:54:34.52ID:+HHyWqnO
そもそもコピーじゃなくて別名が欲しいケースがないしなあ
ttps://metacpan.org/pod/Data::Alias

>>856
これ?
ttp://perldoc.jp/docs/perl/5.24.0/perl5240delta.pod#The32autoderef32feature32has32been32removed
0859デフォルトの名無しさん
垢版 |
2019/01/08(火) 13:40:47.95ID:4YYD5GZN
そもそもperlにポインタという用語はないのでポインタポインタと言われても何を言いたいのかわからない
「リファレンス」と「ポインタ」と両方使ってるからリファレンスのことをポインタと呼んでるのでもないようだし
0860856
垢版 |
2019/01/08(火) 20:29:21.03ID:2ynCXf4r
>>857
おっと、削除されたんか。
たしかに今さらまぎらわしい機能だったから、残念でもないし当然。
0861 ◆QZaw55cn4c
垢版 |
2019/01/08(火) 20:52:29.76ID:wX3Q4heR
ここはperl6のスレですか?
0862デフォルトの名無しさん
垢版 |
2019/01/09(水) 12:59:04.70ID:xuLfg6C4
>>861
いや。決まってないけどだいたい5。
0863デフォルトの名無しさん
垢版 |
2019/01/09(水) 14:07:02.03ID:Z1NH8E36
6やるなら流石にぱいそんとかるびーに行くよね
ディストリビューションのデフォルトが6になったら別だけど
0865デフォルトの名無しさん
垢版 |
2019/01/09(水) 18:51:53.85ID:JvHk+PyX
いろんな現場を渡り歩くからなあ
perlは無かったことが無いけど、今のとこにpythonは無い
rubyは何故かある
0867デフォルトの名無しさん
垢版 |
2019/01/13(日) 23:01:19.72ID:V4Yo7Lhe
スレタイのモダンってなに?
0871デフォルトの名無しさん
垢版 |
2019/01/15(火) 08:57:17.72ID:G1ZK+rbt
この↓本スレが去年の2月に終わったけれど、誰も新スレを立てられなかったみたいなんだよ。

Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/

そこで、「モダン推奨」な人が立てたこの隔離スレが本スレの代わりになっている。
本当に誰か「モダン推奨」が無い新スレ立てられない?
0872デフォルトの名無しさん
垢版 |
2019/01/15(火) 10:20:42.87ID:weoqLEpo
今となってはPerl自体レガシーだし、
そのモダンの人とやらもいないんじゃね?
確かに一時期「これからはモダンが〜」みたいなのあったなぁ
0876デフォルトの名無しさん
垢版 |
2019/11/02(土) 13:46:26.21ID:smHgTNTv
package文で宣言するパッケージ名の階層と、
当該パッケージの置き場所のディレクトリの階層って
一致させねばいけないもの?それとも不一致でも無問題?
0877デフォルトの名無しさん
垢版 |
2019/11/02(土) 14:00:04.49ID:smHgTNTv
標準モジュールのソースコードを見ると、ディレクトリの階層とパッケージの宣言が一致している
(例えば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

どういうこっちゃ…
0878デフォルトの名無しさん
垢版 |
2019/11/02(土) 16:01:49.62ID:i/sKHoLN
慣習として一致させるものだけど、不一致にするような正当な理由があればそうしてもいい
0880デフォルトの名無しさん
垢版 |
2019/11/23(土) 11:23:39.89ID:r11kVh6u
複数行からなるJSONファイルの読み込みって普通どうやるの?
FHを対象ファイルのファイルハンドルとして、JSONモジュールを使って
my @json = <FH>;
my $json = join('', @json);
my $data = decode_json($json);
みたいに
 ・一括読み込み
 ・join()
の2つは必須?
これだと機械生成されたJSONファイルがたまたま数ギガバイトあったりしたらどうするんじゃ…
というわけでエラーケースも考えたら1行づつ読み込みたいのですが、
0881デフォルトの名無しさん
垢版 |
2019/11/23(土) 11:26:07.48ID:r11kVh6u
自己解決しますたスマン、
ドキュメントを読んだら
 INCREMENTAL PARSING
というのセクションがあったわ;
0882デフォルトの名無しさん
垢版 |
2019/12/10(火) 20:50:10.71ID:1a1TW34R
pushする時に重複してたらpushしない拡張pushを作りたいとする
配列のリファレンスと値を渡す

普通に作って動くんだけど、渡したリファレンスがundefだった時は動かない
pushならundefでも動くのに

これを何とかundefも受け付けるようにできないもんか
普通に考えるとできないんだけど
0883デフォルトの名無しさん
垢版 |
2019/12/11(水) 10:26:34.70ID:dG8VWZ74
>>882
undefの時にどのように動いて欲しいのか?
0884デフォルトの名無しさん
垢版 |
2019/12/11(水) 20:22:08.85ID:xy3VmN4D
自作関数の中でリファレンスに[]宣言すればいいだけじゃねーの
# 俺と同じ発想なら、だけど。

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 ] ;
0887デフォルトの名無しさん
垢版 |
2019/12/12(木) 21:46:01.56ID:8fLoSBsV
my @tmp = map { hogehoge } ( (ref $_[0]) ? @$_[0] : () );

こんなんで動かないかね?
0888デフォルトの名無しさん
垢版 |
2019/12/12(木) 21:56:12.99ID:3Xh4/du7
読みにくく書いても得しないからなあ

$_ を使わずに実現する方法があればそうしたい
0889デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:06:26.14ID:V4YdibXT
>普通は危ないから左辺値にしないよな
理解してりゃ、危なくもなんともないと思うが、、、
0890デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:25:24.61ID:V4YdibXT
>>888
だったらコンセプト変えて普通にプロトタイプ使え
sub pushm (¥@@){
my $arr = shift ;
my %h ;
push @{$arr}, grep { ! $h{$_} ++ } @{$arr} , @_ ;
}
my $arr ;
pushm @{$arr}, 1, 2, 3, 4 ;

コードの変更は殆どいらなくて、且つ自作変数の外側で、
(暗黙の)初期化をせざるを得ないから、$_[0] への初期化は
しなくてすむ。
0892デフォルトの名無しさん
垢版 |
2019/12/13(金) 00:04:09.33ID:Oz2tw7ml
$_と@_の区別すら付いてない奴に教える必要なんかねえよ
0893デフォルトの名無しさん
垢版 |
2019/12/13(金) 18:59:29.78ID:xux/XkmF
こういう時にプロトタイプが役立つのか

sub func(\@@);
とプロトタイプが書いてあって、perlは使えるけどプロトタイプ知らない人に、
この関数呼び出してみろって言ったら、10人が10人
func(\@array1, @array2);
って書くと思うな
0896デフォルトの名無しさん
垢版 |
2019/12/14(土) 00:01:01.77ID:C/H6m2n1
配列をコンマで区切って並べると、多次元配列にならずに配列が繋がるだけ
というシンプルな仕様が仇になってるんだよな

どうあがいても、引数に配列が現れると、その後の引数と合体してしまうので、
リファレンスで渡すしか無い
だからって、push(\@array, $var) みたい使い方を強いるのは不格好過ぎる

ということで、呼び出し側では実引数を渡しているように見えて、
裏ではリファレンスで受け取るというねじれが生じていて、
プロトタイプでそのねじれを吸収している
0897デフォルトの名無しさん
垢版 |
2019/12/14(土) 08:31:07.01ID:tdigeeoh
>>893
10人中一人は
my $arr ; my @arr ;
&func($arr, @arr);

って書いて、>>882みたいに「undefだったら動かない」って
首をひねるハメになる。
0898デフォルトの名無しさん
垢版 |
2019/12/14(土) 08:37:29.90ID:tdigeeoh
通常は、プロトタイプ使ったサブルーチンはモジュールの中に隔離して
perldocだけ読ませて使わせるから、>>893の問題は生じないんだけどなw
個人のコードでどう扱うかは知らん。

代表的なプロトタイプのコードの例↓(List::MoreUtilsの古いバージョン)
https://fastapi.metacpan.org/source/ADAMK/List-MoreUtils-0.33/lib/List/MoreUtils.pm
0900デフォルトの名無しさん
垢版 |
2019/12/14(土) 09:22:43.70ID:tdigeeoh
>>899
ん?
「&つけて呼び出すと、プロトタイプを無視する」って言う
古くからある悪名高い挙動が変更になったのか?
すまんが俺は古いバージョンでレスってたわ。

それだったら喜ばしい事だね。
0901デフォルトの名無しさん
垢版 |
2019/12/14(土) 10:07:00.59ID:tdigeeoh
暇だったから、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
0902デフォルトの名無しさん
垢版 |
2019/12/14(土) 11:03:07.43ID:6h9Np3wz
ふつうに関数を呼び出すのにわざわざ&をつけるようなヤツは、10人に1人もいねえよ。w
0905デフォルトの名無しさん
垢版 |
2019/12/15(日) 00:13:17.48ID:uHh4aFtn
&つけるのって少数派なのか
俺絶対つけてるけど
ある現場で「え、今そんなのつけませんよ…」ってちょっと引いてすらいる感じで言われたことある
まあもうその現場もrailsになったはずだけど
0907デフォルトの名無しさん
垢版 |
2019/12/15(日) 01:55:45.57ID:EMEs5NEs
Perl5で&を使うのは、関数リファレンスを解決するときだけやろ。

>>903
Perl4レベルの遺跡やな。
もう昔々のことだから、忘れてやれ。。。
0908デフォルトの名無しさん
垢版 |
2019/12/15(日) 02:19:39.95ID:uHh4aFtn
これは関数であるって目印としてつけてる
俺の中では可読性の為
つけないのはData::Dumper()とかモジュールから直で呼ぶ場合だけかな
0909デフォルトの名無しさん
垢版 |
2019/12/15(日) 07:37:43.49ID:R35TvKP/
呼出で挙動がかわるの、充分に分ってるなら「個人で使うなら」いいんじゃねーの?
0910デフォルトの名無しさん
垢版 |
2019/12/15(日) 07:43:22.45ID:R35TvKP/
プロトタイプの呼出以外にも
@_ = (1,2,3,4) ; &func ;
で特殊挙動するし、地雷だらけだよXXルーチン

なんでXXがNGワードになってんの?
北島三郎のことXXちゃんって書き込めないの?
俺の環境だけ?

>>907
「perl, XXルーチン」でググると検索上位に来るんだよ、今でも
0912デフォルトの名無しさん
垢版 |
2019/12/15(日) 07:47:19.44ID:KI19HfKk
teratailのサブルーチン絡みの質問斜め見て、頭痛くなったわ。
質問者はしょうがないとしても、回答で&付けるってどういう了見だ?
0914デフォルトの名無しさん
垢版 |
2019/12/15(日) 08:32:32.51ID:KI19HfKk
>>904
お作法本全盛期(2010年代前半)なら、相手はお作法本を読んでる可能性がある。
引いてる程度じゃなくて、どん引きされたのかもよ
# お作法本: Perl ベストプラクティス、Effective Perl etc.

KENT-webもだけど、お作法本インスパイヤで、オレオレお作法のページが
山程あるのも滅んで欲しいわ。
0920デフォルトの名無しさん
垢版 |
2019/12/20(金) 06:50:52.69ID:GiJ3WKor
keysがスカラを引数に取れるせいで、なんか間違った書き方してる所があちこちある
どっちでも大抵は動くけど、エラーで止まりやすい
明示的にデリファレンスしてればエラーにはならない
0921デフォルトの名無しさん
垢版 |
2019/12/20(金) 07:10:52.86ID:8NcASRwh
それ、実験的に5.14から搭載されて、5.24で削除された機能
エラーで止るのは環境依存か、書き手がヘボか

そもそも使うんじゃねー、ってのが主旨なら、同意
0922デフォルトの名無しさん
垢版 |
2020/02/14(金) 23:14:26.30ID:x2wQj3nb
配列があって、条件に合わないものを削りたい
0 .. $#array に対してループしながらspliceすると、
$i-- でも redo でもなんか不安がある

どうするのが定番なんだろう
0924デフォルトの名無しさん
垢版 |
2020/02/15(土) 18:06:37.80ID:jU+J++ht
@array = grep { $_ > 0 } @array
とやって平気な気がしない

別の配列を用意していいなら既に出来ていて、
それを何とかすっきりできないかと
0925デフォルトの名無しさん
垢版 |
2020/02/15(土) 19:06:58.27ID:Slu9Ub4W
(平気な気がしないとか言われても知らんがな)
まず「すっきりできる」を定義してください
0927デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:03:36.63ID:pIpzwBTs
spliceするのはよくない気がする→何が定番なんだろうって話だと
grepが定番でしょ
別に結果配列用意するのでもいいんじゃないの
0928デフォルトの名無しさん
垢版 |
2020/02/15(土) 23:40:20.22ID:KTVOtCHP
spliceの、僕が考えた最強関数的な仕様はイヤかも。
もっと構文レベルで同じことができると良かった。
0929デフォルトの名無しさん
垢版 |
2020/05/09(土) 14:56:48.37ID:KF1jgHuK
WindowsでPerlを使いたいんですが、どれが良いですか。
ActivePerlはアンインストールしてもゴミが残るそうなので避けたいのですが。
0931デフォルトの名無しさん
垢版 |
2020/05/09(土) 18:51:24.57ID:/Z4Vk9Yy
Windows10, WSL, Ubuntu 18.04 なら、最初から入っているけど

file `which perl`
/usr/bin/perl: ELF 64-bit LSB shared object 以下省略
0932デフォルトの名無しさん
垢版 |
2020/05/27(水) 01:20:04.31ID:VqjzWrQC
Perlを勉強しています。
「use constant」で定義したハッシュのキーを
keys関数で取り出したいのですが出来ません。
どのような方法で取り出せますか?

use constant H => { a=>'AAA', b=>'BBB' };
foreach ( keys H ) #エラー。「keys %H」とするとエラーにならないが何も得られない。
{
print $_, "\n";
}

宜しくお願いします。
0934デフォルトの名無しさん
垢版 |
2020/05/27(水) 02:12:19.49ID:VqjzWrQC
>>933
ぬおおおおっ…Perlムズイっす。
「H()」この部分はハッシュへの参照を返してるのだと思うのですが、
実体はサブルーチンだったのですね!「&H」でも上手く行きました。
0935934
垢版 |
2020/05/27(水) 03:05:09.48ID:VqjzWrQC
>>933
お礼を記し忘れていました。
ありがとうございました。
0936デフォルトの名無しさん
垢版 |
2020/05/27(水) 05:13:22.61ID:ISGE1WR5
Perl は難しすぎる。
Ruby では、

hash = { a: 1, b: 2 }

hash.each_key { |key| p key }

出力。:a などはシンボル
:a
:b
0937デフォルトの名無しさん
垢版 |
2020/05/27(水) 06:47:35.32ID:VqjzWrQC
>>936
そういう話をしているのではないです。
そのコードを見る限り、
普通のハッシュキーを取り出すだけだったらPerlの方が簡単な気がします。
my %h = ( a => 1, b => 2 );
print "$_\n" foreach ( sort keys %h );

結果:
a
b

>>933は、「use constant」で定義したハッシュのキーの事です。
0938615
垢版 |
2020/05/27(水) 08:50:36.01ID:Bt/CFCtA
constantの実体は値を返すsubなので、%{}でデリファレンスしてね
0943デフォルトの名無しさん
垢版 |
2020/10/07(水) 12:09:24.93ID:70BaWviw
>>939
後で参照する ? 単に丸括弧を使う : 丸括弧内に「何か」を入れる
さて、「何か」とは、一体何だっただろうか?そうだ、三項演算子だ!

…と覚える。
0945デフォルトの名無しさん
垢版 |
2020/10/07(水) 15:33:40.38ID:GbKtGfRD
あと、マッチングのオプションのsとmも毎回検索してる
最初に思うのは大抵逆
0946デフォルトの名無しさん
垢版 |
2020/10/08(木) 09:33:52.95ID:e3wo1zjN
(?シリーズをいろいろ使ってれば、あとは:だけだけど、
そもそも(?:しか使わないんだよな
いろいろ便利そうな拡張ではあるけどこれ以上可読性下げてどうする
0947デフォルトの名無しさん
垢版 |
2020/10/09(金) 14:54:01.89ID:JXQ8Trls
TABをデリミタにしてデータが1行に並んでいる
但し、""で囲まれていれば内部にTABを使ってもよい

というルールのデータに対して、""に囲まれているTABをスペースで置換したい
どう書けばいい?
0950デフォルトの名無しさん
垢版 |
2020/10/11(日) 22:14:06.89ID:LEwrAD/J
while(<>){
while(s{(".*?)\t(.*?")}{$1 $2}){}
print;
}

これで解らないなら、「Perlの入門書をよく読みましょう」
としか言えないのだが。
0952デフォルトの名無しさん
垢版 |
2020/10/11(日) 23:29:39.25ID:LEwrAD/J
while($str =~ s{(".*?)\t(.*?")}{$1 $2}){}

しかし、Perlを使うなら、文中で省略されている$_ のことは
知っておかないといけない。
0953デフォルトの名無しさん
垢版 |
2020/10/11(日) 23:56:48.98ID:LtBR6JI3
タブ文字が複数あったら?とかダブルクォートが含まれてたら?とか、不安もいろいろ。
いわゆるExcelCSVなら、置換一発とはイカンやろな。

CSVモジュールでも探すか、マジメに自作するかして、セルごとに置換しないと個人的には落ち着かないな。
0954デフォルトの名無しさん
垢版 |
2021/03/25(木) 23:19:00.52ID:BFmdRR/m
$_ などの特殊変数に依存したコードを書くと移植性と可読性が著しく低下する。
正規表現にまつわる特殊変数も厄介。別の正規表現が呼ばれて上書きされてしまうからすぐにコピーしないといけない。
0955デフォルトの名無しさん
垢版 |
2021/04/28(水) 14:52:38.35ID:RETJLOh2
ビットシフト演算の挙動の違いが表面化した
32bitと64bitのビルドの違いにより、1 << 32の結果が変わる

32bitのperlが2^32以上の整数を扱えない訳ではないので、
ビットシフト演算子を使わずにビットシフト演算子と同じことをやらないといけない
何か抜け道は無いもんか
0956デフォルトの名無しさん
垢版 |
2021/04/30(金) 18:29:08.85ID:m/tHuDzV
>>955
シフトするだけなら2倍したり2で割ってintにすれば良いのでは?
もっと大きなビットを扱いたい場合は Math::BigInt かな。
0958デフォルトの名無しさん
垢版 |
2021/04/30(金) 19:31:00.11ID:m/tHuDzV
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
0959デフォルトの名無しさん
垢版 |
2021/04/30(金) 19:43:01.50ID:vAph35tm
何をしたいかというと、8byte単位の送信データがあって、
実際にはそれを64bitと見ていて、あるレコードは何bit目から何bit長、みたいに詰め込まれている
byte間とか平気でまたぐ
そういう64bitにデータをセットしたり取り出したり、という操作をしようと思うと、
1変数が64bitになっている方が楽に書ける
でも32bitの処理系だとできない
0960デフォルトの名無しさん
垢版 |
2021/05/01(土) 05:00:07.50ID:R5WysE71
ネットワークの通信データの取り出しなら unpack でフォーマットを N2 で配列または変数2個に取り出してからやれば楽なのでは?
0961デフォルトの名無しさん
垢版 |
2021/05/01(土) 09:00:30.12ID:/n1q7kUC
やれるとすっきりするけど、バイトオーダーやエンディアンがころころ変わるから、
何か落とし穴がありそう
0963デフォルトの名無しさん
垢版 |
2021/05/01(土) 16:05:36.08ID:R5WysE71
pack, unpack は互換性重視していると思うが? 少なくともフォーマットの N 等は同じ4バイトだよ。
その辺どうしても信用できないなら自分専用の pack, unpack を作れば良いんじゃないかな。
そうすると pack, unpack と同じ形式である必要もないわけだが。
0965デフォルトの名無しさん
垢版 |
2021/05/02(日) 17:15:11.59ID:9gapCdI8
そういえば Perl のネイティブな整数のサイズって C のどれなのかな。
perlnumber には「perl をビルドする際に使われた C コンパイラが対応している形式」と
書かれてるけど。
ちなみに今使ってる環境では int ではなく long , long long と同じ 8 バイトのようだ。
0966デフォルトの名無しさん
垢版 |
2021/05/03(月) 17:40:45.60ID:UFgXt23Q
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 と一緒にインストールされて欲しいものだな。
0967デフォルトの名無しさん
垢版 |
2021/05/04(火) 07:28:36.10ID:2rafzDNd
ありがとう。たまたま Perl のソースコードをダウンロードしてあるから
INSTALL を読んでみたら (いや、先に読んどけという話だが)
C コンパイラがサポートしてなくても use64bitint というオプションを使えば
整数のサイズが 64 ビットになるらしい。
Debian のパッケージでもこれを使ってるようだ。

C コンパイラの仕様は Config モジュールで得られるから
それを使って環境に合わせた処理が可能になる場合もあるが
Linux の flock 構造体はメンバの順番すら保証されてないようだから無理そう。
0968デフォルトの名無しさん
垢版 |
2021/05/04(火) 11:47:57.60ID:2rafzDNd
間違えた。「C コンパイラが」じゃなくて「CPU が」だ。
Configure を見た限りでは、8 バイト整数の型として採用する優先順位は
int, long, long long, int64_t の順で
8 バイトの型が無ければ Configure が失敗するようだ。
あっても CPU が対応してなくてライブラリで実現してるような環境だと
速度のためにあえて使わないという選択もあるかと思うが
long が 8 バイトだと強制的に使わされるようだ。
試せる環境が無いから勘違いしてるかもしれないが。
0969デフォルトの名無しさん
垢版 |
2021/05/04(火) 16:45:05.36ID:xGoTe+aq
さいですか
0973デフォルトの名無しさん
垢版 |
2021/05/05(水) 15:08:24.73ID:CxAIF4J7
テーブルがあってインデックスで取り扱いたい
でもテーブルを作る時にカウンタとか意識したくない

配列なら
push @table, $data;
で済むけど、ハッシュにしたい
$table[$i]->data1 = $data1;
あるいは
$table->[$i]->data1 = $data1;

そんなことできたっけ
0975デフォルトの名無しさん
垢版 |
2021/05/05(水) 16:00:54.87ID:CxAIF4J7
全部一度に判ってるなら、無名ハッシュをpushすればいいんだけど
ちょびちょび追加していきたい
0976デフォルトの名無しさん
垢版 |
2021/05/06(木) 21:44:26.70ID:ajjDZVcw
君が何をしたいのかよくわからない。
0979デフォルトの名無しさん
垢版 |
2021/05/24(月) 07:52:58.62ID:GjHEXSDD
親の方は無限ループにしておいて、適宜forkしてメインの処理をさせる
終わったら子はexitする

という作りで基本的にうまくいってるのに、たまに親が子だと思ってexitしとる
$pid = fork;
if (!$pid) {
exec($command);
exit;
}
この書き方に何か問題が?
0980デフォルトの名無しさん
垢版 |
2021/05/24(月) 08:16:28.74ID:INcwcLMt
親プロセスがwait $pid しないとゾンビが蓄積される。
それが続くと0ではなくundefを返すと思う。思うとしか言えないのはperldocに書かれてないから。
defined $pid でundefと0を区別する必要あり。
$!にResource temporarily unavailableのようなエラーが渡されるのでたぶんそう。
なのでちゃんと親プロセスがwait $pidすれば回避できる。
0981デフォルトの名無しさん
垢版 |
2021/05/24(月) 08:19:17.40ID:INcwcLMt
訂正。
perldoc -f forkにfork失敗時にundefを返すことが書かれてたわ
0982デフォルトの名無しさん
垢版 |
2021/05/24(月) 08:22:50.85ID:GjHEXSDD
やっぱり失敗してるんだよな
リトライするように直して試してみてるとこ

どういう理由で失敗するんだ?
activeperl
0984デフォルトの名無しさん
垢版 |
2021/05/24(月) 13:35:57.27ID:INcwcLMt
macOSでも起きるよ
0985デフォルトの名無しさん
垢版 |
2021/05/24(月) 13:56:03.81ID:GjHEXSDD
今たまたま何かのリソースが全部埋まってて、一瞬待ってくれたら準備できるよ
なんだったら、リトライは隠蔽してくれて良さそうなもんなのに
IO関係はみんなそうなってる
0986デフォルトの名無しさん
垢版 |
2021/05/24(月) 16:23:07.38ID:mQhym/iw
Perlはかなりの低レイヤーでも使われることがあるからな。
そんな冗長にはできんやろ。

そもそも、ぜんぜんwaitpid()しなかったらいずれ困るんだから、早くエラーになったほうがまし。
0987デフォルトの名無しさん
垢版 |
2021/05/25(火) 22:10:30.48ID:z8jztsTP
activeperlで
forkで返るpidがマイナスの値なんだけど、
Win32::Process::List で GetProcesses して得られるものとは別物なの?
0989デフォルトの名無しさん
垢版 |
2021/05/25(火) 22:59:31.10ID:z8jztsTP
疑似プロセスIDは、OSのプロセスIDとは別物なのか

要は、forkで分岐したプロセスがまだ生きてるかどうか親から周期的に監視したいんだけど
waitすると親が止まってしまうのでどうしたもんか
0993デフォルトの名無しさん
垢版 |
2021/05/26(水) 09:53:00.68ID:+WmbAELr
シェルスクリプトではkill -0 PIDでプロセスが生きてるか調べられる!
そういう用途にはシェルスクリプトを使うべき!
0995デフォルトの名無しさん
垢版 |
2021/05/26(水) 10:20:29.11ID:niBt7hlg
GetProcessesでpython.exeを見つければだいたい目的は達成するんだけど、
他に使ってる人がいると間違う
0996デフォルトの名無しさん
垢版 |
2021/05/26(水) 10:37:03.92ID:VVGa10VW
実行バイナリやシェルコマンドをP言語スクリプトから呼び出すソリューションが最も汎用性が高い
古事記にもそう書いてある
0997デフォルトの名無しさん
垢版 |
2021/05/26(水) 10:40:21.49ID:+WmbAELr
そこもちゃんとユーチューバーのKANTのサロンで言ってる!って
語尾に付けないと
0998デフォルトの名無しさん
垢版 |
2021/05/26(水) 10:48:36.67ID:VVGa10VW
このスレ、消費に9年以上かかってるとか盛者必衰の理をあらわしてて草
1000デフォルトの名無しさん
垢版 |
2021/05/26(水) 11:35:56.72ID:a7TiWa6C
質問してもええか? ええのんか?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3413日 0時間 39分 17秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況