掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ActivePerlの標準入出力の操作 (ID:33447)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>Delphiの方のコードはどうしていますか? 最初に久世さんが示されたコードのままと思います。 コンポーネントはインストールしてフォームに貼り付けました。 コンソールアプリではないので while〜 は使っていません。 DosCommand1のプロパティはInputToOutputはTrueにしましたがFalseでも動作に支障はありませんでした。 というかどのプロパティをいじっても動作に違いは出ますが支障はありませんでした。 Perl側で0x1Aがきたらループを抜けるという処理を足しただけです。 Delphi側。 unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DosCommand; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Edit2: TEdit; Memo1: TMemo; DosCommand1: TDosCommand; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add('perl.exe test.pl'); DosCommand1.CommandLine := 'perl.exe test.pl'; DosCommand1.Execute; end; procedure TForm1.Button2Click(Sender: TObject); begin DosCommand1.SendLine(Edit2.Text, True); end; procedure TForm1.Button3Click(Sender: TObject); begin DosCommand1.SendLine(#$1A, True); end; procedure TForm1.FormShow(Sender: TObject); begin DosCommand1.OutputLines := Memo1.Lines; end; end. ちなみにPerlでは0x1Aを受け取ってもそれをファイルの終わりとみなすことはなく単なるデータとしての扱いにしかならないようです。 なのでループを抜ける条件は0x1Aに限らず、例えば0x0でも0x1でもあるいは"END"という文字列であっても、Delphi側とPerl側で申し合わせていれば何でもOKという感じです。 TOBYさんが2chで得た情報のとおりです。 またコンソールでCtrl+ZとしてもPerlに0x1Aは送られないようです。 #!/usr/local/bin/perl $| = 1; print "Start\n"; while(<>){ if (index($_, "\x1A") > -1) { print "--- EOF ---\n"; last; } print $_; } print "End\n"; exit; このようにした場合Button3を押して#$1Aを送った場合やテキストファイルの途中をバイナリエディタで0x1Aに書き換えたものをリダイレクトさせた場合"--- EOF ---"は出力されますがコンソールでCtrl+Zとした場合は出力されません。 素人考えなんですがコンソールからCtrl+Zとした場合0x1Aを送ってファイルの終わりとしているのではなく別のやり方でファイルの終わりとしているのではないかなと思いました。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.