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

レス数が900を超えています。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辺り


2018/12/29(土) 14:17:08.53ID:Q3TbjvxP
\( ... ) なんて書き方はどんな時に使うんだろう
2018/12/29(土) 19:13:44.30ID:JLECNNE+
>>802
Perl5で配列とリストは同じ意味だろ。
2018/12/29(土) 19:19:17.64ID:JLECNNE+
>>803
だから、まとめてリファレンスをとるときだろ。
@list=\($a,$b,$c);
$$list[0]=0; # $a=0;
2018/12/30(日) 08:38:58.47ID:d/kczs//
>>804
($a, $b, $c) = (11, 22, 33);

scalar ($a, $b, $c) == 33; # リストの最後の要素

@array = ($a, $b, $c);
scalar @array == 3; # 配列の要素数

($a_ref, $b_ref, $c_ref) = \($a, $b, $c); # 各要素のリファレンスのリスト

$array_ref = \@array; # 配列変数のリファレンス

>>805
$$list[0] は ${ $list }[0] だから $list->[0] と同じ (リファレンスが指す配列の0番めの要素)
$a にアクセスしたいなら ${ $list[0] } (配列の0番めの要素をデリファレンス)
2018/12/30(日) 08:50:22.81ID:d/kczs//
いい記事があった

「リストと配列(Array)はPerlでは別物」
ttps://togetter.com/li/263729

「モダンなPerlを「読む」上で覚えておくとよい構文 第2回「リストを理解すれば配列とハッシュをより活用できる」」
ttp://www.songmu.jp/riji/archives/2010/09/perl_2_1.html
2018/12/30(日) 08:53:03.67ID:x1KM9vdn
列挙してまとめてリファレンスなんか取ることあるか?

数が多いなら普通はループにすることを考える
3つくらいなら普通に書けばいい
何かの関数の引数にリファレンスでいっぱい渡すくらいしか思いつかないけど、
そんなインターフェースがそもそも間違ってるし可読性も下がる

そんな書き方は無いものと思って使わないのが吉
2018/12/30(日) 08:53:43.65ID:/wKH6dhf
リスト・・・複数の値
配列・・・複数の値が入ってるオブジェクト

ようするにこんだけだろ?
2018/12/30(日) 08:56:13.19ID:/wKH6dhf
Perlにとってオブジェクト指向は
頑張ってオブジェクトに見えるものを作り出すもので
オプショナルな存在だから
リストと配列の違いをシンプルに説明できないんだろうな
2018/12/30(日) 09:00:51.60ID:x1KM9vdn
オブジェクト指向だと言うにはカプセル化は必須で、
メンバ変数をダイレクトにいじるとかやっちゃ駄目な筈なんだけど、
その方が便利だから普通にやってる

$obj->setval($val);
$obj->{val} = $val;

一緒やん
2018/12/30(日) 09:06:23.51ID:/wKH6dhf
> オブジェクト指向だと言うにはカプセル化は必須で、
必須じゃないよ。てか必須なものなんて無い

オブジェクト指向言語というのは
オブジェクト指向を行うために用意された文法がある。
条件はこれだけ
2018/12/30(日) 10:57:52.01ID:d/kczs//
アンダースコアから始まるメンバ変数はプライベートなので外側から触ってはいけません

よしカプセル化できたな!!!
2018/12/30(日) 11:50:53.97ID:iF2NHAVN
>>813
カプセル化か? ・・・ YES 命名規則によるカプセル化
815615
垢版 |
2018/12/31(月) 00:31:18.84ID:Hr+PmI8P
Perlのオブジェクト指向??は記述がちょっと変体言語風な見た目だけれど
Cのstructを拡張したような型クラス+継承に基づく言語よりも
propertyベースOOP+mixinのような柔軟な表現が出来て
良いんじないかと俺は思う
2018/12/31(月) 00:44:01.46ID:LUt0Quvy
gotoは柔軟だから優れていると言っているようなもので、
何でも出来る = 優れている ・・・ これは間違いなんだよ

アセンブラという何でも出来る言語から進化し、
特定の用途の「パターン」を見つけて抜き出し、
そのパターンを専用の文法にしてきた。

特定の用途専用(=柔軟性がない)の文法があることで
書き方が統一できるし、何がしたいのかという意図を
他人に伝えることが出来る
817615
垢版 |
2018/12/31(月) 01:09:11.59ID:Hr+PmI8P
制限の方向性が弊害を持っているのに
広く普及しちゃうと悲惨なことになる
2018/12/31(月) 01:10:55.58ID:LUt0Quvy
それでPerlのオブジェクト指向、mooseとかどうなりましたか?
819615
垢版 |
2018/12/31(月) 01:12:14.36ID:Hr+PmI8P
>>818
あんまし使われていない
820615
垢版 |
2018/12/31(月) 01:13:48.73ID:Hr+PmI8P
JavaもCOBOLみたいな立ち位置になるだろうし
2018/12/31(月) 01:16:04.10ID:LUt0Quvy
>>819
そうなるやろ?

柔軟性が表現ができてしまうから、
Mooseとかいうのができて、一方では使うが
使わない人もいる、バラバラ

自分では使ってないつもりでもライブラリの中で
使われていてメモリも無駄に消費する

だめなんですよ。柔軟だけど機能が足りないというのは。
2018/12/31(月) 08:07:22.77ID:C6w6M91j
TMTOWTDI は正義。
823615
垢版 |
2018/12/31(月) 10:01:45.42ID:2dwmQiqr
Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

Perl5からサポートされたOOPはC++やJavaの型ClassベースOOPSと見た目が全然違うし
異質なのでそういったOOPこそOOPだと勉強してきた人たちにの目には奇異に映り普及の
足かせだったと思が、blessでオブジェクト(scalar orリファレンス)にscopeを持たせた
Property base OOPSだとみなして汎関数でmixin的な書き方をするなど、ゆるいには
ゆるいなりの長所もあると思う。これはPythonのOOPSのゆるさとも通じるところがあると思う。

性能に関してはC++のような最下層でも効率的なものではないし、Property baseという
特徴から見ても、中間レイヤ・グレインで使うのに適した仕組みだと考えていますが
2018/12/31(月) 10:15:50.03ID:0rbvsgzk
オブジェクト指向は結果オブジェクト指向なだけでやりたいことはオブジェクト指向じゃない

同じこと何度も書きたくないからライブラリ化したいだけで、
一旦ライブラリにしたら極力中身のことを忘れていいようにしたいだけ

どこまで忘れていいかは実装のセンスに依るので、言語仕様は関係ない
2018/12/31(月) 10:44:08.74ID:LUt0Quvy
> Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

PerlにOOPの機能が不足してるからそうなるわけだよ
2018/12/31(月) 10:45:08.33ID:LUt0Quvy
>>822

嘘つき人間「TMTOWTDI は正義」

証明もされてないことを言ったって
何の意味もないんやで
2018/12/31(月) 12:37:43.61ID:C6w6M91j
>>826
己れの方こそ嘘つきだな
「証明もされてないことを言った」つまり真実か嘘か判定不能な段階なのに「嘘つき」のレッテル貼りとか

TMTOWTDI はPerlの基本方針でありPerlをPerlたらしめている特徴であり
しばしばPerlを好み愛用し続ける者にとってはその大きい理由でもある
ゆえに「TMTOWTDI は正義」である
2018/12/31(月) 14:40:49.82ID:/9F0EQIO
>>825
具体的に、不足してる機能は?
2018/12/31(月) 17:58:26.87ID:LUt0Quvy
>>828
オブジェクト指向を行うための標準的な方法
830615
垢版 |
2018/12/31(月) 21:31:35.63ID:4xTPjQJE
型クラス+継承を使ったオブジェクト指向は
モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので
オレはなるべく使わないようにしている
2018/12/31(月) 22:05:38.48ID:0rbvsgzk
クラス設計して継承して、みたいなのは人間の能力を越えてる

継承も抽象度を高めたいとかそんな大層な目的じゃなくて、
やっぱり同じこと何度も書きたくないからやってるだけで、
よっぽど汎用性の高い概念なら継承でうまくいくかもしれんけど、
そんなんは最初から内蔵されてるのが普通
2018/12/31(月) 22:42:10.76ID:LUt0Quvy
>>830
> モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので

知ってる単語を並べただけなのは恥ずかしいですよw
2018/12/31(月) 22:42:33.80ID:LUt0Quvy
× クラス設計して継承して、みたいなのは人間の能力を越えてる
○ クラス設計して継承して、みたいなのは>>831の能力を越えてる
834615
垢版 |
2018/12/31(月) 23:03:12.86ID:6bMDAT8f
>>833
なぜそんなに人に絡む。
嫌なことでもあったのか、
あるいは単に嫌な奴かなだけか…
2018/12/31(月) 23:07:29.74ID:0rbvsgzk
ヒント : 日付
2018/12/31(月) 23:09:17.73ID:LUt0Quvy
>>834
お前が自分にできないことは、人間全部できないんだとか
言ってるから、お前ができないだけだよって訂正してるだけだが?
837615
垢版 |
2018/12/31(月) 23:11:32.50ID:6bMDAT8f
>>836
俺は何が出来ないとか一言も書いてないが。
何かと混乱してるのか?知らんけど
838615
垢版 |
2018/12/31(月) 23:16:34.16ID:6bMDAT8f
>829 名前:デフォルトの名無しさん[sage] 投稿日:2018/12/31(月) 17:58:26.87 ID:LUt0Quvy
>>828
>オブジェクト指向を行うための標準的な方法

それをperlに求めるのは筋違いだろ。

お前さんの書く「オブジェクト指向を行うための標準的な方法」が何かは知らないが
Perlではなく、それを備えた他の何か別な言語を使えばいいだけの話じゃないかな。
2019/01/01(火) 00:42:39.69ID:WFGHAbKk
>>837
> 俺は何が出来ないとか一言も書いてないが。
できないなら、できないと認めて、書けって言ってるんだよ。
お前は他の人ができるクラス設計をできないんだから
2019/01/01(火) 00:44:50.00ID:WFGHAbKk
>>838

>>825で「PerlにOOPの機能が不足してるからそうなるわけだよ」って言ったら
>>828で具体的に不足してる機能は?って聞かれたから
それに答えただけですが?

PerlにOOPの機能で不足しているものを聞かれたんだから
それに答えるのは普通でしょう。
2019/01/01(火) 01:07:42.37ID:dsnk2i9g
>>829
「標準的」とは?

もしクラスベースOOPとしての話なら、そもそもPerl5に求めるのが大間違い。
Perl5にはPerl5のやりかたがあるんだから。
2019/01/01(火) 01:31:46.17ID:WFGHAbKk
そのやり方が不足しているために、いろんなやり方ができてしまって
混乱してるって話をず〜っとしてるんだが
2019/01/01(火) 01:44:48.23ID:WFGHAbKk
混乱じゃないな。混沌か。
2019/01/01(火) 03:40:45.46ID:qrGSiep2
それがPerl。
いろんなやりかたがあってもいい。

イヤならPythonでもRubyでもどうぞ。
2019/01/01(火) 04:42:46.75ID:WFGHAbKk
>>844
嫌とは言ってないよ

Perlはオブジェクト指向をやるときに標準なやり方がないので
人やライブラリによって書き方が異なる
最小限の機能しか持っていないため、書き方が煩雑になる。
それを解決するライブラリもあるがデファクトスタンダードと呼ばれるものはない
そのためオブジェクト指向をやるとソースコードが混沌とした状態になる
これはデメリットではないと主張するがその根拠はない

ということでしょ?
846615
垢版 |
2019/01/01(火) 06:56:08.14ID:wEmHEx+3
Javaのオブジェクト指向じゃダメだからいろんなオブジェクト指向の言語が乱立しているのに
847615
垢版 |
2019/01/01(火) 07:05:33.16ID:wEmHEx+3
Perlは記述に拡張性があるから、
幾つかのオブジェクト指向の仕組みを拡張しようという流れが出たのは
自然なことで、宿命みたいなものだよ
2019/01/01(火) 09:32:39.73ID:qcGL6dxE
うん。だからいろんなやり方が出て混沌状態になった。
駄目とは言ってないよ。
混沌状態になるといってるだけ
2019/01/01(火) 16:14:48.46ID:O6bdw0M8
>>821
> だめなんですよ。柔軟だけど機能が足りないというのは。
>>848
> 駄目とは言ってないよ。
> 混沌状態になるといってるだけ
おいおい。
850615
垢版 |
2019/01/01(火) 18:05:00.64ID:XbYa03OK
混沌は別に悪いことばかりではないし、
まぁ趣旨換えしたようだからそっとしておきましょう
851788
垢版 |
2019/01/07(月) 11:29:47.54ID:44u2lGi3
また教えてください。おねがいします。
1、下記のようなコードで aliasみたいなことはできないのでしょうか?
2、直接リファレンスをリストとして受けれるでしょうか?

元のコード(動く)
sub append {
 my ($tbl, $data) = @_;
 push(@$tbl, $data);
}
my @list;
append(\@list, 10);
append(\@list, 20);

1、$pから別名@tblを作りたい
sud append{
 my ($p, $data) =@_;
 my @tbl=
 push(@tbl, $data);
}

2、リファレンスを直接リストのポインタとして受けたい
sub append {
 my (@tbl, $data) = @_;
2019/01/07(月) 13:11:23.07ID:44u2lGi3
なんとか1を出来ないものかとやってみても、
@tbl=@{$p};だと実体のコピーだし、\@tbl=\@{$p};これじゃあエラーだし、
2も同じか・・・きっと、ダメなんですね
2019/01/07(月) 17:42:31.40ID:sY/RJhpW
my (@tbl, $data) = @_;
は全部 @tbl に入っちゃうから…
あと、パッケージ変数を使えば
my @a0 = qw( a b c );
our @a1;
*a1 = \@a0;
みたいなこともできるけど。
my 変数で同じことをするモジュールもあったような気が…
2019/01/07(月) 18:14:18.86ID:44u2lGi3
>>853
レスありがとうございます。perlだと、このぐらいまでなんですね。(ポインタ)
855デフォルトの名無しさん
垢版 |
2019/01/07(月) 19:02:01.15ID:fnTlHl64
型グロブが使えるとは思うが素直に参照渡しした方が分かりやすくてよいと思う。
2019/01/07(月) 20:21:54.90ID:ysTcYJUI
最近のなら、push($tbl,$data)でいいんじゃないの?
2019/01/07(月) 22:54:34.52ID:+HHyWqnO
そもそもコピーじゃなくて別名が欲しいケースがないしなあ
ttps://metacpan.org/pod/Data::Alias

>>856
これ?
ttp://perldoc.jp/docs/perl/5.24.0/perl5240delta.pod#The32autoderef32feature32has32been32removed
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
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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