【モダン推奨】Perlについての質問箱 50箱目
レス数が1000を超えています。これ以上書き込みはできません。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )
回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2
▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
while($str =~ s{(".*?)\t(.*?")}{$1 $2}){}
しかし、Perlを使うなら、文中で省略されている$_ のことは
知っておかないといけない。 タブ文字が複数あったら?とかダブルクォートが含まれてたら?とか、不安もいろいろ。
いわゆるExcelCSVなら、置換一発とはイカンやろな。
CSVモジュールでも探すか、マジメに自作するかして、セルごとに置換しないと個人的には落ち着かないな。 $_ などの特殊変数に依存したコードを書くと移植性と可読性が著しく低下する。
正規表現にまつわる特殊変数も厄介。別の正規表現が呼ばれて上書きされてしまうからすぐにコピーしないといけない。 ビットシフト演算の挙動の違いが表面化した
32bitと64bitのビルドの違いにより、1 << 32の結果が変わる
32bitのperlが2^32以上の整数を扱えない訳ではないので、
ビットシフト演算子を使わずにビットシフト演算子と同じことをやらないといけない
何か抜け道は無いもんか >>955
シフトするだけなら2倍したり2で割ってintにすれば良いのでは?
もっと大きなビットを扱いたい場合は Math::BigInt かな。 use bigint だと透過的にできることがわかった。
こんなのできたし。
$ perl -e 'use bigint; my $x = 1; $x <<= 256; print "$x\n"; if ($x & (1 << 256)){print "OK\n";}'
115792089237316195423570985008687907853269984665640564039457584007913129639936
OK
$
日本語訳された bigint のマニュアル
https://perldoc.jp/docs/modules/bignum-0.23/bigint.pod 何をしたいかというと、8byte単位の送信データがあって、
実際にはそれを64bitと見ていて、あるレコードは何bit目から何bit長、みたいに詰め込まれている
byte間とか平気でまたぐ
そういう64bitにデータをセットしたり取り出したり、という操作をしようと思うと、
1変数が64bitになっている方が楽に書ける
でも32bitの処理系だとできない ネットワークの通信データの取り出しなら unpack でフォーマットを N2 で配列または変数2個に取り出してからやれば楽なのでは? やれるとすっきりするけど、バイトオーダーやエンディアンがころころ変わるから、
何か落とし穴がありそう Perl の仕様が邪魔してるということなら Inline::C とかが役に立つかも。 pack, unpack は互換性重視していると思うが? 少なくともフォーマットの N 等は同じ4バイトだよ。
その辺どうしても信用できないなら自分専用の pack, unpack を作れば良いんじゃないかな。
そうすると pack, unpack と同じ形式である必要もないわけだが。 そういえば Perl のネイティブな整数のサイズって C のどれなのかな。
perlnumber には「perl をビルドする際に使われた C コンパイラが対応している形式」と
書かれてるけど。
ちなみに今使ってる環境では int ではなく long , long long と同じ 8 バイトのようだ。 Perl5のビルドはやった事ないので知らないが、多分デフォルトがCのintと同じで指定すれば変えられるって感じなのではないかな。
perl -V で実行するとそういう設定値が沢山出てくるよね。その中に intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
のようなものが出てくる。
そういや前に整数のバイト数でハマったことあったな。 fcntl() の F_SETLKW の時に渡す flock 構造体のバイナリで
pack('s2l3', F_WRLCK, SEEK_SET, 0, 0, 0) ってやっててうまく行ってたプログラムが別の環境に持って行って動かしたら
ロックが掛かったり掛からなかったりするようになり、良く調べてみたら pack の l は64bit環境でも 32bit 固定だが
struct flock の方は l_start, l_len が32bit OS では 4 バイト、64bit 環境では 8 バイトになっていた。
そもそも pack してバイナリにしなければいけないような引数の渡し方がいけないだけだとは思うが、結局どちらの
環境でも動くプログラムにするために pack('s2l5', F_WRLCK, SEEK_SET, 0, 0, 0, 0, 0) で誤魔化した。
やっぱこういうのは本来ならモジュール作ってそこで吸収した方が良いんだろうな。
と思ったらあった。
https://metacpan.org/pod/File::FcntlLock
是非デフォルトでこういうモジュールも perl と一緒にインストールされて欲しいものだな。 ありがとう。たまたま Perl のソースコードをダウンロードしてあるから
INSTALL を読んでみたら (いや、先に読んどけという話だが)
C コンパイラがサポートしてなくても use64bitint というオプションを使えば
整数のサイズが 64 ビットになるらしい。
Debian のパッケージでもこれを使ってるようだ。
C コンパイラの仕様は Config モジュールで得られるから
それを使って環境に合わせた処理が可能になる場合もあるが
Linux の flock 構造体はメンバの順番すら保証されてないようだから無理そう。 間違えた。「C コンパイラが」じゃなくて「CPU が」だ。
Configure を見た限りでは、8 バイト整数の型として採用する優先順位は
int, long, long long, int64_t の順で
8 バイトの型が無ければ Configure が失敗するようだ。
あっても CPU が対応してなくてライブラリで実現してるような環境だと
速度のためにあえて使わないという選択もあるかと思うが
long が 8 バイトだと強制的に使わされるようだ。
試せる環境が無いから勘違いしてるかもしれないが。 テーブルがあってインデックスで取り扱いたい
でもテーブルを作る時にカウンタとか意識したくない
配列なら
push @table, $data;
で済むけど、ハッシュにしたい
$table[$i]->data1 = $data1;
あるいは
$table->[$i]->data1 = $data1;
そんなことできたっけ 全部一度に判ってるなら、無名ハッシュをpushすればいいんだけど
ちょびちょび追加していきたい 親の方は無限ループにしておいて、適宜forkしてメインの処理をさせる
終わったら子はexitする
という作りで基本的にうまくいってるのに、たまに親が子だと思ってexitしとる
$pid = fork;
if (!$pid) {
exec($command);
exit;
}
この書き方に何か問題が? 親プロセスがwait $pid しないとゾンビが蓄積される。
それが続くと0ではなくundefを返すと思う。思うとしか言えないのはperldocに書かれてないから。
defined $pid でundefと0を区別する必要あり。
$!にResource temporarily unavailableのようなエラーが渡されるのでたぶんそう。
なのでちゃんと親プロセスがwait $pidすれば回避できる。 訂正。
perldoc -f forkにfork失敗時にundefを返すことが書かれてたわ やっぱり失敗してるんだよな
リトライするように直して試してみてるとこ
どういう理由で失敗するんだ?
activeperl windows版のforkもどきだからじゃないの? 今たまたま何かのリソースが全部埋まってて、一瞬待ってくれたら準備できるよ
なんだったら、リトライは隠蔽してくれて良さそうなもんなのに
IO関係はみんなそうなってる Perlはかなりの低レイヤーでも使われることがあるからな。
そんな冗長にはできんやろ。
そもそも、ぜんぜんwaitpid()しなかったらいずれ困るんだから、早くエラーになったほうがまし。 activeperlで
forkで返るpidがマイナスの値なんだけど、
Win32::Process::List で GetProcesses して得られるものとは別物なの? 疑似プロセスIDは、OSのプロセスIDとは別物なのか
要は、forkで分岐したプロセスがまだ生きてるかどうか親から周期的に監視したいんだけど
waitすると親が止まってしまうのでどうしたもんか perlのスレッドは標準IOやパイプの取り扱いが難しい、というか動きが怪しい シェルスクリプトではkill -0 PIDでプロセスが生きてるか調べられる!
そういう用途にはシェルスクリプトを使うべき! GetProcessesでpython.exeを見つければだいたい目的は達成するんだけど、
他に使ってる人がいると間違う 実行バイナリやシェルコマンドをP言語スクリプトから呼び出すソリューションが最も汎用性が高い
古事記にもそう書いてある そこもちゃんとユーチューバーのKANTのサロンで言ってる!って
語尾に付けないと このスレ、消費に9年以上かかってるとか盛者必衰の理をあらわしてて草 9年か・・・。Perlもずいぶんと長生きだね。
次スレ
【古典的モダン】Perlについての質問箱 51箱目
https://mevius.5ch.net/test/read.cgi/tech/1621994129/ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3413日 0時間 39分 17秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。