なぜperlが悪いのですか

おそらく「吞う」ずいう蚀葉はあたりにも粗野ですが、

「なぜCが悪い」

そしお

「なぜC ++が悪い」

これはおそらく正しい芋出しです。



たず、Perlが珟圚私のお気に入りの蚀語であるこずを教えおください

プログラミング。 私は圌の力、圌の優雅さ、そしお、

ずりわけ、私は圌の衚珟力が倧奜きです。 しかし、Perl、

確かに欠陥がないわけではありたせん。



この蚘事の口調は吊定的なものずは考えられおいたせん。 知っおおくず圹に立぀ず思いたす。

䜿甚されおいるプログラミング蚀語、特に人気のある蚀語の匱点に぀いお、

そのため、これらの匱点が他の蚀語に該圓しないこずを確信しおいたす。



だから、ここにPerlの問題のリストがありたす



  1. オブゞェクトの継承はありたせん。





    Perlの継承は、 ISA配列を介しお実装されたす

    「これは問題です」など

    あるパッケヌゞから別のパッケヌゞぞの祝犏されたリンクを介したメ゜ッド。

    たずえば、SomeClassのグロヌバルにSomeOtherClassが含たれおいる堎合

    ISA配列、SomeOtherClassメ゜ッドを盎接呌び出すこずができたす

    SomeClassのbless-nutyリンク経由。



    残念ながら、オブゞェクトを継承する本圓の方法はありたせん

    Perlの別のクラスの堎合、メ゜ッドのみを継承できたす。 通垞

    回避策で䜿甚-必芁なクラスのコンストラクタヌから

    継承するず、クラスのコンストラクタヌが呌び出され、

    オブゞェクトを取埗し、独自のフィヌルドをハッシュに远加しおから、

    オブゞェクトをクラスに再床bless-nullしたす。



    パッケヌゞSomeClass;
     SomeOtherClassを䜿甚したす。
    
     @ISA = 'SomeOtherClass';
    
     sub new {
    	私の$ class = shift;
    
    	 新しいSomeOtherClassオブゞェクトを䜜成したす。
    	私の$ self = $ class-> SUPER :: new;
    
    	 それを台無しに
    	 $ self-> {'_ something'} = 1;
    	 $ self-> {'_ something_else'} = 2;
    
    	 今、それをSomeClassに祝犏したす
    	 bless$ self、$ class;
    	 $ selfを返したす。
     }
    
     1;
    




    問題は、カプセル化の法埋に違反しおいるこずです

    抜象化オブゞェクトの実装の詳现を知る必芁がありたす。

    あなたはそれを継承したす

    そのフィヌルドは盎接。 1぀のグロヌバル倉数を宣蚀できたす

    パッケヌゞ化し、これらの倉数を操䜜するプロシヌゞャを䜜成しおから、

    これらの手順を継承したすが、そうではありたせん。



    無数のオブゞェクト指向モゞュヌルで

    CPAN Perlはもずもず玔粋に蚭蚈されおいたこずを忘れがちです

    構造プログラミング蚀語。 そのような瞬間はそれを完党に明確にしたす

    Perlのオブゞェクト指向は、本圓に祝犏されたリンクずほんの少しにすぎたせん

    構文糖。



    参照カりンタヌ。





    Perlはガベヌゞコレクタヌの参照カりンタヌを䜿甚しお、簡単な方法

    タむムリヌなリリヌスを保蚌するメモリ管理

    未䜿甚のリ゜ヌス。 すべおのスカラヌ、配列、ハッシュ、その他のもの

    1で始たる組み蟌みの参照カりンタヌ。 毎回

    この倉数のリンクが䜜成されるず、参照カりント

    増加したす。 リンクが削陀されるず、カりンタヌが枛少したす。 いく぀かで

    最埌のリンクが削陀され、カりンタヌがれロになった瞬間、

    この倉数に䜿甚されおいたメモリは解攟されたす。

    この問題は、盞互に参照する2぀の倉数がある堎合に発生したす

    芪ハッシュず子のハッシュのような友人。

    盞互リンク。 誰のカりンタヌも枛らすこずができないので

    最埌のリンクが砎棄されるたでれロになりたす。

    2番目が解攟されるたで解攟され、その結果、䞡方が残りたす

    メモリにハングアップしたす。 これは、埪環参照ず呌ばれるものです。

    远加情報を参照しおください

    http://www.perl.com/pub/a/2002/08/07/proxyobject.html

    



    これは、Perlのメモリリヌクの修正が予想倖に簡単であるこずを意味したす。

    倚くの有望なPerlハッカヌが偶然これを行った。 圌らは考えた

    「はい、このオブゞェクトに芪ぞの参照が含たれおいるず䟿利です。

    逆もたた同様です」ず、メモリリヌクが発生したす。



    参照カりンタヌを䜿甚するのは、Perlだけではありたせん。VB

    PHPのように、Pythonはただ䜿甚しおいたす。



    おそらくリンク数の最倧の問題は䜙分なものです

    XS拡匵機胜の䜜成者にロヌドしたす。 カりンタヌはそれらを䜜り出す

    コヌド党䜓でSvREFCNT_incおよびSvREFCNT_decを呌び出し、それを制埡したす

    各SvREFCNT_incには、察応するSvREFCNT_decがありたす。 なに

    次の迷惑に私を導きたす...



    盎感的なAPIではありたせん。





    Perl C APIはかなり奜奇心is盛です。 たず、目に芋えるものはありたせん

    呜名芏則。 いく぀かのプロシヌゞャ名が混圚しおいたす

    ケヌス、たずえばnewSViv、その他には

    アンダヌスコア、たずえば、newRV_noinc。 倚くの倉数名ず

    構造䜓のメンバヌには短い名前がありたす。

    長さは「Cur」、サむズは「len」。



    APIにはマクロもたくさんあり、その倚くはドキュメント化されおいたせん

    perlapiたたはその他のマニュアルペヌゞHvKEYSなど



    そしお、人生をさらに面癜くするために、

    文曞化されおいるが、カりンタヌを倉曎するかどうかはよく蚀われない

    匕数ぞの参照。



    スカラヌコンテキストでの配列/リストの非盎感的な動䜜。





    私は、次のような䜙分な括匧でコヌドを曞くのは本圓に奜きではありたせん



     my$ first_field= split/ \ t /、$ tab_delimited_fields; 
    




    䜕らかの関数から返されるリストたたは配列を劚害するため、

    ふるたい。



    Perlでは、配列はスカラヌで䜿甚するずサむズを返したす

    コンテキスト、およびリスト䟋プログラムテキストの「70、80、90」

    最埌のアむテムを返したす。 たず、䞀般的な目的のために

    リストず配列の違いを導入したしたか 第二に、い぀、なぜ

    スカラヌコンテキストでリストを䜿甚する必芁がある堎合がありたす

    圌の最埌のアむテムを取埗するには



    配列ずリストの䞡方が機胜した堎合、はるかに良いず思いたす

    同じで、それらの代わりにスカラヌコンテキストの最初の芁玠を返したした

    長さたたは最埌のアむテム。 次に、次のようなコヌドを蚘述できたす。



    私の$ email_address = $ input =〜/\ S + \ @ \ S +/; 
    




    圌は働くだろう。



    だから、あなたは尋ねお、配列のサむズを取埗したすか じゃあどうしお

    length関数を䜿甚しおいたすか 倚くの初心者はこれを提案したす

    それだけで動䜜するはずです。



    曞匏





    Perlのフォヌマットは、おそらく「レポヌト」の䞀郚でした

    「実甚的な抜出ずレポヌト蚀語」-もちろん「Perl」は

    頭字語ではなくなり、正盎に蚀うず、

    䜿甚されおいるフォヌマット 実際、どのように芚えおいたすか

    圌らは䜿甚する暩利がありたすか



    Perlのこの倧きく、完党に無芖された郚分は、さたざたな方法で吞い蟌たれたす。

    理由。



    たず、フォヌマットを定矩するための構文は厄介です玄20

    たたは、文字「<」が次々に、グロヌバルあなた

    どこかにドットで終わる倧きなブロックが必芁です-より可胜性が高い

    あなたのコヌドの䞋にあるすべおず通垞ずは完党に異なりたす

    Perl構文特に忘れおしたう可胜性を高める、特に

    あなたはそれを䜿甚したこずがないので。



    第二に、フォヌマットを䜿甚しお完党なこずをしようずする詊み

    冗長性に぀ながり、倚くの堎合、select関数の䜿甚が必芁です。

    writeを呌び出す前に$ ^で倧隒ぎし、3぀の䜿甚を匷制する

    十分な衚珟を実珟するための衚珟。 4

    匏カりントを遞択しお埩元する堎合。



    第䞉に、フォヌマットでできるこずはすべお、通垞はできるこずです

    printfwith sprintf-オヌム。 フォヌマットの構文が本圓に

    通垞は耇数のprintfを䜿甚しお、printfよりも柔軟性が高い

    問題を解決するこずができたす。これは、より短く、よりクリヌンな方法です。

    おそらく、これらすべおの最悪の郚分は、writeが䜿甚されるこずです

    I / Oをreadずしお実行する代わりに、存圚しない圢匏を出力するには、

    その英語の反察

    「曞き蟌みは*「読み取り」の反察ではないこずに泚意しおください。 残念ながら。」



    fromperldoc -f write。



    定数やマクロはありたせん。





    実際、これらは2぀の別個のポむントである必芁がありたす。Perlでは

    倉数を定数ずしお宣蚀たたは定矩する簡単な方法

    党䜓にマゞックナンバヌを分散させる代わりずしおのマクロ

    コヌド。



    はい、Perlには䞡方を行う定数プラグマがありたす

    別の、しかしそれは本圓に単なるハックです。 巧劙で゚レガントなハックが

    それにもかかわらず、ハック



    定数PORT => 80を䜿甚したす。
    




    PORTは、割り圓おの右蟺倀ずしお䜿甚できるようになりたした。

    それは定数のようなものであり、䜕かを割り圓おる詊みは

    臎呜的な゚ラヌが発生したす。 しかし、あなたが芋るように、PORTは実際には

    定数ではなく、「匕数なし」のプロトタむプを持぀単なる関数です。

    関数をオヌバヌラむドするか、たたは

    「サブを䜿甚」、たたは盎接シンボルテヌブルから。

    さらに重芁なこずは、定数の目暙の1぀は効率です。 する

    コンパむラヌにずっお人生はより簡単で、割り圓おる必芁がありたせん。

    倉数に䜕か。 ここでは、小さなゲむンの代わりに、perl、

    通蚳者は生産性にわいせ぀な打撃を受けたす。



    型情報はありたせん。





    Perlでは、スカラヌには倀たたは倀ぞの参照を含めるこずができたす。

    残念ながら、Perlはどの型を芋぀けるための挔算子を提䟛しおいたせん

    「倀」にはスカラヌが含たれ、挔算子は型を決定するためだけのものです

    リンク。 これにより、たずえば、

    算術蚈算にふさわしいスカラヌ数

    難しい。 はい、Perlハッカヌはその数字を考えるこずに慣れおいるこずを理解しおいたす

    そしお、文字列は亀換可胜ですが、問題はただ発生し、それはばかげおいたす

    正芏衚珟からヘルプを求めお以䞋を決定したす。



     「数字じゃない」  $ thing =〜/ ^ \ d + $ /; 
    




    もちろん、この衚珟はうたく機胜したせん。なぜなら、数字は

    「+」、「-」、「。」などの他の文字を含む サむンを瀺すために、

    小数郚たたは指数。



    ctype.hの関数でさえ、䜕もしないよりも䟿利です。



    Perlが持っおいるように芋えるので、これはさらに厄介です

    SVにどのような倀の型があるかをかなりよく掚枬したすC-type typedef

    フラグフィヌルドの倀に基づいお、スカラヌの倀を蚘述する、

    必芁に応じお簡単に倉換できたす。



    Autovivification。





    autovivifyハッシュのキヌず倀のペア翻蚳者のメモ方法がわかりたせん

    ぀たり、autovivifyを翻蚳するずいう意味で-「䜜成される

    自動的に、オンザフラむでPerlで。 ぀たり、指定できるこずを意味したす

    タむプ「autovived」の新しいキヌが発生したす。



     myhash =key1 => 'value1'、key2 => 'value2';
    
     $ hash {autovived} = 1;
    




    たた、キヌ名ずそれも封印できるこずを意味したす

    譊告なしに発生したす。 倧きくない

    ハッシュを蟞曞ずしお䜿甚するずきの問題は、キヌが

    倚くの堎合、他の堎所から来たすが、次のようなハッシュを䜿甚するず

    構造たたはオブゞェクト、これは問題に぀ながりたす



     $ self = {
    	名前=> undef、
            幎霢=> undef
    
     ...
    
    サブネヌム{
     	私の$ self = shift;
    
     	 $ self-> {Name} = @_の堎合にシフト;
    
     	 return $ self-> {name};
     }
    




    ハッシュをオブゞェクトずしお䜿甚するずきは、垞に定矩しお初期化したす

    コンストラクタヌ内の各ハッシュ芁玠は、少なくずも「undef」です。

    キヌワヌド「静的」に䜕を䞎えないず、干枉したす

    初期化埌に新しい芁玠がハッシュに远加されたす。



     static my $ self = {
     	名前=> undef、
     	幎霢=> undef
    
     ...
    
     $ self-> {Name} = shift;  臎呜的゚ラヌ
    








    思い浮かぶ他の匱い刺激が含たれたす

    文字列の前のchopに盞圓するものがないため、適甚できたせん

    チェヌンごずの-xファむルのテスト「-e $ filename && -T

    $ filename && -w $ filename "instead of" -e -T -w $ filename "or" -eTw $ filename "、

    binmodeを呌び出すための奇劙な慣習、䞍安定なシグナル、

    localなどの名前の芋圓識障害、および関数sizeofの欠劂。



    この16歳の蚀語は、しばらくの間着実に膚らんでいたす。 倚くの圌

    アスペクトは盎芳的でなく、効果的でなく、単に芋苊しくなりたす。

    実装を倉曎するのが難しく、新しい機胜を远加する

    叀いものを壊すこずなく非垞に困難になりたす。



    Perl 6は、これらの問題の倚くを修正しようずするPerlコミュニティによる詊みです。

    実オブゞェクトのサポヌトが远加され、参照カりンタヌがなくなりたす。

    シギル$、@、はより盎感的になり、倚くの新機胜が远加されたす。

    远加されたす。



    このトップダりンの蚀語の曞き盎しはただ完党ではありたせんが、私は、

    他の倚くの人ず䞀緒に、熱心に圌を埅っおいたす。 この時点たで、私は私が思う

    私は、Perl 5を䜿甚しおほずんどの䜜業を続けたす。



All Articles