2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

【モダン推奨】Perlについての質問箱 50箱目

877 :デフォルトの名無しさん:2019/06/19(水) 04:59:38.60 ID:tVNS+22r.net
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/

878 :デフォルトの名無しさん:2019/11/02(土) 13:46:26.21 ID:smHgTNTv.net
package文で宣言するパッケージ名の階層と、
当該パッケージの置き場所のディレクトリの階層って
一致させねばいけないもの?それとも不一致でも無問題?

879 :デフォルトの名無しさん:2019/11/02(土) 14:00:04.49 ID:smHgTNTv.net
標準モジュールのソースコードを見ると、ディレクトリの階層とパッケージの宣言が一致している
(例えば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

どういうこっちゃ…

880 :デフォルトの名無しさん:2019/11/02(土) 16:01:49.62 ID:i/sKHoLN.net
慣習として一致させるものだけど、不一致にするような正当な理由があればそうしてもいい

881 :デフォルトの名無しさん:2019/11/02(土) 17:25:05.95 ID:gW/EBDV5.net
Perlの文脈としてわかりにくくなるだけで
なんのメリットも無い気がする

882 :デフォルトの名無しさん:2019/11/23(土) 11:23:39.89 ID:r11kVh6u.net
複数行からなるJSONファイルの読み込みって普通どうやるの?
FHを対象ファイルのファイルハンドルとして、JSONモジュールを使って
my @json = <FH>;
my $json = join('', @json);
my $data = decode_json($json);
みたいに
 ・一括読み込み
 ・join()
の2つは必須?
これだと機械生成されたJSONファイルがたまたま数ギガバイトあったりしたらどうするんじゃ…
というわけでエラーケースも考えたら1行づつ読み込みたいのですが、

883 :デフォルトの名無しさん:2019/11/23(土) 11:26:07.48 ID:r11kVh6u.net
自己解決しますたスマン、
ドキュメントを読んだら
 INCREMENTAL PARSING
というのセクションがあったわ;

884 :デフォルトの名無しさん:2019/12/10(火) 20:50:10.71 ID:1a1TW34R.net
pushする時に重複してたらpushしない拡張pushを作りたいとする
配列のリファレンスと値を渡す

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

これを何とかundefも受け付けるようにできないもんか
普通に考えるとできないんだけど

885 :デフォルトの名無しさん:2019/12/11(水) 10:26:34 ID:dG8VWZ74.net
>>884
undefの時にどのように動いて欲しいのか?

886 :デフォルトの名無しさん:2019/12/11(水) 20:22:08.85 ID:xy3VmN4D.net
自作関数の中でリファレンスに[]宣言すればいいだけじゃねーの
# 俺と同じ発想なら、だけど。

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 ] ;

887 :デフォルトの名無しさん:2019/12/11(水) 20:35:25.81 ID:xy3VmN4D.net
×リファレンスに[]宣言
○元の変数にリファレンス宣言

888 :デフォルトの名無しさん:2019/12/12(木) 18:58:31.26 ID:3Xh4/du7.net
$_ がエイリアスだからできるのか
普通は危ないから左辺値にしないよな

889 :デフォルトの名無しさん:2019/12/12(木) 21:46:01.56 ID:8fLoSBsV.net
my @tmp = map { hogehoge } ( (ref $_[0]) ? @$_[0] : () );

こんなんで動かないかね?

890 :デフォルトの名無しさん:2019/12/12(木) 21:56:12.99 ID:3Xh4/du7.net
読みにくく書いても得しないからなあ

$_ を使わずに実現する方法があればそうしたい

891 :デフォルトの名無しさん:2019/12/12(木) 22:06:26.14 ID:V4YdibXT.net
>普通は危ないから左辺値にしないよな
理解してりゃ、危なくもなんともないと思うが、、、

892 :デフォルトの名無しさん:2019/12/12(木) 22:25:24.61 ID:V4YdibXT.net
>>890
だったらコンセプト変えて普通にプロトタイプ使え
sub pushm (¥@@){
my $arr = shift ;
my %h ;
push @{$arr}, grep { ! $h{$_} ++ } @{$arr} , @_ ;
}
my $arr ;
pushm @{$arr}, 1, 2, 3, 4 ;

コードの変更は殆どいらなくて、且つ自作変数の外側で、
(暗黙の)初期化をせざるを得ないから、$_[0] への初期化は
しなくてすむ。

893 :デフォルトの名無しさん:2019/12/12(木) 22:28:33.66 ID:V4YdibXT.net
ああ、コード間違えてるけど、>>886のコード流用してくれ

894 :デフォルトの名無しさん:2019/12/13(金) 00:04:09.33 ID:Oz2tw7ml.net
$_と@_の区別すら付いてない奴に教える必要なんかねえよ

895 :デフォルトの名無しさん:2019/12/13(金) 18:59:29.78 ID:xux/XkmF.net
こういう時にプロトタイプが役立つのか

sub func(\@@);
とプロトタイプが書いてあって、perlは使えるけどプロトタイプ知らない人に、
この関数呼び出してみろって言ったら、10人が10人
func(\@array1, @array2);
って書くと思うな

896 :デフォルトの名無しさん:2019/12/13(金) 23:43:34.11 ID:tge0kpAy.net
それでもちゃんと呼び出せるからべつにいいやん。

897 :デフォルトの名無しさん:2019/12/13(金) 23:53:07.48 ID:Roals1MV.net
(\@∀@)

898 :デフォルトの名無しさん:2019/12/14(土) 00:01:01.77 ID:C/H6m2n1.net
配列をコンマで区切って並べると、多次元配列にならずに配列が繋がるだけ
というシンプルな仕様が仇になってるんだよな

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

ということで、呼び出し側では実引数を渡しているように見えて、
裏ではリファレンスで受け取るというねじれが生じていて、
プロトタイプでそのねじれを吸収している

899 :デフォルトの名無しさん:2019/12/14(土) 08:31:07.01 ID:tdigeeoh.net
>>895
10人中一人は
my $arr ; my @arr ;
&func($arr, @arr);

って書いて、>>884みたいに「undefだったら動かない」って
首をひねるハメになる。

900 :デフォルトの名無しさん:2019/12/14(土) 08:37:29.90 ID:tdigeeoh.net
通常は、プロトタイプ使ったサブルーチンはモジュールの中に隔離して
perldocだけ読ませて使わせるから、>>895の問題は生じないんだけどなw
個人のコードでどう扱うかは知らん。

代表的なプロトタイプのコードの例↓(List::MoreUtilsの古いバージョン)
https://fastapi.metacpan.org/source/ADAMK/List-MoreUtils-0.33/lib/List/MoreUtils.pm

901 :デフォルトの名無しさん:2019/12/14(土) 09:03:25.68 ID:C/H6m2n1.net
>>899
それエラーになるだけ

902 :デフォルトの名無しさん:2019/12/14(土) 09:22:43.70 ID:tdigeeoh.net
>>901
ん?
「&つけて呼び出すと、プロトタイプを無視する」って言う
古くからある悪名高い挙動が変更になったのか?
すまんが俺は古いバージョンでレスってたわ。

それだったら喜ばしい事だね。

903 :デフォルトの名無しさん:2019/12/14(土) 10:07:00.59 ID:tdigeeoh.net
暇だったから、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

904 :デフォルトの名無しさん:2019/12/14(土) 11:03:07.43 ID:6h9Np3wz.net
ふつうに関数を呼び出すのにわざわざ&をつけるようなヤツは、10人に1人もいねえよ。w

905 :デフォルトの名無しさん:2019/12/14(土) 11:20:47.16 ID:FPT3g5nH.net
いないとどれだけ楽か(泣)
「KENT-webに書いてありましたよ」
「」

906 :デフォルトの名無しさん:2019/12/14(土) 11:36:46.61 ID:tdigeeoh.net
>>904
そのレスは>>901がレスる前に欲しかったなw
無駄な作業しなくて済んだし、恥もかかずに済んだw

907 :デフォルトの名無しさん:2019/12/15(日) 00:13:17.48 ID:uHh4aFtn.net
&つけるのって少数派なのか
俺絶対つけてるけど
ある現場で「え、今そんなのつけませんよ…」ってちょっと引いてすらいる感じで言われたことある
まあもうその現場もrailsになったはずだけど

908 :デフォルトの名無しさん:2019/12/15(日) 00:30:38.21 ID:gPijPjuC.net
C言語でもautoって書いてそうだ

909 :デフォルトの名無しさん:2019/12/15(日) 01:55:45.57 ID:EMEs5NEs.net
Perl5で&を使うのは、関数リファレンスを解決するときだけやろ。

>>905
Perl4レベルの遺跡やな。
もう昔々のことだから、忘れてやれ。。。

910 :デフォルトの名無しさん:2019/12/15(日) 02:19:39 ID:uHh4aFtn.net
これは関数であるって目印としてつけてる
俺の中では可読性の為
つけないのはData::Dumper()とかモジュールから直で呼ぶ場合だけかな

911 :デフォルトの名無しさん:2019/12/15(日) 07:37:43.49 ID:R35TvKP/.net
呼出で挙動がかわるの、充分に分ってるなら「個人で使うなら」いいんじゃねーの?

912 :デフォルトの名無しさん:2019/12/15(日) 07:43:22.45 ID:R35TvKP/.net
プロトタイプの呼出以外にも
@_ = (1,2,3,4) ; &func ;
で特殊挙動するし、地雷だらけだよXXルーチン

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

>>909
「perl, XXルーチン」でググると検索上位に来るんだよ、今でも

913 :デフォルトの名無しさん:2019/12/15(日) 07:46:10 ID:gPijPjuC.net
サブルーチン

914 :デフォルトの名無しさん:2019/12/15(日) 07:47:19 ID:KI19HfKk.net
teratailのサブルーチン絡みの質問斜め見て、頭痛くなったわ。
質問者はしょうがないとしても、回答で&付けるってどういう了見だ?

915 :デフォルトの名無しさん:2019/12/15(日) 07:48:41 ID:R35TvKP/.net
俺の環境だけかよorz…

916 :デフォルトの名無しさん:2019/12/15(日) 08:32:32 ID:KI19HfKk.net
>>906
お作法本全盛期(2010年代前半)なら、相手はお作法本を読んでる可能性がある。
引いてる程度じゃなくて、どん引きされたのかもよ
# お作法本: Perl ベストプラクティス、Effective Perl etc.

KENT-webもだけど、お作法本インスパイヤで、オレオレお作法のページが
山程あるのも滅んで欲しいわ。

917 :デフォルトの名無しさん:2019/12/15(日) 08:34:58 ID:KI19HfKk.net
アンカミス
×>>906
>>907

918 :デフォルトの名無しさん:2019/12/15(日) 08:46:16 ID:gPijPjuC.net
作法は一つではない

919 :デフォルトの名無しさん:2019/12/15(日) 08:51:11 ID:KI19HfKk.net
一つじゃないのは当たり前
けど、オレオレお作法のページはいらない

920 :デフォルトの名無しさん:2019/12/20(金) 00:38:27.17 ID:nzfj8t5I.net
Perl6無くなったんだね。今更知った。
新言語「Raku」として生きていくそうな
https://ja.wikipedia.org/wiki/Raku

921 :デフォルトの名無しさん:2019/12/20(金) 00:57:05.41 ID:cphYS5E7.net
YAPC が YARC になって ヤラしい

922 :デフォルトの名無しさん:2019/12/20(金) 06:50:52.69 ID:GiJ3WKor.net
keysがスカラを引数に取れるせいで、なんか間違った書き方してる所があちこちある
どっちでも大抵は動くけど、エラーで止まりやすい
明示的にデリファレンスしてればエラーにはならない

923 :デフォルトの名無しさん:2019/12/20(金) 07:10:52.86 ID:8NcASRwh.net
それ、実験的に5.14から搭載されて、5.24で削除された機能
エラーで止るのは環境依存か、書き手がヘボか

そもそも使うんじゃねー、ってのが主旨なら、同意

924 :デフォルトの名無しさん:2020/02/14(金) 23:14:26 ID:x2wQj3nb.net
配列があって、条件に合わないものを削りたい
0 .. $#array に対してループしながらspliceすると、
$i-- でも redo でもなんか不安がある

どうするのが定番なんだろう

925 :デフォルトの名無しさん:2020/02/15(土) 13:11:27 ID:Slu9Ub4W.net
grep { $_ > 0 } @array

926 :デフォルトの名無しさん:2020/02/15(土) 18:06:37 ID:jU+J++ht.net
@array = grep { $_ > 0 } @array
とやって平気な気がしない

別の配列を用意していいなら既に出来ていて、
それを何とかすっきりできないかと

927 :デフォルトの名無しさん:2020/02/15(土) 19:06:58.27 ID:Slu9Ub4W.net
(平気な気がしないとか言われても知らんがな)
まず「すっきりできる」を定義してください

928 :デフォルトの名無しさん:2020/02/15(土) 19:20:44 ID:jU+J++ht.net
ああー
逃げに入っちゃった

929 :デフォルトの名無しさん:2020/02/15(土) 23:03:36 ID:pIpzwBTs.net
spliceするのはよくない気がする→何が定番なんだろうって話だと
grepが定番でしょ
別に結果配列用意するのでもいいんじゃないの

930 :デフォルトの名無しさん:2020/02/15(土) 23:40:20 ID:KTVOtCHP.net
spliceの、僕が考えた最強関数的な仕様はイヤかも。
もっと構文レベルで同じことができると良かった。

931 :デフォルトの名無しさん:2020/05/09(土) 14:56:48 ID:KF1jgHuK.net
WindowsでPerlを使いたいんですが、どれが良いですか。
ActivePerlはアンインストールしてもゴミが残るそうなので避けたいのですが。

932 :デフォルトの名無しさん:2020/05/09(土) 18:21:47 ID:HzJsK433.net
ストロベリーパニック

933 :デフォルトの名無しさん:2020/05/09(土) 18:51:24 ID:/Z4Vk9Yy.net
Windows10, WSL, Ubuntu 18.04 なら、最初から入っているけど

file `which perl`
/usr/bin/perl: ELF 64-bit LSB shared object 以下省略

934 :デフォルトの名無しさん:2020/05/27(水) 01:20:04.31 ID:VqjzWrQC.net
Perlを勉強しています。
「use constant」で定義したハッシュのキーを
keys関数で取り出したいのですが出来ません。
どのような方法で取り出せますか?

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

宜しくお願いします。

935 :デフォルトの名無しさん:2020/05/27(水) 01:33:03 ID:h9Mc4KsU.net
use constant H => { a=>'AAA', b=>'BBB' };

foreach (keys %{H()}) {
print $_, "\n";
}

936 :デフォルトの名無しさん:2020/05/27(水) 02:12:19.49 ID:VqjzWrQC.net
>>935
ぬおおおおっ…Perlムズイっす。
「H()」この部分はハッシュへの参照を返してるのだと思うのですが、
実体はサブルーチンだったのですね!「&H」でも上手く行きました。

937 :934:2020/05/27(水) 03:05:09.48 ID:VqjzWrQC.net
>>935
お礼を記し忘れていました。
ありがとうございました。

938 :デフォルトの名無しさん:2020/05/27(水) 05:13:22.61 ID:ISGE1WR5.net
Perl は難しすぎる。
Ruby では、

hash = { a: 1, b: 2 }

hash.each_key { |key| p key }

出力。:a などはシンボル
:a
:b

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

結果:
a
b

>>935は、「use constant」で定義したハッシュのキーの事です。

940 :615:2020/05/27(水) 08:50:36.01 ID:Bt/CFCtA.net
constantの実体は値を返すsubなので、%{}でデリファレンスしてね

941 :デフォルトの名無しさん:2020/09/28(月) 17:41:16.96 ID:7jydyBLu.net
(?:)
をいつも忘れるんだが、何かいい覚え方は無いだろうか

942 :デフォルトの名無しさん:2020/09/28(月) 19:13:20.83 ID:SgTMPvZg.net
>>941
何を忘れんの?
「?」?「:」?
さすがに「()」は忘れんよな?

943 :デフォルトの名無しさん:2020/10/04(日) 23:18:25.80 ID:4IGvE5yV.net
>>941
いいじゃんべつに。気にせず普通の括弧にして捨てろ。

944 :デフォルトの名無しさん:2020/10/05(月) 07:42:46.02 ID:c4eZ6okl.net
ずれるやん

945 :デフォルトの名無しさん:2020/10/07(水) 12:09:24.93 ID:70BaWviw.net
>>941
後で参照する ? 単に丸括弧を使う : 丸括弧内に「何か」を入れる
さて、「何か」とは、一体何だっただろうか?そうだ、三項演算子だ!

…と覚える。

946 :デフォルトの名無しさん:2020/10/07(水) 13:37:28.91 ID:TO7pfOqH.net
>>945
「(?」でひとつとするべき。
その次に「:」「!」などが修飾子としてつく。

947 :デフォルトの名無しさん:2020/10/07(水) 15:33:40.38 ID:GbKtGfRD.net
あと、マッチングのオプションのsとmも毎回検索してる
最初に思うのは大抵逆

948 :デフォルトの名無しさん:2020/10/08(木) 09:33:52.95 ID:e3wo1zjN.net
(?シリーズをいろいろ使ってれば、あとは:だけだけど、
そもそも(?:しか使わないんだよな
いろいろ便利そうな拡張ではあるけどこれ以上可読性下げてどうする

949 :デフォルトの名無しさん:2020/10/09(金) 14:54:01.89 ID:JXQ8Trls.net
TABをデリミタにしてデータが1行に並んでいる
但し、""で囲まれていれば内部にTABを使ってもよい

というルールのデータに対して、""に囲まれているTABをスペースで置換したい
どう書けばいい?

950 :デフォルトの名無しさん:2020/10/11(日) 19:55:14.93 ID:LEwrAD/J.net
多分、これでいけると思う。

while(s{(".*?)\t(.*?")}{$1 $2}){}

951 :デフォルトの名無しさん:2020/10/11(日) 21:05:02.09 ID:OOWRCRR6.net
どうやって使うかすら判らん

952 :デフォルトの名無しさん:2020/10/11(日) 22:14:06.89 ID:LEwrAD/J.net
while(<>){
while(s{(".*?)\t(.*?")}{$1 $2}){}
print;
}

これで解らないなら、「Perlの入門書をよく読みましょう」
としか言えないのだが。

953 :デフォルトの名無しさん:2020/10/11(日) 22:42:11.43 ID:OOWRCRR6.net
せめて入力が$strとかになってないと

954 :デフォルトの名無しさん:2020/10/11(日) 23:29:39.25 ID:LEwrAD/J.net
while($str =~ s{(".*?)\t(.*?")}{$1 $2}){}

しかし、Perlを使うなら、文中で省略されている$_ のことは
知っておかないといけない。

955 :デフォルトの名無しさん:2020/10/11(日) 23:56:48.98 ID:LtBR6JI3.net
タブ文字が複数あったら?とかダブルクォートが含まれてたら?とか、不安もいろいろ。
いわゆるExcelCSVなら、置換一発とはイカンやろな。

CSVモジュールでも探すか、マジメに自作するかして、セルごとに置換しないと個人的には落ち着かないな。

956 :デフォルトの名無しさん:2021/03/25(木) 23:19:00.52 ID:BFmdRR/m.net
$_ などの特殊変数に依存したコードを書くと移植性と可読性が著しく低下する。
正規表現にまつわる特殊変数も厄介。別の正規表現が呼ばれて上書きされてしまうからすぐにコピーしないといけない。

957 :デフォルトの名無しさん:2021/04/05(月) 00:24:54.71 ID:SDYSIyNbI
フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、
掲載案件数15万件突破!さらにリモートワークの掲載案件数4,000件突破!
https://prtimes.jp/main/html/rd/p/000000010.000038976.html
ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始
https://prtimes.jp/main/html/rd/p/000000035.000047639.html
ITフリーランスの独立支援サービス『テックビズ』とフリーランス向け報酬即日払いサービス『先払い』提携開始
https://prtimes.jp/main/html/rd/p/000000034.000047639.html
新潟県、移住してきたテレワーカー/フリーランスに最大50万円を支給
https://internet.watch.impress.co.jp/docs/news/1287094.html
茨城県日立市、県外からの「テレワーク移住者」に最大151万円の助成金
https://internet.watch.impress.co.jp/docs/news/1281120.html
長野市、市内に移転・事業所設置し、移住することで最大550万円の支援金を支給
https://internet.watch.impress.co.jp/docs/news/1274735.html
フリーランスが活用できる「最大1,000〜3,000万円・補助率50%〜75%」の
『ものづくり・商業・サービス補助金』とは?概要や条件を解説
https://freenance.net/media/money/4255/
新型コロナの影響で、常駐型フリーランスエンジニアのリモート対応が増加
https://codezine.jp/article/detail/13800

958 :デフォルトの名無しさん:2021/04/28(水) 14:52:38.35 ID:RETJLOh2.net
ビットシフト演算の挙動の違いが表面化した
32bitと64bitのビルドの違いにより、1 << 32の結果が変わる

32bitのperlが2^32以上の整数を扱えない訳ではないので、
ビットシフト演算子を使わずにビットシフト演算子と同じことをやらないといけない
何か抜け道は無いもんか

959 :デフォルトの名無しさん:2021/04/30(金) 18:29:08.85 ID:m/tHuDzV.net
>>958
シフトするだけなら2倍したり2で割ってintにすれば良いのでは?
もっと大きなビットを扱いたい場合は Math::BigInt かな。

960 :デフォルトの名無しさん:2021/04/30(金) 19:23:07.21 ID:vAph35tm.net
もっそい遅いんだっけ

961 :デフォルトの名無しさん:2021/04/30(金) 19:31:00.11 ID:m/tHuDzV.net
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

962 :デフォルトの名無しさん:2021/04/30(金) 19:43:01.50 ID:vAph35tm.net
何をしたいかというと、8byte単位の送信データがあって、
実際にはそれを64bitと見ていて、あるレコードは何bit目から何bit長、みたいに詰め込まれている
byte間とか平気でまたぐ
そういう64bitにデータをセットしたり取り出したり、という操作をしようと思うと、
1変数が64bitになっている方が楽に書ける
でも32bitの処理系だとできない

963 :デフォルトの名無しさん:2021/05/01(土) 05:00:07.50 ID:R5WysE71.net
ネットワークの通信データの取り出しなら unpack でフォーマットを N2 で配列または変数2個に取り出してからやれば楽なのでは?

964 :デフォルトの名無しさん:2021/05/01(土) 09:00:30.12 ID:/n1q7kUC.net
やれるとすっきりするけど、バイトオーダーやエンディアンがころころ変わるから、
何か落とし穴がありそう

965 :デフォルトの名無しさん:2021/05/01(土) 09:21:38.72 ID:ZNKsJp5F.net
Perl の仕様が邪魔してるということなら Inline::C とかが役に立つかも。

966 :デフォルトの名無しさん:2021/05/01(土) 16:05:36.08 ID:R5WysE71.net
pack, unpack は互換性重視していると思うが? 少なくともフォーマットの N 等は同じ4バイトだよ。
その辺どうしても信用できないなら自分専用の pack, unpack を作れば良いんじゃないかな。
そうすると pack, unpack と同じ形式である必要もないわけだが。

967 :デフォルトの名無しさん:2021/05/01(土) 18:01:49.35 ID:/n1q7kUC.net
そんなようなことをしてるのが現状の実装

968 :デフォルトの名無しさん:2021/05/02(日) 17:15:11.59 ID:9gapCdI8.net
そういえば Perl のネイティブな整数のサイズって C のどれなのかな。
perlnumber には「perl をビルドする際に使われた C コンパイラが対応している形式」と
書かれてるけど。
ちなみに今使ってる環境では int ではなく long , long long と同じ 8 バイトのようだ。

969 :デフォルトの名無しさん:2021/05/03(月) 17:40:45.60 ID:UFgXt23Q.net
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 と一緒にインストールされて欲しいものだな。

970 :デフォルトの名無しさん:2021/05/04(火) 07:28:36.10 ID:2rafzDNd.net
ありがとう。たまたま Perl のソースコードをダウンロードしてあるから
INSTALL を読んでみたら (いや、先に読んどけという話だが)
C コンパイラがサポートしてなくても use64bitint というオプションを使えば
整数のサイズが 64 ビットになるらしい。
Debian のパッケージでもこれを使ってるようだ。

C コンパイラの仕様は Config モジュールで得られるから
それを使って環境に合わせた処理が可能になる場合もあるが
Linux の flock 構造体はメンバの順番すら保証されてないようだから無理そう。

971 :デフォルトの名無しさん:2021/05/04(火) 11:47:57.60 ID:2rafzDNd.net
間違えた。「C コンパイラが」じゃなくて「CPU が」だ。
Configure を見た限りでは、8 バイト整数の型として採用する優先順位は
int, long, long long, int64_t の順で
8 バイトの型が無ければ Configure が失敗するようだ。
あっても CPU が対応してなくてライブラリで実現してるような環境だと
速度のためにあえて使わないという選択もあるかと思うが
long が 8 バイトだと強制的に使わされるようだ。
試せる環境が無いから勘違いしてるかもしれないが。

972 :デフォルトの名無しさん:2021/05/04(火) 16:45:05.36 ID:xGoTe+aq.net
さいですか

973 :デフォルトの名無しさん:2021/05/04(火) 16:56:22.60 ID:1LbVAR3E.net
きりんです

974 :デフォルトの名無しさん:2021/05/04(火) 16:58:56.75 ID:siU8Ev75.net
なんできりんなんだよ
そこはラクダだろ

975 :デフォルトの名無しさん:2021/05/04(火) 17:08:17.38 ID:FheU4VJA.net
でも象さんのほうがもっと好きです

976 :デフォルトの名無しさん:2021/05/05(水) 15:08:24.73 ID:CxAIF4J7.net
テーブルがあってインデックスで取り扱いたい
でもテーブルを作る時にカウンタとか意識したくない

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

そんなことできたっけ

977 :デフォルトの名無しさん:2021/05/05(水) 15:53:07.29 ID:zZpLK+nt.net
日本語でおk

978 :デフォルトの名無しさん:2021/05/05(水) 16:00:54.87 ID:CxAIF4J7.net
全部一度に判ってるなら、無名ハッシュをpushすればいいんだけど
ちょびちょび追加していきたい

979 :デフォルトの名無しさん:2021/05/06(木) 21:44:26.70 ID:ajjDZVcw.net
君が何をしたいのかよくわからない。

980 :デフォルトの名無しさん:2021/05/06(木) 21:49:53.54 ID:WUloT9c9.net
->data1は->{data1}の間違い

981 :デフォルトの名無しさん:2021/05/16(日) 14:19:41.36 ID:vhU8s59y.net
pontiffがprintfに見える

982 :デフォルトの名無しさん:2021/05/24(月) 07:52:58.62 ID:GjHEXSDD.net
親の方は無限ループにしておいて、適宜forkしてメインの処理をさせる
終わったら子はexitする

という作りで基本的にうまくいってるのに、たまに親が子だと思ってexitしとる
$pid = fork;
if (!$pid) {
exec($command);
exit;
}
この書き方に何か問題が?

983 :デフォルトの名無しさん:2021/05/24(月) 08:16:28.74 ID:INcwcLMt.net
親プロセスがwait $pid しないとゾンビが蓄積される。
それが続くと0ではなくundefを返すと思う。思うとしか言えないのはperldocに書かれてないから。
defined $pid でundefと0を区別する必要あり。
$!にResource temporarily unavailableのようなエラーが渡されるのでたぶんそう。
なのでちゃんと親プロセスがwait $pidすれば回避できる。

984 :デフォルトの名無しさん:2021/05/24(月) 08:19:17.40 ID:INcwcLMt.net
訂正。
perldoc -f forkにfork失敗時にundefを返すことが書かれてたわ

985 :デフォルトの名無しさん:2021/05/24(月) 08:22:50.85 ID:GjHEXSDD.net
やっぱり失敗してるんだよな
リトライするように直して試してみてるとこ

どういう理由で失敗するんだ?
activeperl

986 :デフォルトの名無しさん:2021/05/24(月) 13:11:06.83 ID:SHUy6n38.net
windows版のforkもどきだからじゃないの?

987 :デフォルトの名無しさん:2021/05/24(月) 13:35:57.27 ID:INcwcLMt.net
macOSでも起きるよ

988 :デフォルトの名無しさん:2021/05/24(月) 13:56:03.81 ID:GjHEXSDD.net
今たまたま何かのリソースが全部埋まってて、一瞬待ってくれたら準備できるよ
なんだったら、リトライは隠蔽してくれて良さそうなもんなのに
IO関係はみんなそうなってる

989 :デフォルトの名無しさん:2021/05/24(月) 16:23:07.38 ID:mQhym/iw.net
Perlはかなりの低レイヤーでも使われることがあるからな。
そんな冗長にはできんやろ。

そもそも、ぜんぜんwaitpid()しなかったらいずれ困るんだから、早くエラーになったほうがまし。

990 :デフォルトの名無しさん:2021/05/25(火) 22:10:30.48 ID:z8jztsTP.net
activeperlで
forkで返るpidがマイナスの値なんだけど、
Win32::Process::List で GetProcesses して得られるものとは別物なの?

991 :デフォルトの名無しさん:2021/05/25(火) 22:38:53.48 ID:/Axm+K1V.net
>>990
かもね。
聞く前にドキュメントを読め!

https://docs.activestate.com/activeperl/5.28/perl/perlfork.html

992 :デフォルトの名無しさん:2021/05/25(火) 22:59:31.10 ID:z8jztsTP.net
疑似プロセスIDは、OSのプロセスIDとは別物なのか

要は、forkで分岐したプロセスがまだ生きてるかどうか親から周期的に監視したいんだけど
waitすると親が止まってしまうのでどうしたもんか

993 :デフォルトの名無しさん:2021/05/25(火) 23:54:54.75 ID:/Axm+K1V.net
別スレッドでsystem()ではアカンのか?

994 :デフォルトの名無しさん:2021/05/26(水) 07:17:11.86 ID:niBt7hlg.net
スレッド使ったことない

995 :デフォルトの名無しさん:2021/05/26(水) 08:32:40.50 ID:VVGa10VW.net
perlのスレッドは標準IOやパイプの取り扱いが難しい、というか動きが怪しい

996 :デフォルトの名無しさん:2021/05/26(水) 09:53:00.68 ID:+WmbAELr.net
シェルスクリプトではkill -0 PIDでプロセスが生きてるか調べられる!
そういう用途にはシェルスクリプトを使うべき!

997 :デフォルトの名無しさん:2021/05/26(水) 09:53:29.06 ID:+WmbAELr.net
ユーチューバーのKENTとかも言ってる!

998 :デフォルトの名無しさん:2021/05/26(水) 10:20:29.11 ID:niBt7hlg.net
GetProcessesでpython.exeを見つければだいたい目的は達成するんだけど、
他に使ってる人がいると間違う

999 :デフォルトの名無しさん:2021/05/26(水) 10:37:03.92 ID:VVGa10VW.net
実行バイナリやシェルコマンドをP言語スクリプトから呼び出すソリューションが最も汎用性が高い
古事記にもそう書いてある

1000 :デフォルトの名無しさん:2021/05/26(水) 10:40:21.49 ID:+WmbAELr.net
そこもちゃんとユーチューバーのKANTのサロンで言ってる!って
語尾に付けないと

1001 :デフォルトの名無しさん:2021/05/26(水) 10:48:36.67 ID:VVGa10VW.net
このスレ、消費に9年以上かかってるとか盛者必衰の理をあらわしてて草

1002 :デフォルトの名無しさん:2021/05/26(水) 11:00:06.47 ID:+WmbAELr.net
9年か・・・。Perlもずいぶんと長生きだね。

次スレ

【古典的モダン】Perlについての質問箱 51箱目
https://mevius.5ch.net/test/read.cgi/tech/1621994129/

1003 :デフォルトの名無しさん:2021/05/26(水) 11:35:56.72 ID:a7TiWa6C.net
質問してもええか? ええのんか?

1004 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1004
248 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★