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

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

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

1 :デフォルトの名無しさん:2012/01/21(土) 10:56:39.03 .net
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辺り




727 :デフォルトの名無しさん:2018/09/17(月) 12:38:21.06 ID:lUfJPVVO.net
>>724,725
Windows Strawberry Perl と ubuntu(WSL)標準perl それぞれで試したけど、挙動が変わる。
以下のようにthreadsを使ったらどうかな。挙動も同じになるし。

use threads
my $t1 = threads->create(sub { system("perl prog1.pl"); });
my $t2 = threads->create(sub { system("perl prog2.pl"); });
$t1->join();
$t2->join();

728 :デフォルトの名無しさん:2018/09/17(月) 20:28:41.27 ID:voWgbO/q.net
あれ?規制されたか?
ちょっと書き込みテスト。

729 :デフォルトの名無しさん:2018/09/17(月) 20:29:55.17 ID:voWgbO/q.net
あれ?書けたな。
じゃあ書き込み内容か。じゃちょっとNGワード探るスレに行って来よう。

730 :デフォルトの名無しさん:2018/09/17(月) 20:36:45.38 ID:voWgbO/q.net
規制理由がわかった。「cmd.exe」が半角で入っている書き込みはダメなようだ。
ということで元の書き込みの該当部分を全角に置換した状態でコピーする。

Windows だと cmd.exe 経由で動かしてるようだな。system(1, '...') で返してくるPIDがcmd.exeのPIDだ。
perl.exe は cmd.exe が動かすので PID が違っている。

じゃあ与える引数をリストにしたらどうなのかと思って Windows でやってみたら cmd.exe 経由では
なくなって perl.exe のPIDが返ってきたよ。こんな感じ。

my $pid1 = system(1, 'perl', 'prog1.pl');
my $pid2 = system(2, 'perl', 'prog2.pl');

これだと多分OS違っても大丈夫なんじゃないかな?

731 :デフォルトの名無しさん:2018/09/17(月) 20:38:07.48 ID:voWgbO/q.net
ごめん。また2行目が2になってた。やるなら1変えてやって。

732 :デフォルトの名無しさん:2018/09/17(月) 22:03:10.33 ID:N6BlbWjP.net
systemの戻り値はプロセスIDではないはずだが。。。

733 :デフォルトの名無しさん:2018/09/17(月) 23:33:01.82 ID:voWgbO/q.net
>>732
perldoc perlport で見るとこれはもしかすると Win32 だけかも知れない。
「(Win32)」ってくっついてるので。

734 :デフォルトの名無しさん:2018/09/19(水) 08:37:16.87 ID:wlIidQxJ.net
Windowsの「プログラムと検索」で「cmd.exe /C del c:\*.*」
を検索すると何がヒットする?

…と聞かれて、やってしまう人を保護しているのかな?

735 :デフォルトの名無しさん:2018/09/19(水) 13:40:02.89 ID:gcT5tzZy.net
>>734
del に /S 忘れてるぞ。

736 :デフォルトの名無しさん:2018/09/20(木) 23:11:28.50 ID:t6JihYkI.net
systemの第一引数の1ってなんだ
って思ったらwin32独自の仕様なのか
https://stackoverflow.com/questions/11532500/perl-system1-commands#comments-11532774

737 :デフォルトの名無しさん:2018/09/21(金) 00:00:27.79 ID:XGMWk6Lf.net
"system(1, @args)" spawns an external process and immediately returns its process designator,
without waiting for it to terminate.

まさにそういうのが用意されてるんだな
知らんがな

738 : :2018/09/21(金) 01:30:00.65 ID:JP8I8TZy.net
>>737
> spawns
dos 時代は spawn と fork は使い分けられていたのですけど、最近はそうではないようですね…

739 :デフォルトの名無しさん:2018/09/21(金) 03:06:25.03 ID:m7KC0L1Z.net
ちんぴょろすぽーん

740 :デフォルトの名無しさん:2018/09/21(金) 09:00:53.42 ID:m8DL5ZJ4.net
>>730
Ruby のsystem 関数では、引数の個数が1つで、
記号など、シェルのメタ文字を含む場合は、シェル経由で実行される

それ以外は、Rubyインタープリタから、直接実行される

741 :デフォルトの名無しさん:2018/09/21(金) 09:28:40.03 ID:7bTZc31z.net
>>740
それ Perl と同じ。

system(1, ...) 形式は Win32 用。
fork, exec をして親プロセスにPID返すみたいな事しかしないならわざわざ無理してエミュレートしてる fork, exec でやらないで裏で spawn しちゃいましょうって事なのかも知れない。

742 :デフォルトの名無しさん:2018/10/17(水) 22:55:37.70 ID:dAVmpFbq.net
open $in, '-|', $file;
に対して、cp932をdecodeして扱いたい時はどう書くの?

743 :デフォルトの名無しさん:2018/10/18(木) 00:25:47.59 ID:/P5hGycw.net
Ruby では、rt は読み込みテキスト、
外部エンコーディングはsjis、内部エンコーディングはutf-8

s = ""

f = File.open("sjis.txt", mode = "rt:sjis:utf-8"){ |f|
s = f.read # 全て読み込む
}

puts s

744 :デフォルトの名無しさん:2018/10/18(木) 03:30:55.05 ID:CSkK3ONp.net
>>742
それ以前の問題として -| 使ったら fork された後で子プロセス側で $file をコマンドの文字列と
解釈して exec しちゃうと思うが、それで良いのか?

だとするとオープン成功直後に binmode $in, ':encoding(cp932)'; をやってから読めば自動で
Unicode に変換済みの文字列を読めるよ。

745 :デフォルトの名無しさん:2018/10/18(木) 05:44:50.16 ID:w42KpNlE.net
'-|:encoding(cp932)'
みたいな書き方もできそうに見えるけど出来ないんだな

746 :デフォルトの名無しさん:2018/11/08(木) 02:01:28.04 ID:PVk/9YBB.net
Haskellのモナドのdo記法っぽい書き方出来ないかと思ったけど…ジェネレータもないなら例外を経由しつつ隠蔽するしかないのかな
命名とかモナド則とか全然考えてないけど

sub run_maybe(&) {
  my ($block) = @_;
  my $value = eval { $block->() };
  if (my $e = $@) {
    # 例外がNothingなら戻り値に、それ以外は再スロー
    return $e if is_nothing($e);
    die $e;
  }
  return just($value);
}

sub bind {
  my ($maybe) = @_;
  # Nothingならそれを例外として投げ、そうでないなら中身の値をリターン
  ...;
}

my $maybe_int = run_maybe {
  my $x = bind foo();
  my $y = bind bar();
  return $x + $y;
};

747 :デフォルトの名無しさん:2018/12/10(月) 21:15:33.75 ID:iIDHqnJC.net
$data1 = "100歳";
$data2 = "10000ドル";
これらを値と単位に分けるのはどうすればいいのですか?

748 :デフォルトの名無しさん:2018/12/10(月) 21:24:33.74 ID:onmtWwUs.net
$data =~ /(\d+)(.+)/;
$num = $1;
$unit = $2;

749 :デフォルトの名無しさん:2018/12/10(月) 21:34:11.14 ID:iIDHqnJC.net
ありがとう^^

750 :デフォルトの名無しさん:2018/12/11(火) 06:03:32.47 ID:LK/HNouD.net
my ($num, $unit) = $data =~ /(\d+)(.+)/;
でもいける

751 :デフォルトの名無しさん:2018/12/11(火) 11:33:05.28 ID:6U/wos5g.net
747だけど
$data = "100歳";の場合は100と歳に分割できたけど
$data = "100";の単位が無い場合は10と0になってしまいました
単位が無い場合は100と単位は空に分割するようにしたいです
どうすればいいんですか?

752 :デフォルトの名無しさん:2018/12/11(火) 11:50:24.37 ID:T1QyjEc7.net
/(\d+)(.*)/

753 :デフォルトの名無しさん:2018/12/11(火) 19:54:59.78 ID:yDndbNaF.net
"歳"のように単位だけの場合がうまくいきません

754 :デフォルトの名無しさん:2018/12/11(火) 22:35:17.55 ID:MmvOq85J.net
んなもん、エラーにしろよ。

755 :デフォルトの名無しさん:2018/12/12(水) 02:54:18.27 ID:+vNNSkfF.net
少しは自分のアタマで考えろ

756 :デフォルトの名無しさん:2018/12/12(水) 08:52:36.90 ID:mSgTllU8.net
そうだよな。
>>752
のどこか一文字変えればいいんだけど、
さて、どこをどう変えようか?

757 :デフォルトの名無しさん:2018/12/12(水) 18:44:04.24 ID:8oZHllaC.net
前方向にgreedyとかでけんかな

758 :615:2018/12/15(土) 16:39:19.35 ID:iCCNyy8F.net


for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /((?:\d*+)?)((?:[^\d]*)?)/;
print "$d : $o\n";
}

$ perl 758.pl
100 : 歳
10000 : ドル
100 :
: 歳

759 :615:2018/12/15(土) 16:43:35.77 ID:iCCNyy8F.net
>>758
いやこれで十分だった

for (qw{100歳 10000ドル 100 歳}) {
my ($d, $o) = /(\d*+)([^\d]*)/;
print "$d : $o\n";
}

$ perl 759.pl
100 : 歳
10000 : ドル
100 :
: 歳

760 :デフォルトの名無しさん:2018/12/15(土) 16:59:48.28 ID:2DpZ6qLn.net
いや、一文字変えればいいんだってば…

761 :615:2018/12/15(土) 17:04:09.15 ID:iCCNyy8F.net
>>746
iteratorのgeneratorはclosureを使えば記述できるので、

sub xrange {my ($i, $n) = @_;
sub {$i <= $n ? $i++ : ()}};
$xrange1_10 = xrange(1, 10);

while (local $_ = &$xrange1_10) { # perlの場合generatorを呼び出すforeachはNG
print "$_\n";
}

$ perl 800gen_itr.pl
1
2
3
4
5
6
7
8
9
10

こういうclosureによるgeneratorを使ってその
「Haskellのモナドのdo記法っぽい書き方」はできる??

762 :615:2018/12/15(土) 17:07:47.65 ID:iCCNyy8F.net
>>760
そだねー

763 :デフォルトの名無しさん:2018/12/16(日) 09:55:03.75 ID:sRmrp7hv.net
まだ Perl4 を使っている人たちがいるようだ。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11199717671

764 :デフォルトの名無しさん:2018/12/16(日) 10:02:20.90 ID:wu7F1Zb/.net
pythonの2と3が未だに入り乱れていて両方入れとくしかない状態が続いてる
パスが通ってるのは2で、3はパス込みで起動

765 :デフォルトの名無しさん:2018/12/16(日) 12:03:41.52 ID:/7qVlMZU.net
>>763
デリファレンス…じゃなさそうだな

766 :デフォルトの名無しさん:2018/12/16(日) 12:34:40.06 ID:wu7F1Zb/.net
perlの変数名($無しの部分)ってリファレンスなんだよな

$name がリファレンスの時、@$name でデリファレンスされることと、
@name と書くことは同じ意味になる

$#name と書きたい時にも敷衍できて、nameの代わりに{$name}と書いて、
$#{$name} と書くと思った通りの意味になる

767 :デフォルトの名無しさん:2018/12/16(日) 13:33:32.09 ID:sRmrp7hv.net
「Perl4 を使っている」というのは言い過ぎだったかな。
eval を使えばシンボリックリンクを実現できるけど
${$key} という表記はできなかったからね。
このカテゴリマスターの方々は単に Perl を知らないんだろう。
知らないのはいいが、なぜ回答するのか。

768 :デフォルトの名無しさん:2018/12/16(日) 13:44:41.15 ID:sRmrp7hv.net
書き間違えた。
s/シンボリックリンク/シンボリックリファレンス/

769 :デフォルトの名無しさん:2018/12/16(日) 13:50:00.67 ID:yJnPGyqy.net
>>763
Perl5でもおなじなんやで?

770 :デフォルトの名無しさん:2018/12/16(日) 20:13:44.90 ID:sRmrp7hv.net
え…何が? 表記のことなら Perl4 ではできなかった Perl5 の表記なんだけど。

771 :デフォルトの名無しさん:2018/12/17(月) 00:09:00.22 ID:iB9eUrL3.net
あ、デリファレンス記述を知らんヤツ発見、て意味だった?
勘違いした。w

772 :デフォルトの名無しさん:2018/12/17(月) 07:49:28.02 ID:WGHllUkv.net
>>766
> $name がリファレンスの時、@$name でデリファレンスされることと、
> @name と書くことは同じ意味になる

ん? $name と @name は別物じゃね?
@s = qw/a b c/;
$x = \@s;
print join ",", @x; # ""
print join ",", @$x; # "a,b,c"

773 :デフォルトの名無しさん:2018/12/17(月) 09:07:21.92 ID:GlvD8kJn.net
よくわからんけど気になるのだけど
結局リファレンスをデリファレンスして値つっこんでるだけ、でいいんだよね?
回答者が勘違いしてる変数名の変数指定ってどうやるんだっけか

774 :デフォルトの名無しさん:2018/12/17(月) 12:40:59.21 ID:JqNM8yOl.net
>>773
http://perldoc.jp/docs/perl/perlref.pod#Symbolic32references

775 :デフォルトの名無しさん:2018/12/17(月) 12:59:58.19 ID:GlvD8kJn.net
>>774
ありがとう
リファレンスで間接的?に定義された場合のみ暗黙的にアクセス可能になるのか
変な挙動だなぁ

昨日一応手元でワンライナー書いてから質問したんだけど
変数名を別に定義済みの場合は暗黙的解釈は成されないんだね
変だー

776 :770:2018/12/17(月) 17:36:00.20 ID:fClvoBXn.net
>>771
ごめん。
「そこはまず、ハードリファレンスでしょ。Perl4 の時代に生きてるの?」
という意味です。自分でも不適切な表現だったと思う。
一応彼らの名誉のために言っとくが、回答に明確な間違いは無いと思う。
でも「${$key} の $key は何?」と聞かれて「変数名」と答えるのは
現代の Perl にそぐわないと思うの。
でももしかしたら、説明しても理解してもらえなさそうと思ったのだろうか。

777 :デフォルトの名無しさん:2018/12/17(月) 19:18:45.78 ID:iB9eUrL3.net
質問者がなんにも知らなそうだから、「リファレンス」をあえて避けたんやろ。

778 :デフォルトの名無しさん:2018/12/17(月) 19:20:00.23 ID:da/cFEJ/.net
>>772
name をリファレンスだと思う
(思うだけ。そんな文法ではない)

そうすると、そのリファレンスを$でデリファレンスしたものが$name
@でデリファレンスしたものが@name

$nameがリファレンスの場合に$でデリファレンスすると$$name なのは当たり前として、
$$$, $$$$ とどんどんデリファレンスしていける逆方向を辿ると、
$name もデリファレンスしたものだと見える

779 :デフォルトの名無しさん:2018/12/18(火) 09:06:48.26 ID:eR20sfLy.net
>>778
うーん
言いたいことはわからんでもないけど
Perlはそもそもスカラと配列とハッシュで名前空間が独立だからな…

780 :デフォルトの名無しさん:2018/12/27(木) 15:34:57.10 ID:6u25HEJq.net
入力文字に$記号を含むパターンマッチについての質問

<input type="text" name="word">という入力フォームで$を入力して送信する
$form_data{'word'}はそれを受け取ったデータでこの場合$記号が格納されているとする

my $data = "aaa$bbb";

if($data =~ /$form_data{'word'}/){

print "ドル記号が含まれている";

}

とするとドル記号が含まれていると表示されるけど
$data="aaabbb";としてもドル記号が含まれていると表示されてしまいます
どうしたらうまくパターンマッチできるんですか?

781 :デフォルトの名無しさん:2018/12/27(木) 16:48:29.52 ID:rm0epPGS.net
quotemeta 使えば?

782 :デフォルトの名無しさん:2018/12/27(木) 17:39:49.72 ID:xdSwIlO3.net
モダンPerl入門 増補改訂版(仮)
https://codezine.jp/book/modernperl2

まだ?

783 :デフォルトの名無しさん:2018/12/27(木) 17:47:23.74 ID:wqcRhsb/.net
> my $data = "aaa$bbb";
変数($bbb)が展開されてしまってるのでは?

784 :デフォルトの名無しさん:2018/12/27(木) 17:55:58.93 ID:aB5zW/KI.net
>>780
\$

785 :デフォルトの名無しさん:2018/12/28(金) 05:51:18.79 ID:zGkqlDaV.net
if ($data =~ /\Q$form_data{'word'}\E/) {
print "ドル記号が含まれている";
}

786 :デフォルトの名無しさん:2018/12/28(金) 18:58:04.24 ID:Kla9dPfb.net
ドルを含むかなら$data =~ /\$/ か$form_data{'word'} =~ /\$/ならわかるけど、
なぜ$dataと$form_data{'word'}をパターンマッチさせているのかがわからない。

787 :デフォルトの名無しさん:2018/12/28(金) 19:19:12.35 ID:PEXz027h.net
入力文字列を正規表現ではなくただの文字列として扱うならこっちの方が速い
if (index($data, $form_data{'word'}) >= 0) {

788 :デフォルトの名無しさん:2018/12/29(土) 10:19:08.15 ID:UbMSpY+5.net
どのように書いたら配列の1,2,3を、それぞれ表示できるでしょうか?お願いします
sub test{
return \(1,2,3);
}
print test(); # SCALAR(0x169bc48)SCALAR(0x169bca8)SCALAR(0x169bc90)
print ${test()}; # 3

789 :デフォルトの名無しさん:2018/12/29(土) 10:57:10.93 ID:mEoLSW4X.net
sub test{
return \[1,2,3];
}
$" = ',';
print "@${test()}\n";

use Data::Dumper;
print Dumper(test());

790 :デフォルトの名無しさん:2018/12/29(土) 11:13:23.47 ID:Q3TbjvxP.net
#これが基本
@array = (1, 2, 3);
print "@array", "\n";

#戻り値にするなら
sub func1 {
my @array = (1, 2, 3);
return \@array;
}

print "@{func1()}", "\n";

#無名の場合
sub func2 {
return [1, 2, 3];
}

print "@{func2()}", "\n";

791 :デフォルトの名無しさん:2018/12/29(土) 11:19:02.45 ID:UbMSpY+5.net
>>789 レスどうもです。

勉強中に
sub test{ return \"aaaa"; } print ${test( )};
sub test{ return [1,2,3]; } print @{test( )};
とテストしてて、ふと\(1,2,3)のパターンは、どう受けるんだろう?と悩んでます。
リストだとオート変数で消えるのかな?とか、
リスト→スカラー変数で最後の3しか受けれないのかな?などと考える程度で、さっぱり仕様がわかってません。

あと、
my $data="aaaaa";
my $test= $data=~ tr/a/b/;
print $test;
これもイケそうでイケなかったので悩んでます。

----と書いてるところでログ更新したら790を見ました。

792 :デフォルトの名無しさん:2018/12/29(土) 11:24:43.16 ID:UbMSpY+5.net
なるほど、これはダメですね。
print Dumper($data=~ tr/a/b/); #5

793 :デフォルトの名無しさん:2018/12/29(土) 11:40:12.74 ID:JLECNNE+.net
>>791
リストをスカラー評価すると、そのリストの要素数になる。
こういうときにまぎらわしいので、(10,20,30)とかオススメ。

794 :デフォルトの名無しさん:2018/12/29(土) 11:45:55.56 ID:UbMSpY+5.net
いまテストしてました。
>>793 なるほど

sub test1{
return \(11,22,33);
}
sub test2{
return \[11,22,33];
}

use Data::Dumper;
print Dumper(test1());
$VAR1 = \11;
$VAR2 = \22;
$VAR3 = \33;

print Dumper(test2());
$VAR1 = \[ 11, 22, 33 ];

ここまで確認しましたが、test1の11を表示する方法がわかりません。
よろしくお願いします。

795 :デフォルトの名無しさん:2018/12/29(土) 11:56:22.23 ID:JY4FTrNS.net
リファレンスが何を表しているのか理解しよう

$var = 11;
$ref = \$var;

say $var
say \$var;
say $ref;
say $$ref;
say ${$ref};

796 :デフォルトの名無しさん:2018/12/29(土) 12:30:51.49 ID:UbMSpY+5.net
下記の test2() は動きます。
でもこれだと@aと@bの@が目印程度の意味しかないのかな?と思ってしまいます。

sub test1{
return (11,22,33);
}
sub test2{
return \(11,22,33);
}

use Data::Dumper;
print Dumper(test1());
print Dumper(test2());

@a=test1();
print $a[0]; # 11

@b=test2();
print ${$b[0]}; # 11

797 :デフォルトの名無しさん:2018/12/29(土) 12:33:10.04 ID:UbMSpY+5.net
上が動くのに、下が動きません。

@b=test2();
print ${$b[0]}; # 11

print ${test2()[0]}; #動きません

798 :デフォルトの名無しさん:2018/12/29(土) 12:59:01.67 ID:N37bA3c4.net
print ${(test2())[0]};

799 :デフォルトの名無しさん:2018/12/29(土) 13:09:45.93 ID:UbMSpY+5.net
>>798
ありがとうございます。やっと書き方がわかりました

もう1つ質問がありますので書きます。

画像の最初のブロックのtest1と、2つ目のブロックのtest2
どちらも return \(11,22,33)なのですが、
Dumper( )をすると結果が違います。何故でしょうか?
ブロックスコープの扱いを間違えてるとか、根本的な間違えはあるでしょうか?

https://i.imgur.com/HpjnvGf.png

800 :デフォルトの名無しさん:2018/12/29(土) 13:27:10.67 ID:mEoLSW4X.net
>>794のDumperの結果見ればわかるけど
\(11,22,33);

(\11,\22,\33);
と書くのと同じで配列のリファレンスではなく中身をリファレンス化して作った配列
上でぼけてて\[1,2,3]なんて書いちゃったけど…[11,22,33]が配列のリファレンス

801 :デフォルトの名無しさん:2018/12/29(土) 13:38:48.59 ID:UbMSpY+5.net
イメージはわかりました。先ほどのtest2( )を更に( )で囲んでからの[0]は気づきませんでしたが。

 return ポインタのポインタ
 ↓
 (ポインタ、ポインタ、ポインタ) → 実体11,22,33

802 :デフォルトの名無しさん:2018/12/29(土) 13:47:25.71 ID:JY4FTrNS.net
配列とリストが違う概念っていうのはわかりにくいよね
@array
(1, 2, 3)

803 :デフォルトの名無しさん:2018/12/29(土) 14:17:08.53 ID:Q3TbjvxP.net
\( ... ) なんて書き方はどんな時に使うんだろう

804 :デフォルトの名無しさん:2018/12/29(土) 19:13:44.30 ID:JLECNNE+.net
>>802
Perl5で配列とリストは同じ意味だろ。

805 :デフォルトの名無しさん:2018/12/29(土) 19:19:17.64 ID:JLECNNE+.net
>>803
だから、まとめてリファレンスをとるときだろ。
@list=\($a,$b,$c);
$$list[0]=0; # $a=0;

806 :デフォルトの名無しさん:2018/12/30(日) 08:38:58.47 ID:d/kczs//.net
>>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番めの要素をデリファレンス)

807 :デフォルトの名無しさん:2018/12/30(日) 08:50:22.81 ID:d/kczs//.net
いい記事があった

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

「モダンなPerlを「読む」上で覚えておくとよい構文 第2回「リストを理解すれば配列とハッシュをより活用できる」」
ttp://www.songmu.jp/riji/archives/2010/09/perl_2_1.html

808 :デフォルトの名無しさん:2018/12/30(日) 08:53:03.67 ID:x1KM9vdn.net
列挙してまとめてリファレンスなんか取ることあるか?

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

そんな書き方は無いものと思って使わないのが吉

809 :デフォルトの名無しさん:2018/12/30(日) 08:53:43.65 ID:/wKH6dhf.net
リスト・・・複数の値
配列・・・複数の値が入ってるオブジェクト

ようするにこんだけだろ?

810 :デフォルトの名無しさん:2018/12/30(日) 08:56:13.19 ID:/wKH6dhf.net
Perlにとってオブジェクト指向は
頑張ってオブジェクトに見えるものを作り出すもので
オプショナルな存在だから
リストと配列の違いをシンプルに説明できないんだろうな

811 :デフォルトの名無しさん:2018/12/30(日) 09:00:51.60 ID:x1KM9vdn.net
オブジェクト指向だと言うにはカプセル化は必須で、
メンバ変数をダイレクトにいじるとかやっちゃ駄目な筈なんだけど、
その方が便利だから普通にやってる

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

一緒やん

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

オブジェクト指向言語というのは
オブジェクト指向を行うために用意された文法がある。
条件はこれだけ

813 :デフォルトの名無しさん:2018/12/30(日) 10:57:52.01 ID:d/kczs//.net
アンダースコアから始まるメンバ変数はプライベートなので外側から触ってはいけません

よしカプセル化できたな!!!

814 :デフォルトの名無しさん:2018/12/30(日) 11:50:53.97 ID:iF2NHAVN.net
>>813
カプセル化か? ・・・ YES 命名規則によるカプセル化

815 :615:2018/12/31(月) 00:31:18.84 ID:Hr+PmI8P.net
Perlのオブジェクト指向??は記述がちょっと変体言語風な見た目だけれど
Cのstructを拡張したような型クラス+継承に基づく言語よりも
propertyベースOOP+mixinのような柔軟な表現が出来て
良いんじないかと俺は思う

816 :デフォルトの名無しさん:2018/12/31(月) 00:44:01.46 ID:LUt0Quvy.net
gotoは柔軟だから優れていると言っているようなもので、
何でも出来る = 優れている ・・・ これは間違いなんだよ

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

特定の用途専用(=柔軟性がない)の文法があることで
書き方が統一できるし、何がしたいのかという意図を
他人に伝えることが出来る

817 :615:2018/12/31(月) 01:09:11.59 ID:Hr+PmI8P.net
制限の方向性が弊害を持っているのに
広く普及しちゃうと悲惨なことになる

818 :デフォルトの名無しさん:2018/12/31(月) 01:10:55.58 ID:LUt0Quvy.net
それでPerlのオブジェクト指向、mooseとかどうなりましたか?

819 :615:2018/12/31(月) 01:12:14.36 ID:Hr+PmI8P.net
>>818
あんまし使われていない

820 :615:2018/12/31(月) 01:13:48.73 ID:Hr+PmI8P.net
JavaもCOBOLみたいな立ち位置になるだろうし

821 :デフォルトの名無しさん:2018/12/31(月) 01:16:04.10 ID:LUt0Quvy.net
>>819
そうなるやろ?

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

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

だめなんですよ。柔軟だけど機能が足りないというのは。

822 :デフォルトの名無しさん:2018/12/31(月) 08:07:22.77 ID:C6w6M91j.net
TMTOWTDI は正義。

823 :615:2018/12/31(月) 10:01:45.42 ID:2dwmQiqr.net
Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

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

性能に関してはC++のような最下層でも効率的なものではないし、Property baseという
特徴から見ても、中間レイヤ・グレインで使うのに適した仕組みだと考えていますが

824 :デフォルトの名無しさん:2018/12/31(月) 10:15:50.03 ID:0rbvsgzk.net
オブジェクト指向は結果オブジェクト指向なだけでやりたいことはオブジェクト指向じゃない

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

どこまで忘れていいかは実装のセンスに依るので、言語仕様は関係ない

825 :デフォルトの名無しさん:2018/12/31(月) 10:44:08.74 ID:LUt0Quvy.net
> Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。

PerlにOOPの機能が不足してるからそうなるわけだよ

826 :デフォルトの名無しさん:2018/12/31(月) 10:45:08.33 ID:LUt0Quvy.net
>>822

嘘つき人間「TMTOWTDI は正義」

証明もされてないことを言ったって
何の意味もないんやで

827 :デフォルトの名無しさん:2018/12/31(月) 12:37:43.61 ID:C6w6M91j.net
>>826
己れの方こそ嘘つきだな
「証明もされてないことを言った」つまり真実か嘘か判定不能な段階なのに「嘘つき」のレッテル貼りとか

TMTOWTDI はPerlの基本方針でありPerlをPerlたらしめている特徴であり
しばしばPerlを好み愛用し続ける者にとってはその大きい理由でもある
ゆえに「TMTOWTDI は正義」である

総レス数 1004
248 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★