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辺り


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を超えています。これ以上書き込みはできません。

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