2009-11-23 8 views
7

進捗バーを出力したいのですが、Perlで端末の幅を取得するにはどうすればよいですか?Perlで端末の幅を取得するにはどうすればよいですか?

私はコンパイラにアクセスすることができず、既にインストールされている5.8.2 Perlだけなので、コアPerlソリューションが好まれます。

+5

。同じホスト上でコンパイルする必要があるという法律はありません。 –

+0

[皮肉な]通常ははい...しかしここではありません。誰もがJavaとPerlがどんな箱でも開発できることを知っているので、開発環境で開発環境と同じ環境(読み込みアーキテクチャ)を使う必要はありません... –

+1

なぜ皮肉なのですか?私はあなたに深刻な答えを与えています。あなたの開発システムと本番システムは本当に重要ではありません。あなたはどちらかにクロスコンパイルすることができます。あなたは助けを得るためにここにいます。私はあなたに無料の助けをしました。 –

答えて

26

Perlに同梱されているFAQがこの質問に対する答えです。 perldoc -q "screen size"を実行すると、次のように表示されます。

画面サイズはどのように取得できますか?

あなたはCPANからインストールTerm::ReadKeyモジュールを持っている場合は、文字にし、幅と高さをピクセル単位で取得するためにそれを使用することができますが:

use Term::ReadKey; 
($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize(); 

これは生の「IOCTL」よりもポータブルではなく、実例として:

require 'sys/ioctl.ph'; 
die "no TIOCGWINSZ" unless defined &TIOCGWINSZ; 
open(TTY, "+</dev/tty") or die "No tty: $!"; 
unless (ioctl(TTY, &TIOCGWINSZ, $winsize='')) { 
    die sprintf "$0: ioctl TIOCGWINSZ (%08x: $!)\n", &TIOCGWINSZ; 
} 
($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize); 
print "(row,col) = ($row,$col)"; 
print " (xpixel,ypixel) = ($xpixel,$ypixel)" if $xpixel || $ypixel; 
print "\n"; 

だから、あなたは純粋なPerlのソリューションをしたい場合は、最後のものを使用するか、またはあなたが簡単な解決策が必要な場合はCPANからTerm::ReadKeyをインストールすることができますあなたのコードではもっと前向きなセットアップです。

+0

エラーメッセージに含めるように 'h2ph'をどうやって実行しますか:' @INCでsys/ioctl.phを見つけることができません(実行しましたか? h2ph?) ' –

+0

@Steve:' h2ph'を実行しようとするとどうなりますか? – Ether

+0

@Ether: 'h2ph'の' -d'オプションが欠けていました。 'ioctl.pl:ioctl TIOCGWINSZ(40007468:システムコールが無効なパラメータを受け取った)' –

5

Term::Size::Anyあなたが何をしているかのように見えます。

+0

コアの一部ではありませんが、まだ知りたいことがあります –

+1

純粋なPerlのバージョンがあります。インストールにはコンパイラは必要ありません。 – Dan

+0

@ダン:ああ...私は見ています:-) –

6

進捗バーを作成する場合は、詳細を汗ばむことはありません。多くのprogress bar modules on CPANのうちの1つを使用してください。

+0

+1です。 Term :: ProgressBarにもまた悪いTerm :: ReadKey :-( –

4

これは明らかに、プラットフォームに依存しますが、Linux上で箱から出して動作します非常に簡単な解決策はこれです:あなたは常に、コンパイラへのアクセス権を持っている

my $width = `tput cols`; 
+0

これはCygwinでも有効です!Thx! – TrueY

関連する問題