問題タブ [tie]
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 の print に接続できますか?
これがシナリオです。大量のレガシー スクリプトがあり、すべてが共通のライブラリを使用しています。上記のスクリプトは、診断出力に「print」ステートメントを使用します。スクリプトの変更は許可されていません。スクリプトは広範囲に及ぶものであり、承認を得ており、監督と管理の実りある谷から長い間離れています。
ここで、新たな必要性が生じました。ロギングをライブラリに追加する必要があります。これは、標準ライブラリのユーザーがスクリプトを変更する必要なく、自動的かつ透過的に行う必要があります。共通ライブラリ メソッドには、ロギング呼び出しを追加するだけです。それは簡単な部分です。難しいのは、これらのスクリプトからの診断出力が常に「print」ステートメントを使用して表示されていたことです。この診断出力は保存する必要がありますが、同様に重要なのは処理することです。
この処理の例として、ライブラリは、「警告」、「エラー」、「通知」、または「注意」という単語を含む出力行のみを記録する必要があります。以下の非常に些細で不自然なコード例 (tm) は、上記の出力の一部を記録します。
(「実際にログに記録すべきもの」、「print を診断に使用すべきではない」、「perl はひどい」、「この例には xy と z に欠陥がある」などの問題は避けたいと思います...これは簡潔さと明確さのために大幅に簡略化されています。)
基本的な問題は、print に渡されたデータをキャプチャして処理することです (または、これらの推論に沿った任意の perl ビルトイン)。出来ますか?きれいにする方法はありますか?それを可能にするフックを備えたログモジュールはありますか? それとも、ペストのように避けるべきものであり、印刷出力をキャプチャして処理することをあきらめるべきですか?
追加: これは、クロスプラットフォームで実行する必要があります (Windows と *nix の両方)。スクリプトを実行するプロセスは、スクリプトからの出力と同様に、同じままにする必要があります。
追加の追加:codelogicの回答のコメントで行われた興味深い提案:
http://perldoc.perl.org/IO/Handle.htmlをサブクラス化し、ロギング作業を行う独自のファイル ハンドルを作成できます。– カミル・キシエル
これでうまくいくかもしれませんが、2 つの注意点があります。
1) この機能を共通ライブラリを使用する人にエクスポートする方法が必要です。STDOUT とおそらく STDERR にも自動的に適用する必要があります。
2) IO::Handle のドキュメントには、サブクラス化できないと書かれており、これまでの私の試みは無駄でした。サブクラス化 IO::Handle を機能させるために特別に必要なものはありますか? 標準の 'use base 'IO::Handle' を使用してから、new/print メソッドをオーバーライドしても何も起こらないようです。
最終編集: IO::Handle は行き止まりのように見えますが、Tie::Handle はそれを行う可能性があります。すべての提案に感謝します。彼らはすべて本当に良いです。Tie::Handle ルートを試してみます。問題が発生した場合は、戻ってきます。
補遺: これを少し使ってみたところ、何もトリッキーなことをしなければ Tie::Handle が機能することがわかりました。結合された STDOUT または STDERR で IO::Handle の機能のいずれかを使用する場合、基本的にそれらを確実に動作させるためのクラップシュートです。扱う。ハンドルを結ぶ前に自動フラッシュを有効にすると、機能します。それがうまくいく場合は、 Tie::Handle ルートが受け入れられるかもしれません。
perl - 結合された変数でメソッドを呼び出すにはどうすればよいですか?
私はネクタイについて学び始めたばかりです。次のことをしたい Link という名前のクラスがあります。
- 取得した場合は、リンクのアドレスを返します
- 保存されている場合は、新しいアドレスを保存します
- その上でメソッドを呼び出すことができます
これまでのところ、私のコードは次のとおりです。
機能を確認するために使用しているコードは次のとおりです。
実行すると、スクリプトは次のエラーで終了し ます。
そのメッセージを正しく理解すれば$var->print_method
、メソッドprint_method
が呼び出される文字列に解決されます。どのようにネクタイの恩恵を受けることができますか?また、変数をオブジェクトとして使用することもできますか?
編集:少し実験した後、フェッチで $self を返すと、メソッドを呼び出すことができますが、フェッチはアドレスを返さないことがわかりました。
編集 2: perl 僧侶が解決策を提供してくれました:結ばれました。tie はオブジェクト VARIABLE への参照を返します。
自分のメソッドと結びつけることで、やりたいことはすべて成し遂げることができます。
perl - Perlでのスコープ変更に関するコードの延期
現在のスコープを離れるときに実行されるコードをスケジュールできると便利なことがよくあります。TCLでの私の前の人生で、友人がdeferと呼ばれる関数を作成しました。
次のようなコードが有効になりました。setfp[open"x"] defer( "close $ fp");
これは、現在のスコープが終了したときに呼び出されました。主な利点は、スコープを離れる方法や場所に関係なく、常に呼び出されることです。
だから私はPerlで似たようなものを実装しましたが、もっと簡単な方法があるようです。コメント批評を歓迎します。
私がPerlでそれをした方法:
- 実行するサブの配列を保持するグローバルなタイ変数を作成します。
- 終了時にfnが呼び出されるようにスケジュールするときはいつでも、localを使用して配列を変更します。現在のスコープを離れると、グローバルが関連付けられているため、Perlはグローバルを前の値に変更します。この値の変更がいつ発生するかを知っており、リスト内のサブを呼び出すことができます。
実際のコードは以下のとおりです。
これを行うためのより良い方法はありますか?これは一般的に必要な機能のようです。
perl - Win32::TieRegistry がサブキーを一覧表示できないのはなぜですか?
Cygwin Perl v5.8.8 および Win32::TieRegistry 0.26 を使用。
HKEY_CURRENT_USER に関連付けられたハッシュ オブジェクトを取得できます。
そして、これはサブキーに対して機能します:
そして、キーの情報を出力できます:
ただし、ドキュメントは、ハッシュとして扱うだけでサブキーをリストできることを示唆しています。
しかし、配列は空です。それは壊れていますか、それとも何か間違っていますか?サブキーを一覧表示する別の方法はありますか?
これも機能しません:
perl - Perl の = をオーバーロードできますか? (そしてネクタイ使用中の問題)
私はネクタイを使用することを選択し、これを見つけます:
最後の「$ [0]->{$ [1]}->{'='};」を削除すると、正しく動作しません。なんで ?
戻り値が必要であることはわかっています。しかし、「$ [0]->{$ [1]};」$ [0]->{$ [1]}->{'='} がすべてではありません。
古い投稿:
INI ファイルを解析するためのパッケージを Perl で作成しています。に基づいたものですConfig::Tiny
。
セクションとキーの順序を保持したいので、余分な配列を使用して順序を格納します。
しかし、" " を使用するときは、"newsection" と "this" を配列にプッシュできるように、$Config->{newsection} = { this => 'that' }; # Add a section
' ' をオーバーロードする必要があります。=
$Config->{newsection} = { this => 'that' };
これにより、他のパーツに影響を与えずに " " を動作させることは可能ですか?
コードの一部は次のとおりです。
perl - Tie::File はファイルを遅延ロードしていますか?
非常に大きなサイズのファイルを処理できると期待される単純なテキスト ビューアーを作成する予定です。私はTie::File
これに使用することを考えていて、行を改ページします。これは行を遅延してロードしていますか、それともすべてを一度にロードしていますか?
perl - アクセス時に縮小する結ばれた配列の末尾を越えて perl が読み取らないようにするにはどうすればよいですか?
への各呼び出しの前に、 Perl にFETCHSIZE
tie された配列を強制的に呼び出す方法はありますFETCH
か? 結合された配列は最大サイズを認識していますが、以前のFETCH
呼び出しの結果によっては、このサイズから縮小する可能性があります。以下は、リストを遅延評価で偶数要素のみにフィルター処理する不自然な例です。
簡潔にするために、一連のエラー チェック コードを省略しました (0 以外のインデックスから始まるアクセスの処理方法など)。
編集: 上記の 2 つの print ステートメントではなく、次の 2 行のいずれかを使用すると、最初の行は正常に動作し、2 番目の行は警告をスローします。
アップデート:
可変サイズの結合された配列を実装する実際のモジュールはList::Genと呼ばれ、CPAN 上にあります。関数は のfilter
ようgrep
に動作しますが、List::Gen
の遅延ジェネレーターで動作します。の実装をfilter
改善できるアイデアはありますか?
(test
関数は似ていますがundef
、失敗したスロットに戻り、配列のサイズを一定に保ちますが、もちろん使用方法のセマンティクスは とは異なりますgrep
)
android - ビットマップを別のビットマップにアタッチする
私はクラスの建物を持っています。これには、ドローアブルを参照する _bitmap オブジェクトが含まれています。キャンバスが myBuilding.getBitmap() を呼び出す外部ビューに描画できます。
建物にいくつかの窓を描画したいのですが、myBuilding の x と y を変換すると、窓が一緒に移動するように、それらを建物に「結び付ける」必要があります。
myBuilding.getBitmap() を呼び出したときに、結果の建物をウィンドウで取得するために、メイン ビットマップ (建物) にビットマップ (ウィンドウ) をアタッチする方法はありますか?
ありがとうございました。
mysql - MySQL テーブルのランクを更新する
テーブルプレーヤーの次のテーブル構造があります
playerID とポイントが有効な値を持っていると仮定すると、1 回のクエリでポイント数に基づいてすべてのプレイヤーのランクを更新できますか? 2 人が同じポイント数を持っている場合、その順位は同点でなければなりません。
アップデート:
ネイティブクエリとして提案されたクエリを使用して休止状態を使用しています。Hibernate は変数、特に ':' の使用を好みません。誰かが回避策を知っていますか? この場合、変数を使用しないか、HQL を使用して hibernate の制限を回避しますか?
perl - 怠惰に計算されたスカラーをperlで返す
タイスカラーを使用して、コードベースにいくつかの機能を追加しようとしています。
スカラーを返すように指定された関数があります。これらのスカラーを返す前に結合することでシステムにいくつかの機能を追加できると思いましたが、戻りの直前にFETCHメソッドが呼び出され、結合されていないスカラーが返されるようです。
これを回避する方法はありますか?
可能な限り、サブルーチンのインターフェース(スカラーを返す)をそのまま維持したいと思います。
必要な出力:
参照を返し、アクセスごとに逆参照することで目的の出力を取得できますが、それによって確立されたインターフェイスが台無しになり、ユーザーが混乱しやすくなります。
-バック