問題タブ [perl-io]
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 - - ソースへのハンドルを取得できますか?
main には、ハンドルのように見える'_<-'
他のものと同じ方法で (引用符なしで)呼び出されるシンボルがあるように見えます:たとえば。'_</usr/perl/lib/Carp.pm'
何か使い方はありますか?
または、入力ソースを読みたい場合、ソース フィルターを使用する必要がありますか?
mob への返信: Debug がどこでオンになるのかわかりません。ベース テーブルをダンプすると、%INC のダンプが次のように表示されます。
perl - PerlIO* を返すこの XS コードはなぜリーキーなのですか?
私は、書き込み可能なストリーム インターフェイスとして、ライブラリの一部を Perl コードに公開する XS コードを書き込もうとしています。以下の
get_stream
関数は、PerlIO オブジェクトを準備して返すコンストラクタであると想定されています。Write
メソッドとメソッドだけが必要だと考えた
Close
ので、他の関数スロットはすべて空白のままにしました。
このように提供されたインターフェースを使用すると...
...mylib_write
関数が呼び出されるので、これまでのところ完全に失敗していません。$fh
(debug printf ステートメントを挿入することでこれを確認しました。) しかし、PerlIO オブジェクトがスコープ外になったときに閉じられるようにしたいと思います
open
。しかし、現時点では、このmylib_close
関数はインタープリターのシャットダウン中にのみ呼び出されます。
直接呼び出すとclose
正常に機能しますが、に設定$fh
するとundef
機能しません。
更新:池上のアドバイスに従って、 と を使用Devel::Peek::Dump
しsv_dump
たところ、返されたハンドルget_stream
関数が を指す「RV」であることがわかりましたSV = PVGV(...)
。グロブ ( PVGV
) の参照カウンターが 3 に設定されていますが、これは正しくないようです。
追加した
これにより症状が治り
ます。ブロックの最後で範囲外になるclose
と、関数が呼び出されます。$fh
しかし、私はまだ根本的な問題をよく理解していません。
OUTPUT
これは、セクション用に生成された C コードです。
GV の参照カウントはどのようにして 3 になるのですか?
perl - IO::Unicode文字を取得および取得解除するためのハンドル
UnicodeとIO::Handleで問題が発生したと思います。私が何か間違ったことをしている可能性が非常に高いです。IO :: Handleから個々のUnicode文字(バイトではなく)を取得および取得解除したい。しかし、私は驚くべきエラーを受け取っています。
ungetc()行からのエラーメッセージは、「unicode.plの21行目でUTF-8文字の形式が正しくありません(文字列の予期しない終わり)です。」\x{00c5}
「unicode.plの21行目でutf8にマップされません。」しかし、それはキャラクターの正しいヘクスであり、キャラクターにマップする必要があります。
16進エディターを使用して、A-RINGのバイトがUTF-8に対して正しいことを確認しました。
これは、2バイトの文字では問題になるようです。
最後のsayは'\xC5'(文字通り4文字:バックスラッシュ、x、C、5)を出力します。
そして、スカラー変数の代わりにファイルから読み取ることでこれをテストしました。結果は同じです。
これは、darwin-2level用に構築されたperl 5、バージョン16、subversion 2(v5.16.2)です。
そして、スクリプトはUTF-8に保存されます。それが私が最初にチェックしたことでした。
perl - PerlのIO::Fileとopenqw(:utf8)の使用
IO :: File-> open()は、次のプログラムでのopen()の使用を尊重していないようです。これは私には奇妙で、ドキュメントに反しているようです。または多分私はそれを間違っています。IO::Fileを使用しないようにコードを書き直すのは難しいことではありません。
出力は次のようになると思います
しかし、このエラーが発生します:「おっと:./run.plの33行目に印刷中の不正な形式のUTF-8文字(文字列の予期しない終わり)」。
それは私にはまったく正しくないようです。
perl - 古いライブラリを Perl XS と PerlIO で動作させる
私はむしろ XS の初心者であり、15 年以上前の基になる C ライブラリを大量に使用する既存の XS モジュールを変更することを検討しています (実際、モジュールは基本的にこのライブラリに接着されています)。問題は、次のような PerlIO 文字列トリックを使用できるようにしたいということです。
$fh
次に、ライブラリが予期している XS グルーに渡しFILE
ます。問題は、XS には次のようなものがあることです。
そして、私はそれが必要であると仮定します:
それ以上のことが必要なので、これはもちろん機能しません。_parse
ライブラリのコードを見ると、次のようになります。
FILE
再び型で。今私が始めなければならない基本的な質問は - これはライブラリを変更しなくても可能ですか?つまり、XS を変更するだけで、文字列 PerlIO の動作から疑似ファイルハンドルを取得できますか?
perl - IO::File から例外を取得していますか?
IO::File、IO::Socket::INET モジュールには、perl の組み込み IO 関数を直接使用するよりもいくつかの利点があります。たとえば、ハンドルをフラッシュするための明示的な構文があります。
ただし、組み込みの IO 関数よりもいくつかの欠点があるようです。たとえば、autodie モジュールと組み合わせて失敗時に例外を発生させることはできないため、組み込み関数を使用した場合よりも、失敗を処理するために全体的に多くのボイラープレート コードを作成する必要があることに気付きました。
2 つを結合する方法、または結合された機能を持つ他のモジュールを結合する方法はありますか? File::Slurp などの一部の目的が限定された IO モジュールでは、より柔軟なエラー処理が可能であることに気付きました。
私はモジュール コードを書いていますが、理想的には、ソリューションは perl 5.10.0 までずっと機能するはずです。
regex - perlのフォルダとサブフォルダからすべてのファイルをコピーしますか?
すべてのフォルダーとサブフォルダーからテキスト ファイルをコピーし、別の場所に保存したいと考えています。コードを書いているのですが、うまくいきません。サブフォルダを認識できません。テキストを読み取りますが、それがファイルまたはフォルダーであることを認識しません。
コード
perl - FTP + 解凍 + readline
大規模な (3 GB 以上、gzipで圧縮された) FTP ダウンロードからいくつかのデータを抽出し、これをオンザフライで実行して、ダンプを回避し、ディスクに完全にダウンロードしたいと考えています。
目的のデータを抽出するには、圧縮されていないストリームを行ごとに調べる必要があります。
だから私は道徳的に同等のものを探しています
ftp://ftp.foobar.com/path/to/blotto.txt.gz
FWIW: (with で)への読み取りハンドルを開く方法は知っていますが、この開いているハンドルにレイヤーを追加する方法Net::FTP::repr
はまだわかりません。:gzip
上記の質問に対する答えを見つけるのに必要以上に時間がかかったので、次にそれを必要とする人のために投稿しようと思いました。
perl - 外部プロセスの監視: STDOUT がパターンに一致すると終了します
システム コマンドを実行して、特定のパターンに一致する出力を待っています。
これは表示されline 1
てループを離れますが、外部コマンドが完了するまで終了しません。
必要な出力に一致した直後にスクリプトを終了させるにはどうすればよいですか?
utf-8 - Perl でスカラーおよび I/O レイヤーで open() を使用する場合のエンコーディングの非決定性
ここ数時間、Perl プログラムのバグと戦っています。私が何か間違っているのか、インタープリターが間違っているのかはわかりませんが、コードは決定論的である必要がありますが、IMO は非決定論的です。また、古い Debian Lenny (Perl 5.10.0) と Debian Wheezy (Perl 5.14.2) にアップグレードしたばかりのサーバーでも同じ動作を示します。それは、次の Perl コードに要約されます。
Perl 5 インタープリターを厳密モードで初期化し、警告を有効にして、文字列 (バイト文字列ではなく) と名前付きの標準ストリームを UTF8 でエンコードします (UTF-8 の内部概念ですが、完全な UTF-8 に変更しても違いはありません)。 )。次に、「メモリ内ファイル」(スカラー変数) へのファイル ハンドルを開き、2 バイトの UTF-8 文字を 1 つ出力し、閉じたときに変数を調べます。
スカラー変数の UTF8 ビットが常にオフになります。ただし、バイト文字列 ( を介して文字列に変換されるutf8::decode()
) が含まれることもあれば、UTF8 ビットをオンにする必要がある文字列 ( ) が含まれることもありますEncode::_utf8_on()
。
コードを繰り返し (Bash 経由で 1000 回) 実行するUndecoded
とDecoded
、ほぼ同じ頻度で出力されます。「ファイル」に書き込む文字列を変更すると、たとえば最後に改行を追加すると、Undecoded
消えます。成功し、ループ内の同じ元の文字列に対して試行するutf8::decode
と、インタープリターの同じインスタンスで成功し続けます。ただし、失敗すると、失敗し続けます。
観察された行動の説明は何ですか? 文字列と一緒にスカラー変数へのファイル ハンドルを使用するにはどうすればよいですか?
バッシュ遊び場:
参考までに、確実に確認するために、ペダンティックなエラー処理を備えたバージョンも作成しましたが、結果は同じでした。