問題タブ [perl5.10]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - Perl 5.10 の新機能を学習するための優れたリソースはどこにありますか?
最近まで、Perl 5.10 に重要な新機能があることを知りませんでした。それらについて学ぶための優れたリソースを誰か提供してもらえないかと考えていました。それらを Google で検索したところ、いくつかのスライドと簡単な概要しか見つかりませんでした。いくつかの機能 (少なくとも私にとっては) は、もっと説明があればいいのにと思います。
リンクをいただければ幸いです。
-fREW
perl - Perl 5.10 はプロトタイプを台無しにしましたか?
この種のやりたいことが 5.8 で機能していたことを知っています。私は何か間違ったことをしていますか?Perl 5.10 でそこに戻る方法はありますか?
モジュールは次のとおりです。
そして、ここにスクリプトがあります:
私がしなければならないのは、最後の行の次の行のコメントを外すだけで、次のようになります。
ローカルサブについては文句を言いませんが、インポートされたものについては気を失います。その上、「mod_table」をインポートしたことを示すテストにもかかわらず、strict はそれがベアワードであると混乱しています!
それだけでなく、プロトタイプが同じであることがテストでわかっているにもかかわらず、インポートされたサブルーチンにハッシュリファレンスとして渡すことができません。%table
最後の行に示されている従来の構文を使用しても、そうではありません。
私が得るものは次のとおりです。
winapi - 一貫して再現可能なmod_perl2/$SIG{__DIE__}バグのトラブルシューティングに役立ちます
これは、Apache 2.2ではmod_perl2、win32ではActiveStatePerl5.10です。
$SIG{__DIE__}
DBIのRaiseErrorフラグをオーバーライドしてオンにします。これは、データベース呼び出しが失敗したときに、ドキュメントのAFAICTがオーバーライドを呼び出す必要があります。ある場合を除いて、ほとんどの場合そうですが、その理由がわかりません。
私のスクリプトにはour $page
変数があり、mod_perl2であるため、次のようにオーバーライドからこれを取得できます。
これは正常に機能します。さて、その中$page
に、DBから戻ってきたときに何か別のことをしたい「許可された」エラー値の配列参照があります。$r->print
DBがこれらのエラーの1つをスローした場合、それをJSONのユーザーフレンドリーなメッセージに変換し、実行を停止します(動作A)。何らかの理由で、代わりにスクリプトに制御を戻します(動作B)。
これが私のスクリプトの主要部分です:
最初の行をコメントアウトすると、通常のエラー(予期しない処理)(動作C)が発生します。これは、発生しているエラーを許可されたエラーのリストに追加していないためです。本当に奇妙なのは、その最初の行を切り取って$SIG{__DIE__}
オーバーライドに貼り付けると、それが機能することです。JSON応答がオーバーライドされ、出力され、{test}
割り当てられる前に実行が停止します(動作A)。見知らぬ人でも、{allowed}
任意の数値セットに設定できます。特に「22007」が含まれている限り、動作Bが発生します。含まれていない場合は、動作Cが発生します。さらに奇妙なことに、実際にオーバーライドを埋めることができます。何でも(警告、への呼び出しCORE::die
、など-コンパイルする限り)そして私はまだ振る舞いBを取得します-オーバーライドにはそれを可能にするコードが含まれていなくても!warn
また、とへの呼び出しの期待される結果が得られずCORE::die
、ログが沈黙しているだけなので、オーバーライドを介して実行パスを手動で追跡することさえできません。
スクリプトを保存するたびにApache2.2を再起動しました。オーバーライドをスクリプト自体と同じスクリプトファイルに移動し、通常のモジュールから外し、モジュールファイル全体をコメントアウトして、再起動しました。
その最初の行を削除するか、「22007」を削除するwarn
とdie
、好きなものをすべて手動でデバッグでき、すべてが期待どおりに機能します。サーバーがリセットされても何も出力されない「22007」についてはどうでしょうか。翻訳マップを除いて、プロジェクト全体のどこにも「22007」への参照はありません。そのファイルから完全に削除して再起動すると、結果に違いはありません。それはあたかもその日の早い段階から私のオーバーライドをキャッシュしたかのように振る舞い、決して忘れることはありません。ランダムなクエリ文字列を追加でき、結果も変わらないため、ブラウザのキャッシュの問題でもありません。
これは私が今までに経験した中で最も奇妙で最も苛立たしいmod_perl2の経験であり、私はアイデアを使い果たしました。誰かヒントはありますか?私が考えることができる唯一のことは、それがキャッシングの問題であるということです、それでも私はサービスを数え切れないほど再起動しました。
一日の終わりだったので、サーバーコンピュータを完全に再起動してみようと思いましたが、それでも何も変わりませんでした。サーバーを再起動する前に、{state}
これに割り当てられている唯一の行を変更しました。
それでも、その後の出力は{test}
「22007」でした。これは、私がそのままにしておいた場合にのみあるはず= $errno
です。
たとえば、キャッシングを実行するリバースプロキシであったとしても、要求が異なる可能性があるため、この状況は私には意味がありません。サーバーを完全に再起動した後も、コードに存在しない値を割り当てるにはどうすればよいでしょうか。つまり、$SIG{__DIE__}
完全に再起動した後、ファイルに存在しなくなった古いオーバーライドをどのように使用できるでしょうか。
更新: 許可されたエラーを「42601」に変更し、db呼び出しをに変更しようとしました'select'
。これにより、そのエラーコードが生成されますが、変換マップには追加されませんでした。それでも動作Bが得られ、「42601」に設定{state}
されているため、「22007」に固有のものではありません。に入れられたエラーコードは{allowed}
、そのエラーが実際に発生した場合、古いバージョンのオーバーライドを実行しています。にないエラーが発生し{allowed}
、現在のバージョンが実行されます。{allowed}
しかし、オーバーライドに到達する前に、現在のエラーがにあるかどうか、またはそれが何かを意味するかどうかをどのように知るのでしょうか?{allowed}
(オーバーライドは、現在のエラーに対してgrepされる唯一の場所であるためです。)
perl - Perl 5.8.xまたは5.10.xをインストールすると、5.6.xで開発された場合、コードの実行方法に大きな影響がありますか?
Perl 5.6.1でコードを開発し、Perl 5.8.xまたは5.10.xでコードを実行することによる影響(ある場合)は何ですか?
私はこれらのモジュールを使用しています:
(Windowsの場合)
perl - Perlで値を初期化せずに定義することはできますか?
win32でActiveStatePerl5.10.1を実行します。
このコードはどうですか?
...で死ぬが1
、同じ行を変更してこれを言う:
...で死ぬUse of uninitialized value in die
?
defined
まだどうuninitialized
ですか?初期化されていないということは未定義を意味すると思いました。
perl - Perlファイルglob()がスカラーコンテキストのループの外で機能しないのはなぜですか?
ファイルグロブに関するPerlのドキュメントによると、<*>演算子またはglob()関数は、スカラーコンテキストで使用される場合、指定されたパターンに一致するファイルのリストを反復処理し、呼び出されるたびに次のファイル名を返す必要があります。これ以上ファイルがない場合はundef。
ただし、反復プロセスはループ内からのみ機能するようです。ループに入っていない場合は、すべての値が読み取られる直前に最初からやり直しているようです。
Perlドキュメントから:
スカラーコンテキストでは、globはそのようなファイル名展開を繰り返し、リストが使い果たされるとundefを返します。
http://perldoc.perl.org/functions/glob.html
ただし、スカラーコンテキストでは、演算子は呼び出されるたびに次の値を返すか、リストがなくなるとundefを返します。
http://perldoc.perl.org/perlop.html#I/O-Operators
コード例:
3つのファイル...file1.txt、file2.txt、およびfile3.txtがあるディレクトリでは、上記のコードは次のように出力されます。
注:実際のperlスクリプトは、テストディレクトリの外にある必要があります。そうでない場合は、スクリプトのファイル名も出力に表示されます。
私はここで何か間違ったことをしていますか、それともこれがどのように機能するはずですか?
perl - 5.10+ で書かれた Perl コードが 5.8 で動作することを確認できますか?
"say" など、Perl 5.10 および 5.12 の新機能の一部は機能として定義されており、"feature" プラグマを使用して明示的に有効または無効にすることができます。ただし、正規表現の名前付きキャプチャ グループなど、その他の追加は暗黙的です。
5.10 以降のインタープリターを使用して Perl を作成し、5.8 でも実行したい場合、5.8 にないものを使用することについて Perl に文句を言わせることはできますか? 明らかに、コードを実行する予定のすべてのメジャー バージョンでコードをテストすることは良い習慣ですが、それでも Perl が自動的に警告してくれるとよいでしょう。
perl - Perl5.10+の字句$_の良い点、悪い点、醜い点
Perl 5.10以降、$_
明示的にmy $_;
またはgiven / when
構成内で、コンテキスト変数を字句的にスコープすることが可能になりました。
誰かが語彙の良い使い方を見つけました$_
か?それはどんな構成もより単純/より安全/より速くしますか?
それがより複雑になる状況はどうですか?字句$_
はコードにバグを導入しましたか?(書き込み先の制御構造体$_
は、スコープ内にある場合は字句バージョンを使用するため、サブルーチン呼び出しが含まれている場合(動的スコープが失われるため)、コードの動作が変わる可能性があります)
$_
最後に、レキシカルとして、グローバルとして、またはまったく問題にならない場合を明確にするリストを作成したいと思います。
注意:perl5-5.24
これらの実験的機能の時点では、perlの一部ではなくなりました。
perl - O=Deparse はどのように機能し、Perl には定数配列があり、折りたたまれていますか?
Perl の最適化のすべてを示しているのだろうか、-MO=Deparse
なぜこれが Perl 5.10 で折りたたまれていないのだろうか?
IRC の何人かはO=Deparse
、それがすべてを示しているわけではないかもしれないと考えていましたが、一定の折り畳みを示していることは確かです。
定数サブを明示的に記述しても同じ結果になります。予測可能ではありますが、 のドキュメントでは定数配列ではなく定数リストconstant.pm
を作成していることも興味深い点です。これはスカラー定数のように折りたたまれていないだけでなく、呼び出しごとに新しい配列を作成するオーバーヘッドが必要になると思います。
私が到達できる唯一の結論は-MO=Deparse
、すべての折り畳みを示すことであり、定数配列はPerlで最適化されていないだけですか? そうですか?技術的な理由はありますか?
perl - MacでPerlのファイルをどのようにフラッシュしますか?
私はperl, v5.10.0 built for darwin-thread-multi-2level
リモートiMacを持っています。そして、いくつかのデータをファイルに出力し、出力の各行の後にフラッシュするいくつかのperlスクリプトを実行したいと思います。
- $ file_handle-> flush();
- 自動フラッシュ$file_handle;
この2つのバージョンをuse IO::Handle;
ファイルの先頭で試しましたが、得られる結果はですCan't locate object method "autoflush" via package "FileHandle"
。