【モダン推奨】Perlについての質問箱 50箱目
■ このスレッドは過去ログ倉庫に格納されています
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 辺り my ($num, $unit) = $data =~ /(\d+)(.+)/; でもいける 747だけど $data = "100歳";の場合は100と歳に分割できたけど $data = "100";の単位が無い場合は10と0になってしまいました 単位が無い場合は100と単位は空に分割するようにしたいです どうすればいいんですか? そうだよな。 >>752 のどこか一文字変えればいいんだけど、 さて、どこをどう変えようか? つ for (qw{100歳 10000ドル 100 歳}) { my ($d, $o) = /((?:\d*+)?)((?:[^\d]*)?)/; print "$d : $o\n"; } $ perl 758.pl 100 : 歳 10000 : ドル 100 : : 歳 >>758 いやこれで十分だった for (qw{100歳 10000ドル 100 歳}) { my ($d, $o) = /(\d*+)([^\d]*)/; print "$d : $o\n"; } $ perl 759.pl 100 : 歳 10000 : ドル 100 : : 歳 >>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記法っぽい書き方」はできる?? pythonの2と3が未だに入り乱れていて両方入れとくしかない状態が続いてる パスが通ってるのは2で、3はパス込みで起動 perlの変数名($無しの部分)ってリファレンスなんだよな $name がリファレンスの時、@$name でデリファレンスされることと、 @name と書くことは同じ意味になる $#name と書きたい時にも敷衍できて、nameの代わりに{$name}と書いて、 $#{$name} と書くと思った通りの意味になる 「Perl4 を使っている」というのは言い過ぎだったかな。 eval を使えばシンボリックリンクを実現できるけど ${$key} という表記はできなかったからね。 このカテゴリマスターの方々は単に Perl を知らないんだろう。 知らないのはいいが、なぜ回答するのか。 書き間違えた。 s/シンボリックリンク/シンボリックリファレンス/ え…何が? 表記のことなら Perl4 ではできなかった Perl5 の表記なんだけど。 あ、デリファレンス記述を知らんヤツ発見、て意味だった? 勘違いした。w >>766 > $name がリファレンスの時、@$name でデリファレンスされることと、 > @name と書くことは同じ意味になる ん? $name と @name は別物じゃね? @s = qw/a b c/; $x = \@s; print join ",", @x; # "" print join ",", @$x; # "a,b,c" よくわからんけど気になるのだけど 結局リファレンスをデリファレンスして値つっこんでるだけ、でいいんだよね? 回答者が勘違いしてる変数名の変数指定ってどうやるんだっけか >>774 ありがとう リファレンスで間接的?に定義された場合のみ暗黙的にアクセス可能になるのか 変な挙動だなぁ 昨日一応手元でワンライナー書いてから質問したんだけど 変数名を別に定義済みの場合は暗黙的解釈は成されないんだね 変だー >>771 ごめん。 「そこはまず、ハードリファレンスでしょ。Perl4 の時代に生きてるの?」 という意味です。自分でも不適切な表現だったと思う。 一応彼らの名誉のために言っとくが、回答に明確な間違いは無いと思う。 でも「${$key} の $key は何?」と聞かれて「変数名」と答えるのは 現代の Perl にそぐわないと思うの。 でももしかしたら、説明しても理解してもらえなさそうと思ったのだろうか。 質問者がなんにも知らなそうだから、「リファレンス」をあえて避けたんやろ。 >>772 name をリファレンスだと思う (思うだけ。そんな文法ではない) そうすると、そのリファレンスを$でデリファレンスしたものが$name @でデリファレンスしたものが@name $nameがリファレンスの場合に$でデリファレンスすると$$name なのは当たり前として、 $$$, $$$$ とどんどんデリファレンスしていける逆方向を辿ると、 $name もデリファレンスしたものだと見える >>778 うーん 言いたいことはわからんでもないけど Perlはそもそもスカラと配列とハッシュで名前空間が独立だからな… 入力文字に$記号を含むパターンマッチについての質問 <input type="text" name="word">という入力フォームで$を入力して送信する $form_data{'word'}はそれを受け取ったデータでこの場合$記号が格納されているとする my $data = "aaa$bbb"; if($data =~ /$form_data{'word'}/){ print "ドル記号が含まれている"; } とするとドル記号が含まれていると表示されるけど $data="aaabbb";としてもドル記号が含まれていると表示されてしまいます どうしたらうまくパターンマッチできるんですか? > my $data = "aaa$bbb"; 変数($bbb)が展開されてしまってるのでは? if ($data =~ /\Q$form_data{'word'}\E/) { print "ドル記号が含まれている"; } ドルを含むかなら$data =~ /\$/ か$form_data{'word'} =~ /\$/ならわかるけど、 なぜ$dataと$form_data{'word'}をパターンマッチさせているのかがわからない。 入力文字列を正規表現ではなくただの文字列として扱うならこっちの方が速い if (index($data, $form_data{'word'}) >= 0) { どのように書いたら配列の1,2,3を、それぞれ表示できるでしょうか?お願いします sub test{ return \(1,2,3); } print test(); # SCALAR(0x169bc48)SCALAR(0x169bca8)SCALAR(0x169bc90) print ${test()}; # 3 sub test{ return \[1,2,3]; } $" = ','; print "@${test()}\n"; use Data::Dumper; print Dumper(test()); #これが基本 @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"; >>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を見ました。 なるほど、これはダメですね。 print Dumper($data=~ tr/a/b/); #5 >>791 リストをスカラー評価すると、そのリストの要素数になる。 こういうときにまぎらわしいので、(10,20,30)とかオススメ。 いまテストしてました。 >>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を表示する方法がわかりません。 よろしくお願いします。 リファレンスが何を表しているのか理解しよう $var = 11; $ref = \$var; say $var say \$var; say $ref; say $$ref; say ${$ref}; 下記の 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 上が動くのに、下が動きません。 @b=test2(); print ${$b[0]}; # 11 print ${test2()[0]}; #動きません >>798 ありがとうございます。やっと書き方がわかりました もう1つ質問がありますので書きます。 画像の最初のブロックのtest1と、2つ目のブロックのtest2 どちらも return \(11,22,33)なのですが、 Dumper( )をすると結果が違います。何故でしょうか? ブロックスコープの扱いを間違えてるとか、根本的な間違えはあるでしょうか? https://i.imgur.com/HpjnvGf.png >>794 のDumperの結果見ればわかるけど \(11,22,33); は (\11,\22,\33); と書くのと同じで配列のリファレンスではなく中身をリファレンス化して作った配列 上でぼけてて\[1,2,3]なんて書いちゃったけど…[11,22,33]が配列のリファレンス イメージはわかりました。先ほどのtest2( )を更に( )で囲んでからの[0]は気づきませんでしたが。 return ポインタのポインタ ↓ (ポインタ、ポインタ、ポインタ) → 実体11,22,33 配列とリストが違う概念っていうのはわかりにくいよね @array (1, 2, 3) \( ... ) なんて書き方はどんな時に使うんだろう >>802 Perl5で配列とリストは同じ意味だろ。 >>803 だから、まとめてリファレンスをとるときだろ。 @list=\($a,$b,$c); $$list[0]=0; # $a=0; >>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番めの要素をデリファレンス) いい記事があった 「リストと配列(Array)はPerlでは別物」 ttps://togetter.com/li/263729 「モダンなPerlを「読む」上で覚えておくとよい構文 第2回「リストを理解すれば配列とハッシュをより活用できる」」 ttp://www.songmu.jp/riji/archives/2010/09/perl_2_1.html 列挙してまとめてリファレンスなんか取ることあるか? 数が多いなら普通はループにすることを考える 3つくらいなら普通に書けばいい 何かの関数の引数にリファレンスでいっぱい渡すくらいしか思いつかないけど、 そんなインターフェースがそもそも間違ってるし可読性も下がる そんな書き方は無いものと思って使わないのが吉 リスト・・・複数の値 配列・・・複数の値が入ってるオブジェクト ようするにこんだけだろ? Perlにとってオブジェクト指向は 頑張ってオブジェクトに見えるものを作り出すもので オプショナルな存在だから リストと配列の違いをシンプルに説明できないんだろうな オブジェクト指向だと言うにはカプセル化は必須で、 メンバ変数をダイレクトにいじるとかやっちゃ駄目な筈なんだけど、 その方が便利だから普通にやってる $obj->setval($val); $obj->{val} = $val; 一緒やん > オブジェクト指向だと言うにはカプセル化は必須で、 必須じゃないよ。てか必須なものなんて無い オブジェクト指向言語というのは オブジェクト指向を行うために用意された文法がある。 条件はこれだけ アンダースコアから始まるメンバ変数はプライベートなので外側から触ってはいけません よしカプセル化できたな!!! >>813 カプセル化か? ・・・ YES 命名規則によるカプセル化 Perlのオブジェクト指向??は記述がちょっと変体言語風な見た目だけれど Cのstructを拡張したような型クラス+継承に基づく言語よりも propertyベースOOP+mixinのような柔軟な表現が出来て 良いんじないかと俺は思う gotoは柔軟だから優れていると言っているようなもので、 何でも出来る = 優れている ・・・ これは間違いなんだよ アセンブラという何でも出来る言語から進化し、 特定の用途の「パターン」を見つけて抜き出し、 そのパターンを専用の文法にしてきた。 特定の用途専用(=柔軟性がない)の文法があることで 書き方が統一できるし、何がしたいのかという意図を 他人に伝えることが出来る 制限の方向性が弊害を持っているのに 広く普及しちゃうと悲惨なことになる それでPerlのオブジェクト指向、mooseとかどうなりましたか? JavaもCOBOLみたいな立ち位置になるだろうし >>819 そうなるやろ? 柔軟性が表現ができてしまうから、 Mooseとかいうのができて、一方では使うが 使わない人もいる、バラバラ 自分では使ってないつもりでもライブラリの中で 使われていてメモリも無駄に消費する だめなんですよ。柔軟だけど機能が足りないというのは。 Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。 Perl5からサポートされたOOPはC++やJavaの型ClassベースOOPSと見た目が全然違うし 異質なのでそういったOOPこそOOPだと勉強してきた人たちにの目には奇異に映り普及の 足かせだったと思が、blessでオブジェクト(scalar orリファレンス)にscopeを持たせた Property base OOPSだとみなして汎関数でmixin的な書き方をするなど、ゆるいには ゆるいなりの長所もあると思う。これはPythonのOOPSのゆるさとも通じるところがあると思う。 性能に関してはC++のような最下層でも効率的なものではないし、Property baseという 特徴から見ても、中間レイヤ・グレインで使うのに適した仕組みだと考えていますが オブジェクト指向は結果オブジェクト指向なだけでやりたいことはオブジェクト指向じゃない 同じこと何度も書きたくないからライブラリ化したいだけで、 一旦ライブラリにしたら極力中身のことを忘れていいようにしたいだけ どこまで忘れていいかは実装のセンスに依るので、言語仕様は関係ない > Mooseは他の言語のようなOOPをPerlに持ち込んでどっちつかずの立ち位置になってしまった。 PerlにOOPの機能が不足してるからそうなるわけだよ >>822 嘘つき人間「TMTOWTDI は正義」 証明もされてないことを言ったって 何の意味もないんやで >>826 己れの方こそ嘘つきだな 「証明もされてないことを言った」つまり真実か嘘か判定不能な段階なのに「嘘つき」のレッテル貼りとか TMTOWTDI はPerlの基本方針でありPerlをPerlたらしめている特徴であり しばしばPerlを好み愛用し続ける者にとってはその大きい理由でもある ゆえに「TMTOWTDI は正義」である >>828 オブジェクト指向を行うための標準的な方法 型クラス+継承を使ったオブジェクト指向は モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので オレはなるべく使わないようにしている クラス設計して継承して、みたいなのは人間の能力を越えてる 継承も抽象度を高めたいとかそんな大層な目的じゃなくて、 やっぱり同じこと何度も書きたくないからやってるだけで、 よっぽど汎用性の高い概念なら継承でうまくいくかもしれんけど、 そんなんは最初から内蔵されてるのが普通 >>830 > モジュラリティーや依存の観点からソフトウェア工学的に害が見られるので 知ってる単語を並べただけなのは恥ずかしいですよw × クラス設計して継承して、みたいなのは人間の能力を越えてる ○ クラス設計して継承して、みたいなのは>>831 の能力を越えてる >>833 なぜそんなに人に絡む。 嫌なことでもあったのか、 あるいは単に嫌な奴かなだけか… >>834 お前が自分にできないことは、人間全部できないんだとか 言ってるから、お前ができないだけだよって訂正してるだけだが? >>836 俺は何が出来ないとか一言も書いてないが。 何かと混乱してるのか?知らんけど >829 名前:デフォルトの名無しさん[sage] 投稿日:2018/12/31(月) 17:58:26.87 ID:LUt0Quvy >>828 >オブジェクト指向を行うための標準的な方法 それをperlに求めるのは筋違いだろ。 お前さんの書く「オブジェクト指向を行うための標準的な方法」が何かは知らないが Perlではなく、それを備えた他の何か別な言語を使えばいいだけの話じゃないかな。 >>837 > 俺は何が出来ないとか一言も書いてないが。 できないなら、できないと認めて、書けって言ってるんだよ。 お前は他の人ができるクラス設計をできないんだから >>838 >>825 で「PerlにOOPの機能が不足してるからそうなるわけだよ」って言ったら >>828 で具体的に不足してる機能は?って聞かれたから それに答えただけですが? PerlにOOPの機能で不足しているものを聞かれたんだから それに答えるのは普通でしょう。 >>829 「標準的」とは? もしクラスベースOOPとしての話なら、そもそもPerl5に求めるのが大間違い。 Perl5にはPerl5のやりかたがあるんだから。 そのやり方が不足しているために、いろんなやり方ができてしまって 混乱してるって話をず〜っとしてるんだが それがPerl。 いろんなやりかたがあってもいい。 イヤならPythonでもRubyでもどうぞ。 >>844 嫌とは言ってないよ Perlはオブジェクト指向をやるときに標準なやり方がないので 人やライブラリによって書き方が異なる 最小限の機能しか持っていないため、書き方が煩雑になる。 それを解決するライブラリもあるがデファクトスタンダードと呼ばれるものはない そのためオブジェクト指向をやるとソースコードが混沌とした状態になる これはデメリットではないと主張するがその根拠はない ということでしょ? Javaのオブジェクト指向じゃダメだからいろんなオブジェクト指向の言語が乱立しているのに Perlは記述に拡張性があるから、 幾つかのオブジェクト指向の仕組みを拡張しようという流れが出たのは 自然なことで、宿命みたいなものだよ うん。だからいろんなやり方が出て混沌状態になった。 駄目とは言ってないよ。 混沌状態になるといってるだけ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる