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

レス数が950を超えています。1000を超えると書き込みができなくなります。
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辺り


2019/01/07(月) 23:09:39.45ID:06kCHHmC
あれはあかんだろ
2019/01/08(火) 13:40:47.95ID:4YYD5GZN
そもそもperlにポインタという用語はないのでポインタポインタと言われても何を言いたいのかわからない
「リファレンス」と「ポインタ」と両方使ってるからリファレンスのことをポインタと呼んでるのでもないようだし
860856
垢版 |
2019/01/08(火) 20:29:21.03ID:2ynCXf4r
>>857
おっと、削除されたんか。
たしかに今さらまぎらわしい機能だったから、残念でもないし当然。
2019/01/08(火) 20:52:29.76ID:wX3Q4heR
ここはperl6のスレですか?
862デフォルトの名無しさん
垢版 |
2019/01/09(水) 12:59:04.70ID:xuLfg6C4
>>861
いや。決まってないけどだいたい5。
2019/01/09(水) 14:07:02.03ID:Z1NH8E36
6やるなら流石にぱいそんとかるびーに行くよね
ディストリビューションのデフォルトが6になったら別だけど
2019/01/09(水) 15:16:50.41ID:YARXrpzb
Perl6/Parrotスレ - Part2
https://medaka.5ch.net/test/read.cgi/php/1162721943/

Perl6のスレが無いわけでもないが、閑散としているな。
2019/01/09(水) 18:51:53.85ID:JvHk+PyX
いろんな現場を渡り歩くからなあ
perlは無かったことが無いけど、今のとこにpythonは無い
rubyは何故かある
2019/01/09(水) 22:57:14.81ID:bKnxXw4g
perl はすでにGit for Windowsの一部だし。
867デフォルトの名無しさん
垢版 |
2019/01/13(日) 23:01:19.72ID:V4Yo7Lhe
スレタイのモダンってなに?
2019/01/13(日) 23:21:10.89ID:WrQFCZ8r
>>859
当時の流行。
2019/01/13(日) 23:21:52.81ID:WrQFCZ8r
↑アンカミスorz
2019/01/14(月) 07:44:40.25ID:E5iBbbFr
近代のことで、日本史的には明治維新から終戦まで
2019/01/15(火) 08:57:17.72ID:G1ZK+rbt
この↓本スレが去年の2月に終わったけれど、誰も新スレを立てられなかったみたいなんだよ。

Perlについての質問箱 63箱目
https://mevius.5ch.net/test/read.cgi/tech/1392820583/

そこで、「モダン推奨」な人が立てたこの隔離スレが本スレの代わりになっている。
本当に誰か「モダン推奨」が無い新スレ立てられない?
2019/01/15(火) 10:20:42.87ID:weoqLEpo
今となってはPerl自体レガシーだし、
そのモダンの人とやらもいないんじゃね?
確かに一時期「これからはモダンが〜」みたいなのあったなぁ
2019/01/23(水) 20:18:11.02ID:VQOsz2i7
喪男推奨
2019/02/01(金) 22:10:39.60ID:1/Kr4Qjk
Perlについての質問箱 64箱目
https://mevius.5ch.net/test/read.cgi/tech/1548981877/
875デフォルトの名無しさん
垢版 |
2019/06/19(水) 04:59:38.60ID:tVNS+22r
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
2019/11/02(土) 13:46:26.21ID:smHgTNTv
package文で宣言するパッケージ名の階層と、
当該パッケージの置き場所のディレクトリの階層って
一致させねばいけないもの?それとも不一致でも無問題?
2019/11/02(土) 14:00:04.49ID:smHgTNTv
標準モジュールのソースコードを見ると、ディレクトリの階層とパッケージの宣言が一致している
(例えば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

どういうこっちゃ…
2019/11/02(土) 16:01:49.62ID:i/sKHoLN
慣習として一致させるものだけど、不一致にするような正当な理由があればそうしてもいい
2019/11/02(土) 17:25:05.95ID:gW/EBDV5
Perlの文脈としてわかりにくくなるだけで
なんのメリットも無い気がする
2019/11/23(土) 11:23:39.89ID:r11kVh6u
複数行からなるJSONファイルの読み込みって普通どうやるの?
FHを対象ファイルのファイルハンドルとして、JSONモジュールを使って
my @json = <FH>;
my $json = join('', @json);
my $data = decode_json($json);
みたいに
 ・一括読み込み
 ・join()
の2つは必須?
これだと機械生成されたJSONファイルがたまたま数ギガバイトあったりしたらどうするんじゃ…
というわけでエラーケースも考えたら1行づつ読み込みたいのですが、
2019/11/23(土) 11:26:07.48ID:r11kVh6u
自己解決しますたスマン、
ドキュメントを読んだら
 INCREMENTAL PARSING
というのセクションがあったわ;
2019/12/10(火) 20:50:10.71ID:1a1TW34R
pushする時に重複してたらpushしない拡張pushを作りたいとする
配列のリファレンスと値を渡す

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

これを何とかundefも受け付けるようにできないもんか
普通に考えるとできないんだけど
883デフォルトの名無しさん
垢版 |
2019/12/11(水) 10:26:34.70ID:dG8VWZ74
>>882
undefの時にどのように動いて欲しいのか?
2019/12/11(水) 20:22:08.85ID:xy3VmN4D
自作関数の中でリファレンスに[]宣言すればいいだけじゃねーの
# 俺と同じ発想なら、だけど。

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 ] ;
2019/12/11(水) 20:35:25.81ID:xy3VmN4D
×リファレンスに[]宣言
○元の変数にリファレンス宣言
2019/12/12(木) 18:58:31.26ID:3Xh4/du7
$_ がエイリアスだからできるのか
普通は危ないから左辺値にしないよな
887デフォルトの名無しさん
垢版 |
2019/12/12(木) 21:46:01.56ID:8fLoSBsV
my @tmp = map { hogehoge } ( (ref $_[0]) ? @$_[0] : () );

こんなんで動かないかね?
2019/12/12(木) 21:56:12.99ID:3Xh4/du7
読みにくく書いても得しないからなあ

$_ を使わずに実現する方法があればそうしたい
2019/12/12(木) 22:06:26.14ID:V4YdibXT
>普通は危ないから左辺値にしないよな
理解してりゃ、危なくもなんともないと思うが、、、
2019/12/12(木) 22:25:24.61ID:V4YdibXT
>>888
だったらコンセプト変えて普通にプロトタイプ使え
sub pushm (¥@@){
my $arr = shift ;
my %h ;
push @{$arr}, grep { ! $h{$_} ++ } @{$arr} , @_ ;
}
my $arr ;
pushm @{$arr}, 1, 2, 3, 4 ;

コードの変更は殆どいらなくて、且つ自作変数の外側で、
(暗黙の)初期化をせざるを得ないから、$_[0] への初期化は
しなくてすむ。
2019/12/12(木) 22:28:33.66ID:V4YdibXT
ああ、コード間違えてるけど、>>884のコード流用してくれ
892デフォルトの名無しさん
垢版 |
2019/12/13(金) 00:04:09.33ID:Oz2tw7ml
$_と@_の区別すら付いてない奴に教える必要なんかねえよ
2019/12/13(金) 18:59:29.78ID:xux/XkmF
こういう時にプロトタイプが役立つのか

sub func(\@@);
とプロトタイプが書いてあって、perlは使えるけどプロトタイプ知らない人に、
この関数呼び出してみろって言ったら、10人が10人
func(\@array1, @array2);
って書くと思うな
2019/12/13(金) 23:43:34.11ID:tge0kpAy
それでもちゃんと呼び出せるからべつにいいやん。
2019/12/13(金) 23:53:07.48ID:Roals1MV
(\@∀@)
2019/12/14(土) 00:01:01.77ID:C/H6m2n1
配列をコンマで区切って並べると、多次元配列にならずに配列が繋がるだけ
というシンプルな仕様が仇になってるんだよな

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

ということで、呼び出し側では実引数を渡しているように見えて、
裏ではリファレンスで受け取るというねじれが生じていて、
プロトタイプでそのねじれを吸収している
2019/12/14(土) 08:31:07.01ID:tdigeeoh
>>893
10人中一人は
my $arr ; my @arr ;
&func($arr, @arr);

って書いて、>>882みたいに「undefだったら動かない」って
首をひねるハメになる。
2019/12/14(土) 08:37:29.90ID:tdigeeoh
通常は、プロトタイプ使ったサブルーチンはモジュールの中に隔離して
perldocだけ読ませて使わせるから、>>893の問題は生じないんだけどなw
個人のコードでどう扱うかは知らん。

代表的なプロトタイプのコードの例↓(List::MoreUtilsの古いバージョン)
https://fastapi.metacpan.org/source/ADAMK/List-MoreUtils-0.33/lib/List/MoreUtils.pm
2019/12/14(土) 09:03:25.68ID:C/H6m2n1
>>897
それエラーになるだけ
2019/12/14(土) 09:22:43.70ID:tdigeeoh
>>899
ん?
「&つけて呼び出すと、プロトタイプを無視する」って言う
古くからある悪名高い挙動が変更になったのか?
すまんが俺は古いバージョンでレスってたわ。

それだったら喜ばしい事だね。
2019/12/14(土) 10:07:00.59ID:tdigeeoh
暇だったから、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
2019/12/14(土) 11:03:07.43ID:6h9Np3wz
ふつうに関数を呼び出すのにわざわざ&をつけるようなヤツは、10人に1人もいねえよ。w
2019/12/14(土) 11:20:47.16ID:FPT3g5nH
いないとどれだけ楽か(泣)
「KENT-webに書いてありましたよ」
「」
2019/12/14(土) 11:36:46.61ID:tdigeeoh
>>902
そのレスは>>899がレスる前に欲しかったなw
無駄な作業しなくて済んだし、恥もかかずに済んだw
905デフォルトの名無しさん
垢版 |
2019/12/15(日) 00:13:17.48ID:uHh4aFtn
&つけるのって少数派なのか
俺絶対つけてるけど
ある現場で「え、今そんなのつけませんよ…」ってちょっと引いてすらいる感じで言われたことある
まあもうその現場もrailsになったはずだけど
2019/12/15(日) 00:30:38.21ID:gPijPjuC
C言語でもautoって書いてそうだ
2019/12/15(日) 01:55:45.57ID:EMEs5NEs
Perl5で&を使うのは、関数リファレンスを解決するときだけやろ。

>>903
Perl4レベルの遺跡やな。
もう昔々のことだから、忘れてやれ。。。
2019/12/15(日) 02:19:39.95ID:uHh4aFtn
これは関数であるって目印としてつけてる
俺の中では可読性の為
つけないのはData::Dumper()とかモジュールから直で呼ぶ場合だけかな
2019/12/15(日) 07:37:43.49ID:R35TvKP/
呼出で挙動がかわるの、充分に分ってるなら「個人で使うなら」いいんじゃねーの?
2019/12/15(日) 07:43:22.45ID:R35TvKP/
プロトタイプの呼出以外にも
@_ = (1,2,3,4) ; &func ;
で特殊挙動するし、地雷だらけだよXXルーチン

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

>>907
「perl, XXルーチン」でググると検索上位に来るんだよ、今でも
2019/12/15(日) 07:46:10.55ID:gPijPjuC
サブルーチン
2019/12/15(日) 07:47:19.44ID:KI19HfKk
teratailのサブルーチン絡みの質問斜め見て、頭痛くなったわ。
質問者はしょうがないとしても、回答で&付けるってどういう了見だ?
2019/12/15(日) 07:48:41.86ID:R35TvKP/
俺の環境だけかよorz…
2019/12/15(日) 08:32:32.51ID:KI19HfKk
>>904
お作法本全盛期(2010年代前半)なら、相手はお作法本を読んでる可能性がある。
引いてる程度じゃなくて、どん引きされたのかもよ
# お作法本: Perl ベストプラクティス、Effective Perl etc.

KENT-webもだけど、お作法本インスパイヤで、オレオレお作法のページが
山程あるのも滅んで欲しいわ。
2019/12/15(日) 08:34:58.76ID:KI19HfKk
アンカミス
×>>904
>>905
2019/12/15(日) 08:46:16.32ID:gPijPjuC
作法は一つではない
2019/12/15(日) 08:51:11.22ID:KI19HfKk
一つじゃないのは当たり前
けど、オレオレお作法のページはいらない
2019/12/20(金) 00:38:27.17ID:nzfj8t5I
Perl6無くなったんだね。今更知った。
新言語「Raku」として生きていくそうな
https://ja.wikipedia.org/wiki/Raku
2019/12/20(金) 00:57:05.41ID:cphYS5E7
YAPC が YARC になって ヤラしい
2019/12/20(金) 06:50:52.69ID:GiJ3WKor
keysがスカラを引数に取れるせいで、なんか間違った書き方してる所があちこちある
どっちでも大抵は動くけど、エラーで止まりやすい
明示的にデリファレンスしてればエラーにはならない
2019/12/20(金) 07:10:52.86ID:8NcASRwh
それ、実験的に5.14から搭載されて、5.24で削除された機能
エラーで止るのは環境依存か、書き手がヘボか

そもそも使うんじゃねー、ってのが主旨なら、同意
2020/02/14(金) 23:14:26.30ID:x2wQj3nb
配列があって、条件に合わないものを削りたい
0 .. $#array に対してループしながらspliceすると、
$i-- でも redo でもなんか不安がある

どうするのが定番なんだろう
2020/02/15(土) 13:11:27.84ID:Slu9Ub4W
grep { $_ > 0 } @array
2020/02/15(土) 18:06:37.80ID:jU+J++ht
@array = grep { $_ > 0 } @array
とやって平気な気がしない

別の配列を用意していいなら既に出来ていて、
それを何とかすっきりできないかと
2020/02/15(土) 19:06:58.27ID:Slu9Ub4W
(平気な気がしないとか言われても知らんがな)
まず「すっきりできる」を定義してください
2020/02/15(土) 19:20:44.91ID:jU+J++ht
ああー
逃げに入っちゃった
2020/02/15(土) 23:03:36.63ID:pIpzwBTs
spliceするのはよくない気がする→何が定番なんだろうって話だと
grepが定番でしょ
別に結果配列用意するのでもいいんじゃないの
2020/02/15(土) 23:40:20.22ID:KTVOtCHP
spliceの、僕が考えた最強関数的な仕様はイヤかも。
もっと構文レベルで同じことができると良かった。
2020/05/09(土) 14:56:48.37ID:KF1jgHuK
WindowsでPerlを使いたいんですが、どれが良いですか。
ActivePerlはアンインストールしてもゴミが残るそうなので避けたいのですが。
2020/05/09(土) 18:21:47.00ID:HzJsK433
ストロベリーパニック
2020/05/09(土) 18:51:24.57ID:/Z4Vk9Yy
Windows10, WSL, Ubuntu 18.04 なら、最初から入っているけど

file `which perl`
/usr/bin/perl: ELF 64-bit LSB shared object 以下省略
932デフォルトの名無しさん
垢版 |
2020/05/27(水) 01:20:04.31ID:VqjzWrQC
Perlを勉強しています。
「use constant」で定義したハッシュのキーを
keys関数で取り出したいのですが出来ません。
どのような方法で取り出せますか?

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

宜しくお願いします。
2020/05/27(水) 01:33:03.79ID:h9Mc4KsU
use constant H => { a=>'AAA', b=>'BBB' };

foreach (keys %{H()}) {
print $_, "\n";
}
934デフォルトの名無しさん
垢版 |
2020/05/27(水) 02:12:19.49ID:VqjzWrQC
>>933
ぬおおおおっ…Perlムズイっす。
「H()」この部分はハッシュへの参照を返してるのだと思うのですが、
実体はサブルーチンだったのですね!「&H」でも上手く行きました。
935934
垢版 |
2020/05/27(水) 03:05:09.48ID:VqjzWrQC
>>933
お礼を記し忘れていました。
ありがとうございました。
2020/05/27(水) 05:13:22.61ID:ISGE1WR5
Perl は難しすぎる。
Ruby では、

hash = { a: 1, b: 2 }

hash.each_key { |key| p key }

出力。:a などはシンボル
:a
:b
2020/05/27(水) 06:47:35.32ID:VqjzWrQC
>>936
そういう話をしているのではないです。
そのコードを見る限り、
普通のハッシュキーを取り出すだけだったらPerlの方が簡単な気がします。
my %h = ( a => 1, b => 2 );
print "$_\n" foreach ( sort keys %h );

結果:
a
b

>>933は、「use constant」で定義したハッシュのキーの事です。
938615
垢版 |
2020/05/27(水) 08:50:36.01ID:Bt/CFCtA
constantの実体は値を返すsubなので、%{}でデリファレンスしてね
2020/09/28(月) 17:41:16.96ID:7jydyBLu
(?:)
をいつも忘れるんだが、何かいい覚え方は無いだろうか
2020/09/28(月) 19:13:20.83ID:SgTMPvZg
>>939
何を忘れんの?
「?」?「:」?
さすがに「()」は忘れんよな?
2020/10/04(日) 23:18:25.80ID:4IGvE5yV
>>939
いいじゃんべつに。気にせず普通の括弧にして捨てろ。
2020/10/05(月) 07:42:46.02ID:c4eZ6okl
ずれるやん
2020/10/07(水) 12:09:24.93ID:70BaWviw
>>939
後で参照する ? 単に丸括弧を使う : 丸括弧内に「何か」を入れる
さて、「何か」とは、一体何だっただろうか?そうだ、三項演算子だ!

…と覚える。
2020/10/07(水) 13:37:28.91ID:TO7pfOqH
>>943
「(?」でひとつとするべき。
その次に「:」「!」などが修飾子としてつく。
2020/10/07(水) 15:33:40.38ID:GbKtGfRD
あと、マッチングのオプションのsとmも毎回検索してる
最初に思うのは大抵逆
2020/10/08(木) 09:33:52.95ID:e3wo1zjN
(?シリーズをいろいろ使ってれば、あとは:だけだけど、
そもそも(?:しか使わないんだよな
いろいろ便利そうな拡張ではあるけどこれ以上可読性下げてどうする
2020/10/09(金) 14:54:01.89ID:JXQ8Trls
TABをデリミタにしてデータが1行に並んでいる
但し、""で囲まれていれば内部にTABを使ってもよい

というルールのデータに対して、""に囲まれているTABをスペースで置換したい
どう書けばいい?
2020/10/11(日) 19:55:14.93ID:LEwrAD/J
多分、これでいけると思う。

while(s{(".*?)\t(.*?")}{$1 $2}){}
2020/10/11(日) 21:05:02.09ID:OOWRCRR6
どうやって使うかすら判らん
2020/10/11(日) 22:14:06.89ID:LEwrAD/J
while(<>){
while(s{(".*?)\t(.*?")}{$1 $2}){}
print;
}

これで解らないなら、「Perlの入門書をよく読みましょう」
としか言えないのだが。
2020/10/11(日) 22:42:11.43ID:OOWRCRR6
せめて入力が$strとかになってないと
2020/10/11(日) 23:29:39.25ID:LEwrAD/J
while($str =~ s{(".*?)\t(.*?")}{$1 $2}){}

しかし、Perlを使うなら、文中で省略されている$_ のことは
知っておかないといけない。
2020/10/11(日) 23:56:48.98ID:LtBR6JI3
タブ文字が複数あったら?とかダブルクォートが含まれてたら?とか、不安もいろいろ。
いわゆるExcelCSVなら、置換一発とはイカンやろな。

CSVモジュールでも探すか、マジメに自作するかして、セルごとに置換しないと個人的には落ち着かないな。
2021/03/25(木) 23:19:00.52ID:BFmdRR/m
$_ などの特殊変数に依存したコードを書くと移植性と可読性が著しく低下する。
正規表現にまつわる特殊変数も厄介。別の正規表現が呼ばれて上書きされてしまうからすぐにコピーしないといけない。
2021/04/28(水) 14:52:38.35ID:RETJLOh2
ビットシフト演算の挙動の違いが表面化した
32bitと64bitのビルドの違いにより、1 << 32の結果が変わる

32bitのperlが2^32以上の整数を扱えない訳ではないので、
ビットシフト演算子を使わずにビットシフト演算子と同じことをやらないといけない
何か抜け道は無いもんか
2021/04/30(金) 18:29:08.85ID:m/tHuDzV
>>955
シフトするだけなら2倍したり2で割ってintにすれば良いのでは?
もっと大きなビットを扱いたい場合は Math::BigInt かな。
2021/04/30(金) 19:23:07.21ID:vAph35tm
もっそい遅いんだっけ
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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