Perlについての質問箱 ..
[2ch|▼Menu]
315:デフォルトの名無しさん
20/03/10 15:22:16 tTiB+rjP.net
>>314
やはりそうですか…
selectrow_hashrefを使うと$sqlでも$sthでも'A', 'B'それぞれの結果が返るので、selectrow_arrayrefだけ期待と違う動作をしている気がします。(バグ?)

316:デフォルトの名無しさん
20/03/10 15:28:19 qHN38Ccx.net
>>315
バグというか仕様だと思う
作者の書いたオライリー本にも書いてあったから意図的なはず
今更変更できないからこのままになってるんだろうね

317:デフォルトの名無しさん
20/03/10 15:39:16 tTiB+rjP.net
>>316
なるほど。
それでは今後、selectrow_arrayrefは注意して使うようにしたいと思います。
ありがとうございました。

318:デフォルトの名無しさん
20/03/10 15:58:50 SCW8qISh.net
>>313
へー
バッチファイル作ったりトリッキーな関連付けまでしないと動かないのが一番楽な方法ねー
cygwinで全く同じことができるしwin移植版perlならそのまま実行できちゃうんだけどね
ところでエクスプローラからどうやったらwsl内のファイルが見えるんだい?

319:デフォルトの名無しさん
20/03/10 16:50:47.58 lAAHr9o2.net
>>311
selectrow_arrayref は最初の1行しか返さないからということはない?

320:デフォルトの名無しさん
20/03/10 16:52:18.68 lAAHr9o2.net
ぐえ。リロード忘れたらとっくに話が終わっていて間に沢山の書き込みが

321:デフォルトの名無しさん
20/03/10 20:10:42.81 UzsfbeET.net
BOOKOFFに100円で売っていたPerl/CGI辞典によると、
selectrow_array:先頭行
selectcol_arrayref:最初のフィールド
selectall_arrayref:すべて

322:デフォルトの名無しさん
20/03/10 23:18:16.01 gGR9Cwad.net
>>318
Windows版Perl使って
Windowsで動かないーってやるより、
安心して使えるバッチファイルを使ったほうがシンプル

323:デフォルトの名無しさん
20/03/10 23:32:00 Z32YaYnf.net
いやいやw
WSLならバッチファイルなんか使わなくてもエクスプローラーからダブルクリックでWSL上のスクリプトを直接実行できるんでしょ?
やり方教えてよ
windows版perlならバッチファイルなんか使わなくてももちろん出来るからねw
それとwindows版perlだと何が動かないのかな〜?

324:デフォルトの名無しさん
20/03/10 23:37:16 9jB6JpZx.net
バッチファイルとかっていったい何歳の爺さんなんだよ

325:デフォルトの名無しさん
20/03/10 23:42:56.03 tP5E2IWo.net
>>323
普通に、wsl.exe+スクリプトファイルのショートカットを作るだけ

326:デフォルトの名無しさん
20/03/10 23:51:09.20 Z32YaYnf.net
>>325
やってることはバッチファイルと同じじゃん

327:デフォルトの名無しさん
20/03/11 00:05:26.96 5FVYO8f6.net
Ruby でも、MSYS2/MINGW は、日本語でバグル・日本語入力できない。
一方、WSL は、日本語でバグらない!
WSL が出たから、次第に、Windows 版のRuby Installer は、使われなくなっていく
それに、VSCode の拡張機能、Remote WSL が出たから、
Windows 10 では、Ubuntu 18.04 が標準になる
プロジェクトも、Windows 側のC: ドライブじゃなくても、
Linux 側に置いて、Remote WSL でアクセスできるので、本番環境に近い
Windows/Linux のファイルのアクセス権限の違いに、困らない!

328:デフォルトの名無しさん
20/03/11 00:38:23.60 3jaBr8Hp.net
ルビーならそうだろうねw

329:デフォルトの名無しさん
20/03/11 00:53:43 FWSDJbu9.net
>>326
それで実現できるだろ
しかも完全にちゃんと動くPerlで

330:デフォルトの名無しさん
20/03/11 01:05:10.04 zcf0ykb5.net
ハア?
WSLはwindows版perlより楽できるんじゃないの?
なんでわざわざそんな面倒なことすんの?
それとエクスプローラからWSLのファイルが見えてそれをダブルクリックで実行できるって話はどうなったの?

331:デフォルトの名無しさん
20/03/11 01:17:13 M00P+dL8.net
WSLはあくまでLinux的システムなアプリであって、Windows側とはやっぱり高い壁がある、と思っとくほうが安全やろ。

332:327
20/03/11 01:47:27 EKM5ywjJ.net
Ruby なら、WSL から、1-liner で、
Rubyで作られた遅いウェブサーバー、WEBrick が起動する

index.html が、Windows 側のC: ドライブにあるとすると、
cd /mnt/c/〜 で、Windows側へ移動して、

または、index.html が、linux 側のドライブにあるとすると、cd で、そこへ移動して、

ruby -run -e httpd . -p 8080

これで、Windows側のブラウザで見れる
URLリンク(localhost:8080)

つまり、プロジェクトが、Windows/Linux側のどちらにあっても、Windows側のブラウザで見れる

333:デフォルトの名無しさん
20/03/11 02:27:57 M00P+dL8.net
Webサーバーを経由すれば、ファイルが地球の裏側にあってもふつうに見れるなー。w

334:327
20/03/11 04:58:50 EKM5ywjJ.net
Linux 側のフォルダ内を公開した、Linux側のサーバーに対して、

Windows 側のブラウザのlocalhost で見れるんだよ!!

335:デフォルトの名無しさん
20/03/11 09:27:01 AZbrV/6V.net
>>319
>>321
返信ありがとうございます。
すみませんが、selectrow_arrayrefが最初の1行しか返さないということは知っています。
そうではなく、結果(リファレンス)を変数に入れてから再度同じステートメントハンドラでselectrow_arrayrefを使用すると、リファレンス実体の方が書き換わってしまうので、1回目の結果が失われてしまうということを言いたかったのですが…。
サンプルとして'パラメータ付きクエリ'と書きましたが、複数行を返さない単純な「SELECT ?」でも再現します。

336:デフォルトの名無しさん
20/03/11 09:44:35.82 LRW51TqV.net
なるほど。

337:デフォルトの名無しさん
20/03/11 20:46:52 M00P+dL8.net
>>335
同じ変数を使い回しまくって、パフォーマンスを落とさないためやないの?
GCのないPerlならたいしてかわらんやろけど。

338:デフォルトの名無しさん
20/03/11 21:49:34.54 gWo/n1eo.net
>332
ウェブサーバーならbusyboxでよくね?w
数MBのメモリで動作する

339:デフォルトの名無しさん
20/03/11 23:17:22.77 k/ve+D91.net
>>335
クエリ結果を保持してるのはステートメントハンドラオブジェクトの方でパフォーマンス優先のためにその内部変数のリファリンスを返すのが*_arrayrefって考えればいいかな
んでselectrow_arrayrefの第1引数に文字列を渡したときは内部で毎回prepareされるので後から実行しても書き変わらないと

340:デフォルトの名無しさん
20/03/12 01:40:41 i54BE1kH.net
>>304
よくもこんな大嘘をw

341:デフォルトの名無しさん
20/03/12 01:44:08 NTVlQfwP.net
第一引数に$sth渡せるんだって思ったね
文字列しか渡したことないし
Perlはいまだに知らないことがある

342:デフォルトの名無しさん
20/03/12 09:49:43 05BordF4.net
>>339
そうですね。
DBI.pmで第1引数がリファレンス(ステートメントハンドラ)ならそのまま使用、そうでなければprepareしているところまではわかったのですが、その後の流れは同じのようでしたし、Driver.xstまで解析するのはやめておきました(^^;)

343:デフォルトの名無しさん
20/03/12 16:51:12.87 XWa7Kkjq.net
>>340
そういう時は
How dare you?
と言う。

344:デフォルトの名無しさん
20/03/12 16:52:32.93 XWa7Kkjq.net
あ、記号まつがえた。

345:デフォルトの名無しさん
20/03/12 17:18:02.38 +5N6GCV3.net
関連付けの仕組みを知らない人がいるのかな?
単にレジストリに、この拡張子はこのコマンドで実行するって書くだけなんだけど

346:デフォルトの名無しさん
20/03/12 17:18:57.67 +5N6GCV3.net
つまりcmd。exeから実行できるものは全て
同じやり方で関連付け作れるってことね

347:デフォルトの名無しさん
20/03/12 18:12:19 XQbCK6u3.net
それはただの起動のしくみでしかない。
実際の動作は高い壁で分離されてるといって過言でないものをいっしょくたにはできまい。

348:デフォルトの名無しさん
20/03/12 18:48:34 U4j5Oz8o.net
>>347
理由は?

349:デフォルトの名無しさん
20/03/12 18:49:23 U4j5Oz8o.net
そもそもダブルクリックできるなんて
起動の仕組みなんだから、起動の仕組みでしか無いと言われても
その話をしてるんですよとしか言いようがないがw

350:デフォルトの名無しさん
20/03/12 19:40:41 kpO7RyNn.net
だからエクスプローラからWSLにあるファイル見る方法教えてくれってw

351:デフォルトの名無しさん
20/03/12 19:47:21 IWxDU6vM.net
それは見れる \\wsl$
エクスプローラからしか見れないのが問題

352:デフォルトの名無しさん
20/03/12 19:57:44 MY0SLzQz.net
グレタちゃんもアナルパールを使ってます

353:デフォルトの名無しさん
20/03/12 20:49:28 U4j5Oz8o.net
ダブルクリックてエクスプローラーの話じゃん
エクスプローラーから見れるなら、ダブルクリックして開ける。
その証拠にテキストファイルだって開けるだろ

354:デフォルトの名無しさん
20/03/12 22:39:56.96 MY0SLzQz.net
グレタちゃんに僕のパイソンを貸してあげたい

355:デフォルトの名無しさん
20/03/14 18:16:47.41 jx2yED/o.net
active perlのcryptのsaltにasciiでない文字を渡すと止まるんだけど何で?

356:デフォルトの名無しさん
20/03/14 19:34:39.97 RPa5riWU.net
WSLつかえ

357:デフォルトの名無しさん
20/03/14 22:58:59.61 eh0BX5+5.net
>>355
理由を聞いてどうするんや?
文字コードとかややこしいから、対応してないんやろ。

358:デフォルトの名無しさん
20/03/14 23:16:24 5TZ0Uf7y.net
分からんのなら黙ってろやチンカス

359:デフォルトの名無しさん
20/03/14 23:39:11.11 9VuyfYoc.net
暗号化って、base64 とかだろ。
ascii だけだろ
Ruby なら、こういうやつだろ
module SecureRandom
URLリンク(docs.ruby-lang.org)

360:デフォルトの名無しさん
20/03/14 23:44:18.11 jx2yED/o.net
keyの方は何でもokなんだけどな

361:デフォルトの名無しさん
20/03/15 03:21:52.90 ey4TMar/.net
>>358
わかってもなにもできんくせに
ゴミクズ

362:デフォルトの名無しさん
20/03/15 18:38:42.70 8dswEreI.net
グレタちゃんのクリトリスは100カラットのルビー

363:デフォルトの名無しさん
20/03/16 09:00:22.83 m2o8L3Qu.net
>>355
ここに書き込む前に、perldocを嫁
If using crypt on a Unicode string (which potentially has characters with
codepoints above 255), Perl tries to make sense of the situation by
trying to downgrade (a copy of) the string back to an eight-bit byte string
before calling crypt (on that copy). If that works, good.
If not, crypt dies with Wide character in crypt .
おそらく、crypt はPOSIXの仕様に合わせているから、こうなるのではないかと思う。

364:デフォルトの名無しさん
20/03/16 19:53:11.24 jMV62GuM.net
128-255を渡しても止まるんだけどね
エラーが出るとかじゃなくて異常終了する
仕様だとは思い難い

365:デフォルトの名無しさん
20/03/16 20:07:47.98 O3TrJAsg.net
「異常終了」じゃなくて、「die」してるんちゃううんか?
>>363にもそう書いてあるやろ。
トラップしたけりゃevalしろ。

366:デフォルトの名無しさん
20/03/16 20:22:32 jMV62GuM.net
die すると何かエラーメッセージ出しておとなしく終了するんじゃないのか?
windowsに怒られとるぞ

367:デフォルトの名無しさん
20/03/17 00:31:17 WzQFj8c+.net
この言語はなにが起こるかわからんので基本evalで囲わないとやってられませんね

368:デフォルトの名無しさん
20/03/17 00:59:40.01 DZYZalLc.net
トラップでevalってなんだっけ?w
Perlやめてから結構立つから忘れた。
なんかそんなのあったなwww
今?Perlからシェルスクリプトに回帰していますがなにか?

369:デフォルトの名無しさん
20/03/17 05:25:03.15 WzQFj8c+.net
>>368
これ
URLリンク(perldoc.jp)
eval BLOCKってやつ
try catchみたいなもん

370:デフォルトの名無しさん
20/03/17 08:02:58 sAGmKBfN.net
エラーが返るならtryできるだろうけど、試してみたら異常終了するようなもんも避けられるのか?

371:デフォルトの名無しさん
20/03/17 21:45:41.98 sAGmKBfN.net
URLリンク(i.imgur.com)
evalでもトラップできない

372:デフォルトの名無しさん
20/03/18 00:13:57 +5qWGdwM.net
man にはどう書いてあるの? Perl の crypt じゃなくて C のライブラリの方だよ。

373:デフォルトの名無しさん
20/03/18 01:56:55 jzX09kaS.net
WindowsだしActivePerlのようだし、何がおきてもふしぎじゃないな。w

374:デフォルトの名無しさん
20/03/18 09:12:43 SzV6uL92.net
Windows10、activeperl 5.20なんだけど、次のコードできちんと動く。何が問題なのか解らない。

$res = eval {crypt('aaa', 'ppp')};
print "1. $res\n";
$res = eval {crypt('aaa', 'あ')};
print "2. $res\n";
$res = crypt('aaa', 'ppp');
print "3. $res\n";
$res = crypt('aaa', 'あ');
print "4. $res\n";
__END__

1. ppFj4OYENOP9c
2. 縺VSnoxRf90hw
3. ppFj4OYENOP9c
4. 縺VSnoxRf90hw

375:デフォルトの名無しさん
20/03/18 19:35:06 iQ6PHWNN.net
Windows7とか?

376:デフォルトの名無しさん
20/03/28 10:30:07.37 gZJzrXqn.net
検索が遅い
いろんな条件に対してファイル全体を検索、ということをする時に、
OSのキャッシュに頼って毎回 `grep` する方が速い
メモリに読み込んで検索すると負ける
ループで$data[$i] =~ /$pattern/ した方がまだ速くて、
grep {/$pattern/} @data するともっと遅くなる
大量一括検索の高速化のテクニックみたいなの何かあるのかな

377:デフォルトの名無しさん
20/03/28 18:48:22.67 Cuxaq7bT.net
>>376
URLリンク(metacpan.org)
使った事ないが MCE::Grep 辺りは説明読む限り速そう

378:デフォルトの名無しさん
20/03/28 18:55:38.49 Cuxaq7bT.net
もっと基本的な話なら perlperf
URLリンク(perldoc.jp)

379:デフォルトの名無しさん
20/03/28 19:23:29.33 gZJzrXqn.net
MCE::GrepはCPUの使用率は上がるけど遅くなった
grepよりは正規表現の処理のあたりが時間かかってるんだと思う
感覚的にはもっと高速でも全然おかしくない感じなのに

380:デフォルトの名無しさん
20/03/28 19:34:33 gZJzrXqn.net
100MBのファイルからパターンに合う行を全部抽出するのに1秒かかるくらいの感じ
で、パターンが250もあるから、コーヒーが飲めるくらい待たされる

381:デフォルトの名無しさん
20/03/28 20:00:38.86 L8+cmwNy.net
俺だったらgrepでやっちゃうなぁ
結果はファイル経由で

382:デフォルトの名無しさん
20/03/28 21:36:49.99 L89shHGR.net
>>376
qr//で事前に正規表現をコンパイルしてみたら?

383:デフォルトの名無しさん
20/03/28 21:55:00.53 gZJzrXqn.net
同じパターンで繰り返し検索するのではなくて、
いろんなパターンで同じ対象を検索するので、コンパイルはできない
でも、パターンのリストは実行前に確定しているので、
qrで作ったものを配列に持たせておけば速くなるだろうか

384:デフォルトの名無しさん
20/03/28 23:16:33.34 2U8ZKDy+.net
もはや perl の能力を超えているな
C とかで書いた方がいい

385:デフォルトの名無しさん
20/03/28 23:24:04.96 ZQFwrOhU.net
パターンの内容にもよるが、flex で書いて Inline::C で呼ぶという方法もある。

386:デフォルトの名無しさん
20/03/28 23:25:40.33 7nefda3x.net
色んなパターンで?
grep -f でパターン読ませてやるのと同じか?

387:デフォルトの名無しさん
20/03/29 09:15:52.43 9AyQFVoq.net
素の Perl は NFA だけだから、どうしても速度的には不利になる。
パターンが250もあるなら尚更だ。
grep との差はPerl と C の差はもちろんあるだろうが
DFA でできるパターンなら、その差が大きいと思う。

388:デフォルトの名無しさん
20/03/29 09:42:19.51 aacnUCYv.net
linuxだったら素直にgrep呼べばいいだけだけど、
windowsだと素性が良くて高速なgrepを探すところでまず困難がある
さらに、grepに引数を渡すところにもエスケープ文字の困難があって、
結果の受け取りにも文字コードの困難が

389:デフォルトの名無しさん
20/03/29 17:43:38 9AyQFVoq.net
そういえば awk は DFA じゃなかったかな。

390:デフォルトの名無しさん
20/03/30 00:14:28 mvvN5DTM.net
perl の Memoize は関数全体に掛けるようですが、
ruby の @memo、javascript の memo の変数に掛けるのは新し目の使い方でしょうか

391:デフォルトの名無しさん
20/03/30 04:32:31 PdZ6Klrm.net
>>388
WSLのUbuntuだとどうなのだろうか?
あれ遅い?

392:デフォルトの名無しさん
20/03/30 08:35:14.72 3FWyQXw7.net
NFA でなければならない理由がないなら DFA にするだけで速度 1000 倍は堅いかも。
でも Perl のままでも正規表現のチューニングは可能だ。まだやってないならね。
実際に使ってるパターンを見せてもらわないことにはなんとも言えないが。

393:デフォルトの名無しさん
20/03/31 12:53:45.32 GaEXrIp5.net
>>388
普通にWSLを使えばいいだけでは?

394:デフォルトの名無しさん
20/03/31 22:24:02.97 Z+pFaYZ2.net
win8.1のサポートが終わった頃に思い出したら使ってみよう

395:デフォルトの名無しさん
20/04/22 13:25:13 gkB+0fgm.net
@array = ($str =~ /(PAT1).+?(PAT2).+?(PAT3)/g);
みたいにすると、パターン3つ分が配列に入るけど、他にもマッチするとそれも続けて入る
できれば2次元配列になって欲しい
そんな技はある?

396:デフォルトの名無しさん
20/04/22 18:47:25.28 WLkEu+yG.net
そういうことをする時のセオリーはスカラコンテキストで
$str =~ /\G$pat/g

397:デフォルトの名無しさん
20/04/22 19:29:55 gkB+0fgm.net
可能?

$str = '1a2b3c1x1d2e3f1g2h3i';
を与えられて
[[a, b, c], [d, e, f], [g, h, i]]
を得るにはどうすれば

398:デフォルトの名無しさん
20/04/22 20:38:21.44 f6F85tCk.net
my @arr = ();
while ($str =~ /\G.+?([a-z]).+?([a-z]).+?([a-z])/g) {
  push @arr, [$1, $2, $3];
}

399:デフォルトの名無しさん
20/04/22 20:54:42 gkB+0fgm.net
[[a, b, c], [x, d, e], [f, g, h]]
になっとるよ

400:デフォルトの名無しさん
20/04/22 20:56:31 gkB+0fgm.net
でも判った
普通に$1使えばいいだけか
結果を一つずつスカラに取るんだと思ってた

401:デフォルトの名無しさん
20/04/22 21:01:22 gkB+0fgm.net
/\G.*?1(.)2(.)3(.)/g
これがやりたかったこと

402:デフォルトの名無しさん
20/04/22 21:27:03 gkB+0fgm.net
結局コードはあんまり変わらなくて、ループで
push @array, ($1, $2, $3)
にするか、後で
splice(@elements, 0, 3)
を使っていくかの違い

パターンを3つから4つに増やした時に、
$4を追加するか、3を4に増やすかのメンテはやっぱり必要
いきなり2次元配列が得られるスマートさからは劣る

403:デフォルトの名無しさん
20/04/22 21:30:34.59 WLkEu+yG.net
どうやら今回は必要ないみたいだけど事前にグループの個数が
判らないという前提なら @- とか見ればいい。
あるいはグループに名前を付けて %+ を使えばいい。
全部ここに書いてあるよ。
URLリンク(perldoc.jp)

404:デフォルトの名無しさん
20/04/22 21:32:10 f6F85tCk.net
Perlで、とある配列を指定した要素数ごとに別の配列リファレンスに分割する処理をList::MoreUtilsモジュールで書き直してみた
URLリンク(perl48.hatenablog.com)

405:デフォルトの名無しさん
20/04/22 23:57:47 WLkEu+yG.net
名前を付けるような性格のものじゃなくて個数が変わる可能性があるなら
個数だけ与えてパターンを組み立てればいいよ。
$1,$2 とか書かなくても
map { ${$_}} 1 .. $n
で同じことができるし。
リストコンテキストで配列に入れてから splice する方がいいと思うならそうすればいい。

406:デフォルトの名無しさん
20/04/23 08:13:25 7CKy0JPC.net
目指すのは、個数がいくつなのか人間が把握しなくていいコード

407:デフォルトの名無しさん
20/04/23 08:30:38.98 IlZrBGCM.net
できるでしょ。自分がスマートになってスマートなコードを書けばいい。

408:デフォルトの名無しさん
20/04/23 12:10:21.89 2vqGx7d4.net
完全に数値って決まってるんなら、俺ならsplit使っちゃうな
@a = split /\d/, $str;
まあこんな単純な話じゃないんだろうけど

409:デフォルトの名無しさん
20/05/01 10:49:51 baJ3Dlo6.net
activeperlで
$res = `exefile $file`;
みたいなことをした時に、
コマンドプロンプトからスクリプトを起動するとちゃんと動く
でも、スクリプトをランチャーから起動するとno such fileになる
ファイル名が英数ならどちらもok
2byte文字が混じると挙動が変わる

起動の仕方によってパスの取り扱いとか変わる?

410:デフォルトの名無しさん
20/05/01 12:19:28 baJ3Dlo6.net
あ、違う
2byte文字ではなくドライブの違いだった
ネットワークドライブにあるとアクセスできない
コマンドプロンプトからならできる

411:デフォルトの名無しさん
20/05/01 13:08:35 baJ3Dlo6.net
結局、ランチャーに管理者権限が付いてるのが原因

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
EnableLUA 1 -> 0
これで解決する
perl関係ない

412:デフォルトの名無しさん
20/05/01 13:13:09 9YL7RFP8.net
ランチャー自身か、ランチャーの起動方法がよくないんやろ。
ネットワークドライブの認証(ログオン)かそのタイミングがあやしい。

413:デフォルトの名無しさん
20/05/01 13:13:40 9YL7RFP8.net
あら、自己解決?

414:デフォルトの名無しさん
20/05/10 19:19:00.31 gcVsfbhd.net
質問させてください。
WindowsでActivePerlを使っています。
perl で、あるファイルを、関連付けられたアプリケーションで開く
には、どのようにすればよろしいでしょうか?
例えば、xx_system('foo.txt') のようにすると、'.txt'に
関連つけられたアプリケーションで、'foo.txt'を開くような
動作を実現したいのですが。

415:デフォルトの名無しさん
20/05/10 21:12:47 04IHVppx.net
system(1, 'foo.txt');

416:デフォルトの名無しさん
20/05/10 22:26:25.38 gcVsfbhd.net
>>415
動きました。ありがとうございました。

417:デフォルトの名無しさん
20/05/28 11:01:17 5kmQgXWn.net
最近 python を使い始めたんだけど、使うほどに perl 凄げーって思う。
perlって細かいこと気にしないでも書けるって感じ。
まあ、 python に慣れてないってのもあるけどw

418:デフォルトの名無しさん
20/05/28 12:00:57.19 yN32+nQR.net
細かいことを気にしないせいでバグの原因になるので、
きちっとしか書けないようにした
perlの不満を解消してもっと簡単に書けるようにしたのは、
rubyの方が正常進化だと思う

419:デフォルトの名無しさん
20/05/28 12:46:18.60 d4ggzNnr.net
>>418
use strict;
use warnings;

420:デフォルトの名無しさん
20/05/28 12:49:38 MEC8WK3T.net
Perl は、暗号のような記号が多いから、皆嫌う

Ruby は可読性を上げるために、それらの記号を無くそうとしている

421:デフォルトの名無しさん
20/05/28 13:57:57 EGYBOXys.net
>>420
変数の型を知るのに
宣言まで見ないとわからないのがJava
代入まで探さないとわからないのがpython
見るとその場でわかるのがperl
宗教論争は終わらない

422:デフォルトの名無しさん
20/05/28 14:14:16 yN32+nQR.net
マウスオーバーで判るようなものをいちいち書かなくても

423:デフォルトの名無しさん
20/05/28 19:40:22.87 2jhnUESo.net
PerlでIDEは使わないわな

424:デフォルトの名無しさん
20/05/28 20:04:53.96 EYUPTTzW.net
んなこたーない

425:デフォルトの名無しさん
20/05/28 20:14:52 2jhnUESo.net
いやいやPerl書いてるときマウス触らんでしょ
まあ人によるんだろうが

426:デフォルトの名無しさん
20/05/28 20:21:04.17 yN32+nQR.net
ロジックが逆だ
perlが型が判るからマウスを触らないのではなく、
マウスを触らないで作ったからマウスなしで型が判るようになってる
MT免許だからといってATに乗ってはいけない訳ではない

427:デフォルトの名無しさん
20/05/29 20:28:53.39 Ey9K/+fw.net
Perl の IDE って、どんなのがある?
Eclipse とか IntelliJ IDEA のプラグインで使えたとは思ったが、拡張子を .pl にしておかないと Perl だと判別してくれなくて
ただのテキストファイルと認識されちゃって使い辛いなと思ったことはあるが、もっとまともなのある?

428:デフォルトの名無しさん
20/05/29 20:32:29.66 uRkXoYhe.net
vscode + Perl::LanguageServer

429:デフォルトの名無しさん
20/05/29 20:34:34.78 Bk25Bwk1.net
サクラエディタで十分なんですよ(´・ω・`)

430:デフォルトの名無しさん
20/05/29 21:27:39 dZOo8Hm0.net
拡張子を ,pl にしないメリットってなんかある?

431:デフォルトの名無しさん
20/05/29 21:28:20 Bk25Bwk1.net
実行ファイルはpl
モジュールはpm
そんな事も知らんのか(´・ω・`)

432:デフォルトの名無しさん
20/05/29 21:36:34.81 8nIWWcW2.net
perlはvimで書く。
お兄さんとの約束だよ。

433:デフォルトの名無しさん
20/05/29 21:38:26 uRkXoYhe.net
mattnさんはパンツ履いて

434:デフォルトの名無しさん
20/05/29 23:37:14.00 GfVaVkMA.net
>>430
Linuxでは、いちいち拡張子をつけないのがふつう。
中身を気にしなくてよくなる。

435:デフォルトの名無しさん
20/05/30 00:29:42 UYDx2q8r.net
>>434
cとかshellとか拡張子をつけるのが普通なんじゃないの?

436:デフォルトの名無しさん
20/05/30 00:31:15 pcDYqVj5.net
ソースは付ける
実行ファイルは付けない
スクリプトはソースよりも実行ファイル寄り

437:デフォルトの名無しさん
20/05/30 00:42:58 h6ZQaP0H.net
拡張子つければ伝わるであろう情報を削るとか
一人で管理してるサーバならいいけど
そうじゃなきゃ害悪だと思う

438:デフォルトの名無しさん
20/05/30 01:44:27.37 UYDx2q8r.net
人間がエディトするファイルは付ける
人間がエディトしないファイルは付けないんじゃないの?

439:デフォルトの名無しさん
20/05/30 01:51:00.93 h49XlInt.net
運用においては、実行ファイルの実装方法なんかどうでもいい。
むしろ、実装方法を変えたら、ファイル名も変わるほうがはるかに害悪。
たとえば、シェルスクリプトをPerl スクリプトに変えただけで、そのスクリプトを使っているところをすべて変更しないといけなくなる。

440:デフォルトの名無しさん
20/05/30 03:26:43.00 k7WMMDxu.net
昔々 MS-DOS (更にそれの元になった CP/M)はファイル名に固定で3文字の拡張子があり、
それによって実行ファイルかどうかを判定していて、Windows はそれを引き継いでいるので
拡張子を使っているだけ。
UNIX系OSはそもそも拡張子という概念はなく、実行ファイルは実行パーミッションのビットが
立っているかどうかで判定していた。C言語のソースに .c を付けたりはするが、あれは拡張子
ではなく接尾辞で主に人間やそれを読むコンパイラ等がファイルの種別をファイル名から判断
するためにある。だからOSから見たら .c の部分に特別な意味はなくファイル名の一部でしかない。
Windows だと例えば .exe のファイルなら .exe を抜いた拡張子なしのファイル名を指定して
OSに実行させる事は可能だが、これはOSが拡張子部分を特別扱いしているからだ。
UNIX系OSではそのような方法では実行できずファイル名を全て指定する必要がある。xxx.pl なら
xxx.pl と指定する必要があり xxx のみでは実行できない。その代わり実行パーミッションが立って
いればファイル名がどうであろうともOSはそれを実行しようとする(実際に実行できるかどうかは
ファイルの内容による)。

441:デフォルトの名無しさん
20/05/30 08:54:37.07 Noe/rV9t.net
拡張子が無くても判定できるようにすればいいんじゃないの? Emacs みたいに。

442:デフォルトの名無しさん
20/05/30 12:16:10.21 h49XlInt.net
>>441
つ fileコマンド

443:デフォルトの名無しさん
20/05/30 13:18:31.04 9sn/rA++.net
>>439
運用のために保守は犠牲にするんですか?

444:デフォルトの名無しさん
20/05/30 13:58:45.71 h49XlInt.net
>>443
実装の変更は、保守の範囲ではない。
二次開発かな?w

445:デフォルトの名無しさん
20/05/30 15:56:11.11 CwCZ2prN.net
>>440
シェバン知らず?

446:デフォルトの名無しさん
20/05/30 18:54:59 h49XlInt.net
>>445
>>440はその前の話やろ。
シェバンがあるだけで、テキストファイルが勝手に起動されたら恐ろしいわ。w

447:デフォルトの名無しさん
20/05/30 19:43:41.34 GvMJ9/EG.net
>>432
おじいちゃん(´・ω・`)

448:デフォルトの名無しさん
20/05/31 02:15:32.98 MeZ7svrP.net
言語変えて作り直すって、俺の感覚ではシステム置き換えのイメージだわ
コンパイル済みのバイナリならともかく、スクリプト言語動かすって環境づくりも入るじゃん

449:デフォルトの名無しさん
20/05/31 02:44:16.68 pTVQa+4z.net
>>445
>>440に書いてあること読んでないだろ。

450:デフォルトの名無しさん
20/05/31 03:40:37.55 qe5b9Icc.net
その前って何?
だからシェバン使えば拡張子なんか使う必要はないってことだよ?
>>439みたいな書き換えはいらないってことを言ってる
あと自演して書き込みは見苦しいぞ

451:デフォルトの名無しさん
20/05/31 04:22:23 fhA8y4ka.net
読解力理解力がなくて、複数から指摘されたからって、自演扱いで返すとは見苦しいぞ。

452:デフォルトの名無しさん
20/05/31 05:26:43.75 pTVQa+4z.net
>>450
それ何のOSでの話?

453:デフォルトの名無しさん
20/06/11 19:05:11.82 5cioSHJn.net
「local $| = 1;」と言う記述見たんですけど、
「$|」の局所化って意味あるのでしょうか?
ただ単に「$| = 1;」と等価であり「local」を記述しても無駄な気がするんですけど、
私の勘違いでしょうか?
「local $| = 1;」とやることで、
そのファイルの出力だけみたいな感じになるのですか?
となると、
同プロセスなのに標準出力バッファが出力毎に別個に用意されてる事になってしまいますよね?
分かるかた教えてください。

454:デフォルトの名無しさん
20/06/11 19:32:41.35 zOJFiWlV.net
>>453
スコープを抜けたときに、もとの値に戻る。

455:デフォルトの名無しさん
20/06/11 19:37:09.97 YKNmcAQr.net
横からだけど知らなかった…
毎回もとの値別変数で退避してた

456:デフォルトの名無しさん
20/06/11 19:53:05.96 L2GhQgnz.net
なんとなく直感的にグローバル変数だけだと思ってた
だから元の値を退避しておくという発想の方が自然
わざわざぶつけて便利に使おうという発想はいずれバグる

457:デフォルトの名無しさん
20/06/11 20:13:03.35 5cioSHJn.net
>>454
レスありがとうございます。
「もとの値に戻る」と言う事は、a.plから参照される異なるスコープのb.pmがあり、
b.pmに「local $| = 1;」の記述があった場合、
b.pmに定義されたサブルーチンが呼び出される毎に、
「$| = 1;」と同等の処理が行われ、
戻る際には元の値がセットされるのでしょうか?
それとも、スコープによって異なる「$|」を、
標準出力側でスコープ毎に切り替えてるという事でしょうか?

458:デフォルトの名無しさん
20/06/11 20:24:12.92 L2GhQgnz.net
printする度に今見えてる$|が渡ってるんだろうな

459:デフォルトの名無しさん
20/06/11 21:09:21.20 5cioSHJn.net
>>458
まぁ、そうですよね。無駄な処理になるし後者ですよね。
(OOP的に言うと、スコープ毎のインスタンスを参照的な)
ありがとうございました。

460:デフォルトの名無しさん
20/06/11 22:40:57.89 zOJFiWlV.net
>>456
Perlにあっては「わざわざ」ではない。
localはダイナミックスコープ、my/ourはレキシカルスコープであることは意識しておくべき。

461:デフォルトの名無しさん
20/06/12 02:39:58.45 TN61WwYv.net
宜しくお願いします。
$1をクリアしたい場合は「'' =~ /()/;」等として
無駄なマッチングをして空文字列を設定しないとダメですか?
数億件のデータを捌く際とか、めちゃくちゃタイムロスになりますよね?
皆様はどうされてるのでしょう?

462:461
20/06/12 02:41:54.90 TN61WwYv.net
>>461
↑に追記です。
$2以降のクリアも含めてお願いします。
最適な解を頂ければ幸いです。

463:540
20/06/12 02:51:00.48 OceO7BHX.net
>>461
まず、scalar変数の場合
=()はできない
=''や""は明示的に空文字列を設定することになる
なので既存変数をクリア、というか不定状態に設定するには
= undef;
あるいは数値を設定するためのシンボルを値0に戻すには
= 0;
undefは値として評価されれれば0,文字列として評価割れれば空文字列''が返った
(と思う)

464:デフォルトの名無しさん
20/06/12 03:17:40.95 O2sQpJVa.net
答えではないのだけれど、そういう場面に遭遇したことがないんだよね
簡単でいいのでどんな時に必要なのかしら?

465:461
20/06/12 03:24:01.31 TN61WwYv.net
>>463
あの…すみません。
スカラー値の評価の話をしている訳ではありません。
$1や$2や$3と言った特殊変数の値をクリアをする方法を聞いています。
これらの特殊変数に値を代入したらエラーになります。
引き続き>>461-462のベストな解をお待ちしています。
宜しくお願いします。

466:461
20/06/12 03:52:20.68 TN61WwYv.net
>>464
計 数億件のデータがあり、
それぞれにはCのラベルのような項目名がありまして、
それに続く文字列がその項目の値になるのですが、
(例えば「name: value…\n」な感じです)
これを一時的にDBに収めるためnameをキーとしてライブラリに渡したいんです。
一般的に思いつく方法としては、
「if( $ln =~ /^(パターン)://g ){ func( $1, $ln ); … }」
とすれば良いのですが、
なにせ件数が多いので、無駄な条件文を省きたいのです。
(条件文は処理が重いので)
検証実測値では1日以上の処理速度差がでるかもなのです。
(他にも同等の処理があるのでかなり省ける感じがするんです)
func()は、キーや値が未定義値もしくは空値であれば、
なにも処理をせず抜けるので、
$1がクリアできればif文を無くすことが出来ます。
そこで思いついたのが、
>>461の「'' =~ /()/;」ですが、これでは本末転倒です。
と言うのが経緯です。

467:デフォルトの名無しさん
20/06/12 04:05:50 Cyxf//AW.net
>>465
そもそも、$nはマッチしたときのみ参照する変数であるから、わざわざリセットする必要がない。

if (m/(.*)/) {
say $1;
}

これ以上の回答は>>464に答えてから。

468:デフォルトの名無しさん
20/06/12 04:13:00 Cyxf//AW.net
あら、いきちがった。。。

そういう話であれば、気にするな、ってところやろ。w

オレの感覚では、ifで判定して関数を呼び出さないほうが速そうだと思うがなあ。
Perlの処理としては、関数からすぐ戻ると言っても、呼び出しもそこからの戻りもそんなに軽くはなかったような。

「かも」とか言ってないで、真剣ならまず計測してみろ。

469:デフォルトの名無しさん
20/06/12 05:15:54 O2sQpJVa.net
説明してくれたけど、やっぱイマイチ分からん
$1をクリアして無条件でfunc( $1, $ln )を呼び出したい、ということかしら
その時funcは通過するだけ、と
パフォーマンスを気にするならやっぱり $1 && func( $1, $ln )とかの方がいいと思うけどな
多分、何か事情があるのでしょう。
美しくはないけど'' =~ /()/;なら誤差の範疇と思いますよ。
数値としてはベンチマークで

470:デフォルトの名無しさん
20/06/12 05:31:29 P559B0Rd.net
$1をやめる選択肢は?

($label) = $ln =~ /^(パターン)://;
func($label, $ln);

471:デフォルトの名無しさん
20/06/12 05:32:22 P559B0Rd.net
あ、/ 多い……

472:デフォルトの名無しさん
20/06/12 05:38:56.76 O2sQpJVa.net
答えじゃないんだけどさ、
$x = $ln =~ /^(パターン):/ && $1
これで以降は$xを使う、とか。

473:デフォルトの名無しさん
20/06/12 05:48:44 P559B0Rd.net
え、array使わないの?
俺としては

($label) = $ln =~ /^(パターン):/;
func($label, $ln) if $label;

を推したい

474:デフォルトの名無しさん
20/06/12 07:57:32.00 kFexpNJ3.net
Ruby で特殊変数などは、スレッドローカル変数だから、
マルチスレッドでも共有しないから、安全だけど
特殊変数をクリアする必要など、考えたこともない

475:デフォルトの名無しさん
20/06/12 09:26:27.43 Xic6e0Vs.net
マッチに失敗してるのに古い$1を使ってしまって、
みたいなケースはちょいちょいあるな
それはクリアしてなかったからではなくて、失敗をトラップしてないバグ

476:デフォルトの名無しさん
20/06/12 13:25:45.07 Qkj+08r5.net
>>466
もうCで書いちゃえよ。速いよ。
コロンまでの文字列抜き出すのは簡単だろう。

477:デフォルトの名無しさん
20/06/12 13:29:01.14 Qkj+08r5.net
速くしたいなら正規表現でマッチするかどうかなんてことやることそのものが間違いだとも思える。
同じPerl使うのであってもindex関数使うとか、他にやりようがあるんじゃないか?

478:デフォルトの名無しさん
20/06/12 14:03:27 Xic6e0Vs.net
大量のデータを効率よく扱うのは、データベース構築するのが正解

個人が扱う範囲だと、テキストで持って全検索で困らないけど、
量が増えるとそのうち破綻する

479:デフォルトの名無しさん
20/06/12 14:24:52 uUh54YqY.net
>466

$ln =~ /^(パターン):|(.*?)/
にすると、「^(パターン):」にマッチしないときに$1を空文字にできる。

480:デフォルトの名無しさん
20/06/12 14:50:38.25 uUh54YqY.net
ただ、(試してはいないが)if文のオーバーヘッドより、
関数呼び出しのオーバーヘッドのほうが大きいと思うけどな。

481:デフォルトの名無しさん
20/06/12 15:40:26.50 bpI5hVyH.net
そこまで速度に気にするならC++とかで書いた方がいい気がするね

482:デフォルトの名無しさん
20/06/17 18:41:04 TVwLVBUa.net
そんなデカいデータをよくパールでやるね。
C で書け。

483:デフォルトの名無しさん
20/06/28 09:30:04.48 mI+4+ud7.net
URLリンク(developers.srad.jp)
> Perl 7が発表される。実質的にはPerl 5系のリネーム
> ストーリー by hylom 2020年06月26日 17時08分
> 現代における素人にはオススメできない言語 部門より
現代における素人にはオススメできない言語
…なら、文字列処理をやりたい素人は何を学べばいいの?

484:デフォルトの名無しさん
20/06/28 11:26:26.20 OE2OIMMC.net
5の後継なら7にする必要あるの?

485:デフォルトの名無しさん
20/06/28 13:29:12.55 3gXsrtkR.net
>>484
事情を知らなくても最新版だとわかりやすくするために。
Perl6、Rakuがあるなかで、Perl5と言われたら古いとかEOLとかの疑いを持たれかねんから。
それに、必要であれば非互換も?

486:デフォルトの名無しさん
20/06/28 18:17:09 UG2zXSFM.net
お型付けできるようになったら嬉しいな

487:デフォルトの名無しさん
20/06/28 19:55:20.21 DGGKS5Fb.net
ついに後方互換捨てるのか!

488:デフォルトの名無しさん
20/07/02 21:44:39.67 wuNvV9ki.net
デフォルトの状態が変わるだけで
適宜オプションつければ後方互換も保てるらしいよ
Perlのこういうところ好きだわ

489:デフォルトの名無しさん
20/07/04 13:31:08.07 yrmljXci.net
今のところは、な・・・

490:デフォルトの名無しさん
20/07/04 18:51:36.50 25OQuAeP.net
Perl7は進化を求める
この10年で完全にオワコン言語になってしまった

491:デフォルトの名無しさん
20/07/04 19:41:56.61 +vSKr8nf.net
効率化して高速化しようとしても、過去に足を引っ張られる

492:デフォルトの名無しさん
20/07/04 19:48:46.40 VctW6lO7.net
単純に過去を切り捨てたら、Rakuの二の舞になる。過去を切り捨てるのであれば、
Python に勝てる程度の言語仕様にしなければ、見向きもされないだろう。
しかし、それはもう既にPerlではないだろう。

493:デフォルトの名無しさん
20/07/04 20:01:08.35 XHKaM396.net
Perlはこのままでいいと思う
レガシーなのがPerlの強さ

494:デフォルトの名無しさん
20/07/04 20:55:27.14 +vSKr8nf.net
negative legacy

495:デフォルトの名無しさん
20/07/05 01:06:23.02 BkxIDrcL.net
>>492
はい。
Wiki>「Perlに続く」という意味で、6月の次の誕生石(7月)のルビーから名付けられた

496:デフォルトの名無しさん
20/07/06 00:05:12.58 Dee8Pqdl.net
逆に頑張って作ったPerl6が古いみたいな感じになっちゃうな(´・ω・`)

497:デフォルトの名無しさん
20/07/06 02:55:32.01 pEZsiPGN.net
もうPerl6は存在しないからだいじょうぶ。

498:デフォルトの名無しさん
20/07/06 03:53:08.41 Lg+fAiJM.net
Perl6はさっさと開発中止すべきだったのになぜ続行したんだろう

499:デフォルトの名無しさん
20/07/06 19:42:39.82 5vDJxItj.net
ま、いいじゃねえか。新しい言語が一つ増えたようなもんだし。

500:デフォルトの名無しさん
20/07/06 21:20:03.77 pEZsiPGN.net
>>498
「すべき」って、おまえは何様なんや?
やりたい人がやってただけ。
結果としてうまくいかなかっただけ。

501:デフォルトの名無しさん
20/07/07 18:34:24.36 e1WbjzO/.net
うまくいくべき

502:デフォルトの名無しさん
20/07/07 18:40:58.31 /oL+BKEU.net
べきであるある

503:デフォルトの名無しさん
20/07/07 18:42:17.26 v8PkKQM3.net
>>500
何様ってw
匿名掲示板で何を言ってるのw
強いていうならPerlユーザーですw

504:デフォルトの名無しさん
20/07/07 19:01:21.20 e1WbjzO/.net
俺様

505:デフォルトの名無しさん
20/07/23 01:04:36 2kWEZYuR.net
___________________________________________

/media/xxx/DVD_HDVR/HDVR_SOB/*.SRO
というのが動画本体で、
SROファイルの構造は
000000-00007F 東芝ヘッダ
000080-007FFF (データA)
008000-00807F 東芝ヘッダ
008080-00FFFF (データB)
010000-01007F 東芝ヘッダ
010080-01FFFF (データC)
となっていて、東芝ヘッダからみたオフセット0x1C番地にある0x40値を=>0x00に書き換えるそうです。
東芝ヘッダは1つのファイルに複数ある(?)そうで、それらすべてを書き換える必要があるようです



これをperlスクリプトでお願いします

506:デフォルトの名無しさん
20/07/23 06:45:22.79 6LXR6fOg.net
binmodeで開いて、substr

507:デフォルトの名無しさん
20/07/23 19:03:52.69 2kWEZYuR.net
>>506
ありがとう
素人過ぎてわかんないけど

508:デフォルトの名無しさん
20/07/23 19:09:07.35 NaEhWCW1.net
コードそのものを書いてくれとさ

509:デフォルトの名無しさん
20/07/23 19:25:52.21 2kWEZYuR.net
同じような目的の別のスクリプトです
これに近いイメージでしょうか
(全文書くとブロックされる)
_________________________________________________________
HR_MANGR.IFOのコピー禁止フラグ解除は、
0x20 0x2C 0x23のシーケンスを0x20 0x24 0x23 に変更
perlスクリプトの例は以下のとおり。
# freeifo.pl
# HR_MANGR.IFOの変換
use strict;
use warnings;
my $infile = "HR_MANGR.IFO";
my $buf;
my $sTarget = " ,#"; # 0x20 0x2C 0x23
# ファイルのオープン
# バイナリモードに変更
binmode INFILE;
binmode OUTFILE;
my $sizIFO = -s $infile;
# IFOファイルを読み込み
# 0x20 0x2C 0x23 の並びがあれば、0x20 0x24 0x23 に置き換え
#他にあれば継続、無ければ終了
# ファイルのクローズ
close INFILE;
close OUTFILE;

510:デフォルトの名無しさん
20/07/24 04:55:58.03 6ZonvnML.net
そうそう。そんな感じ。
まあ頑張って。

511:デフォルトの名無しさん
20/07/24 09:07:49.48 So4dssPK.net
書き換える番地は、N は、0 以上で、以下の法則か?
0x8000 × N + ( 0x80 + 0x1C )
つまり、ヘッダは必ず、0x8000 毎にあるのか?

512:デフォルトの名無しさん
20/07/24 11:24:40.72 JRbdBOQM.net
>>511
レスありがとうございます
________________________________________________
SROファイルの書き換え
  000000-00007F 東芝ヘッダ
  000080-007FFF (データA)
  008000-00807F 東芝ヘッダ
  008080-00FFFF (データB)
  010000-01007F 東芝ヘッダ
  010080-01FFFF (データC)
  というふうに、0x8000バイトで1セットとなっている。
  東芝ヘッダとは、0x80バイトからなるデータブロック。途中に## Toshiba 〜という文字列を含んでいる
  東芝ヘッダのコピー禁止フラグ(CPP)のあるオフセット0x1Cを 0x40 ⇒ 0x00 に修正。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

1228日前に更新/240 KB
担当:undef