Perlについての質問箱 ..
[2ch|▼Menu]
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 に修正。

513:デフォルトの名無しさん
20/07/24 11:37:31.23 nuOKXnku.net
オレなら、バイナリーエディタの置換機能を使うと思うが。

514:デフォルトの名無しさん
20/07/24 11:40:12.29 61Z/1/Bp.net
数が多いとツール作った方が早い
手動でやってもツール作っても時間同じなら、ツール作った方がいい
仕事では、ツール作ったせいで余計に時間かかってもツール作る

515:デフォルトの名無しさん
20/07/24 11:53:07.60 JRbdBOQM.net
>>513
データが大きいのでLinuxのバイナリエディタでは上手く行かないのです

516:デフォルトの名無しさん
20/07/24 12:54:55.96 JRbdBOQM.net
URLリンク(i.imgur.com)
この文字列が一定間隔で現れます
データが大きいので>>514さんの言うとおりツール(スクリプト)で処理したいのです

517:デフォルトの名無しさん
20/07/24 15:39:03.44 EkE5sKTE.net
perl -e "binmode STDIN; binmode STDOUT; while (read STDIN, $_, 0x8000) { substr $_, 0x1c, 1, 0; print }" < IN > OUT
これが最短?

518:デフォルトの名無しさん
20/07/24 15:58:32.23 JRbdBOQM.net
>>517
レスありがとうございます
泣きそうです(解らなすぎて)
>>509のスクリプトはバイナリ修正したコピーファイルを作成するものでした
小さなファイルなので問題ないのですが、目的の対象ファイルは10GB~20GBもあるものなのでマネ出来ません

519:デフォルトの名無しさん
20/07/24 16:06:11.64 JRbdBOQM.net
>>509の全文です
URLリンク(i.imgur.com)
後出しのクセが強すぎすいません

520:デフォルトの名無しさん
20/07/24 16:07:20.05 UzZpGBU/.net
>>515
なるほどね。しかし、perlが扱えるデータ量にも、よく解らない限界があって、
巨大なデータを突っ込むと勝手に途中で切られたりするみたいだよ。
巨大なデータを扱うなら、seek関数みたいな低水準な手法を使う必要があるかもしれない。

521:デフォルトの名無しさん
20/07/24 16:48:28.89 EkE5sKTE.net
直接書き換えたいならこんなとか?
perl -e 'open F, "+< IN"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0";
seek F, -$l, 1; print F }'

522:デフォルトの名無しさん
20/07/24 17:06:33.72 61Z/1/Bp.net
別に短く書くコンテストではない

523:デフォルトの名無しさん
20/07/24 17:06:42.97 JRbdBOQM.net
>>521
ありがとうございます
Fはファイル名でよろしいでしょうか?(素人でごめんなさい)
Can't find string terminator "'" anywhere before EOF at -e line 1.
となります

524:デフォルトの名無しさん
20/07/24 17:29:22.03 JRbdBOQM.net
サンプルです
URLリンク(www.dropbox.com)
もしよろしければ暇つぶしに、ご指南いただけませんか?
(もう、いただいてますけど)

525:デフォルトの名無しさん
20/07/24 17:49:05.64 JRbdBOQM.net
よく考えたらダメだったw

526:デフォルトの名無しさん
20/07/24 19:45:46.20 lCl1FARv.net
GBレベルのファイルがオンメモリで処理できるわけないだろ。w

527:デフォルトの名無しさん
20/07/24 20:07:01.97 iJ+2fZSI.net
メモリが1TBあればヘーキヘーキ

528:デフォルトの名無しさん
20/07/24 20:38:39.07 So4dssPK.net
Stream 処理なら、バッファサイズ分のデータを、読んでは捨ててを繰り返すから、
必要なメモリサイズは、バッファサイズ分だけ
それか、seek みたいに、その番地をシークして、そこだけ書き換える

529:511
20/07/24 21:01:04.13 So4dssPK.net
0x8000 は、32,768 バイトだから、32 KiB。
(ただし、Kib は、1,000 倍ではなく、1,024 倍)
32 KiB * 32 個 = 1 MiB
1 GiB なら、 32個 * 1,024 = 32,768個
10GiB なら、0x8000サイズのブロックが、327,680個もあるの?
データ部分は固定サイズなの?
変動サイズで、そのサイズがヘッダ内に記録されているとかじゃないの?

530:デフォルトの名無しさん
20/07/24 21:50:07.62 EkE5sKTE.net
まーだやってたのか
>>523
perl -e 'open F, "+< ファイル名"; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, "\0"; seek F, -$l, 1; print F }'
がエラーになったのは Windows のコマンドプロンプトで試したんだろ
コマンドプロンプトでは ' でなく " を使ってこう
perl -e "open F, '+< ファイル名'; binmode F; while ($l = read F, $_, 0x8000) { substr $_, 0x1c, 1, qq/\0/; seek F, -$l, 1; print F }"
もちろん read や print は流れで残してただけでまったく必要ないから
perl -e "open F, q/+< ファイル名/; binmode F; seek F, 0x1c, 0; while (! eof F) { seek F, 0, 1; print F qq/\0/; seek F, 0x7fff, 1 }"
で十分なのは言うまでもない
コマンドラインで書き捨てじゃないならperl7で不可予定の F じゃなくて $fh にするかな

531:511
20/07/24 22:51:07.42 So4dssPK.net
くれぐれも、データのバックアップを取っておいてから、実験しろよ。
もし、プログラムが間違っていたら、回復できないから
そもそも、他人のプログラムの意味が分からないのに、
それをそのまま実行するのは、非常に危険!

532:532
20/07/24 23:35:26.56 Z8MDOpZc.net
Binary fileをupdateモードでopenして
目的の位置にseekしpackで元のファイルの内容を直接書き換える方法なら
URLリンク(docstore.mik.ua)

533:532
20/07/24 23:36:19.14 Z8MDOpZc.net
>>530 と内容が被った…orz

534:532
20/07/24 23:40:56.85 Z8MDOpZc.net
この辺調べてやってくだされぃ
URLリンク(www.google.co.jp)

535:532
20/07/24 23:45:28.89 Z8MDOpZc.net
先生ッ、便利そうなモジュール見つけました!
URLリンク(metacpan.org)

536:デフォルトの名無しさん
20/07/24 23:46:10.28 JRbdBOQM.net
>>530
検証に時間がかかってしまって返信遅くなりました
できました!! ありがとうございました!
推察の通りコマンドプロンプトでのエラーでした
本命のLinux(Ubuntu)の端末上からも書き換え成功しました
感謝です
ほかの皆様もありがとうございました
不愉快に感じた方も多かったと思います ごめんなさい
ここで「進捗状況表示(%)をさせるにはどうしたらいいですか?」とか聞くと嫌われることは、僕もいい大人なので知っています

537:デフォルトの名無しさん
20/07/24 23:48:59.17 JRbdBOQM.net
>>532
親切にありがとうございます

538:デフォルトの名無しさん
20/07/25 00:54:10.29 uhXYZAuD.net
進捗状況を表示させるには、最初にファイルサイズを取得する。
そして、データを書き換えるたびに、現在のseek 番地を取得して、
現在のseek 番地 × 100 / ファイルサイズ
例えば、300 × 100 / 1,000 = 30 %

539:デフォルトの名無しさん
20/07/25 01:23:46.28 c7rlqrmm.net
>>538
レスありがとうございます
本当にうれしいのですがド素人なので理解出来ないのです
>>530のコマンドラインに絡めるかスクリプトにしていただけると卒倒するほど喜びます
これを機会にperlを勉強したいと(心から)思いますが、今の段階ではこんな図々しいお願いをするしか出来ません

540:デフォルトの名無しさん
20/07/25 02:26:21.46 GJL3/5bG.net
もうええやろ?

541:デフォルトの名無しさん
20/07/26 01:36:51.87 5SabrGL+.net
>>539
死ねよ

542:デフォルトの名無しさん
20/07/26 02:35:47.46 T0U3lDAz.net
勉強する気はなしか
やれやれ

543:デフォルトの名無しさん
20/07/26 08:04:49.79 faz+YmuJ.net
進捗表示は、計算自体は簡単だけど、ちゃんと見えるように表示するのが
ちょっと面倒なんだよな

544:デフォルトの名無しさん
20/07/26 10:44:31.12 KWzmTFSY.net
好きなのを使えばいいよ。
URLリンク(metacpan.org)

545:デフォルトの名無しさん
20/07/26 11:13:19.32 faz+YmuJ.net
そんなもんがいちいちあるのか
まあ、凝ったことをするなら共通化はするだろうけど
凝ったことしなくても、どういう頻度で表示するかとかの調整は必要で、
UI特有の機能と関係ない面倒臭さの部分なんだよな

546:デフォルトの名無しさん
20/07/26 13:26:52.37 y3z4IjvW.net
ターミナルの機能を使いきるなら面倒だろうけど、ただ垂れ流すだけなら簡単やろ。

547:デフォルトの名無しさん
20/07/26 18:32:06.33 hRZi6+cn.net
>>512
最適化するとすると手順はこんな感じかな。
1. 0x1c バイト読んでそのまま書く。
2. 1バイト読む。読めなかったら 5 へ。読んだ内容が 0x40 なら 0x00 に変えて書く。0x40 でなければそのまま書く。
3. 最大 0x7fff バイト読み、読めたデータをそのまま書く。
4. 2へ。
5. 終わり。
STDIN から読んで STDOUT で書くならこうなる。
read(STDIN, $buf, 0x1c);
print $buf;
while (read(STDIN, $buf, 1)) {
 print $buf eq "\x40" ? "\x00" : $buf;
 read(STDIN, $buf, 0x7fff);
 print $buf;
}


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

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