Perl - ファイル読み込み キーボード入力 端末 TTY
特に高度なことはやっていない作業効率化用のperlのサンプルです。
perlはJAVAとかと同じくC系の構文ですけど、lastだったりelsifだったり、配列とハッシュの記号がわからなくなったり、忘れるんですよね。
みなさんも仕事を半分の時間で終わらせて、残りの時間は呆けながら休みの余暇について考えて下さいね!
サンプルは随時更新:2017/07/27
◆ファイル読み込みと出力
perlと言えば正規表現を使ったテキスト編集が主に使う理由ですよね。下記サンプルは引数チェックとファイル読み込みのみです。
◆キーボードからの文字読み込み・端末(TTY)関連
perlでやるような事とは言えないですが、キーボードからの入力に対してあれこれするサンプルです。おそらくUnix系OSならどんなものでも動くと思いますが、端末サイズを取得する部分はうまく動くかどうかわかりません。
ちなみにこのサンプルはどんなものかというと、ハゲ『彡⌒ミ』をNethack(Rogue)風(まぁ、viですね^^;)に動かします。(仕事中に何作ってんだ。あ、もちろんやる事やった余りの時間と待機時間でですよ。作業効率化にもなりますし。)
perlはJAVAとかと同じくC系の構文ですけど、lastだったりelsifだったり、配列とハッシュの記号がわからなくなったり、忘れるんですよね。
みなさんも仕事を半分の時間で終わらせて、残りの時間は呆けながら休みの余暇について考えて下さいね!
サンプルは随時更新:2017/07/27
◆ファイル読み込みと出力
perlと言えば正規表現を使ったテキスト編集が主に使う理由ですよね。下記サンプルは引数チェックとファイル読み込みのみです。
#!/usr/bin/perl
use POSIX;
use feature "switch";
#引数・オプション格納変数
$Hogehage_File = "";
$Opt_A = "";
#内部変数
$tmpstr = "";
@Array_A = ();
%Hash_A = ();
sub check_argument
{
my(@argv) = @_;
while( $#argv >= 0 ) {
if( $argv[0] =~ /^-a/ ) {
$Opt_A = $argv[1];
shift(@argv);
} else {
last;
}
shift(@argv);
}
$Hogehage_File = $argv[0];
if( ! -f $Hogehage_File ) {
print(STDERR "File:$Hogehage_file is not a file or not found.\n");
&print_usage;
exit(1);
}
return(0);
}
sub print_usage
{
print(STDERR "Usage: aiueo.pl [-a AAA] ほげはげファイル\n");
return(0);
}
### MAIN
&check_argument(@ARGV);
printf("Opt_A:%s\n", $Opt_A);
printf("Hogehage_File:%s\n", $Hogehage_File);
open(FILE, "$Hogehage_File");
while(<FILE>) {
if( /^$/ ) {
next;
}
chomp();
@Array_A = split(/\t/);
printf("[%s][%s][%s]\n", $Array_A[0], $Array_A[1], $Array_A[2]);
}
close(FILE);
exit(0);
◆キーボードからの文字読み込み・端末(TTY)関連
perlでやるような事とは言えないですが、キーボードからの入力に対してあれこれするサンプルです。おそらくUnix系OSならどんなものでも動くと思いますが、端末サイズを取得する部分はうまく動くかどうかわかりません。
ちなみにこのサンプルはどんなものかというと、ハゲ『彡⌒ミ』をNethack(Rogue)風(まぁ、viですね^^;)に動かします。(仕事中に何作ってんだ。あ、もちろんやる事やった余りの時間と待機時間でですよ。作業効率化にもなりますし。)
#!/usr/bin/perl
use Term::Cap
require 'sys/ioctl.ph';
use feature "switch";
$MYC = "彡⌒ミ";
$MYW = 6;
$MYX = 0;
$MYY = 0;
$screen_lines = 0;
$screen_cols = 0;
$trash = "";
$key = "";
my $termios = new POSIX::Termios;
$termios->getattr;
my $ospeed = $termios->getospeed;
$terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed};
$terminal->Trequire(qw/ce ku kd/);
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;
}
($screen_lines, $screen_cols, $trash, $trash) = unpack('S4', $winsize);
system "stty -echo cbreak </dev/tty >/dev/tty 2>&1";
print $terminal->Tputs('cl');
print $terminal->Tputs('vi');
print $terminal->Tgoto('cm', $MYX, $MYY);
print $terminal->Tputs('sc');
print $terminal->Tpad($MYC, 1);
print $terminal->Tputs('cl');
while( $key ne "q" ) {
$key = getc(TTY);
given( $key ) {
when( /^h$/ )
{
if( $MYX > 0 ) {
$MYX--;
}
}
when( /^j$/ )
{
if( $MYY < $screen_lines - 1 ) {
$MYY++;
}
}
when( /^k$/ )
{
if( $MYY > 0 ) {
$MYY--;
}
}
when( /^l$/ )
{
if( $MYX + $MYW - 1 < $screen_cols - 1 ) {
$MYX++;
}
}
default
{
continue;
}
}
print $terminal->Tputs('im');
for( $i = 1 ; $i <= $MYW ; $i++ ) {
print $terminal->Tputs('dc');
print $terminal->Tpad(" ", 1);
}
print $terminal->Tputs('ei');
print $terminal->Tgoto('cm', $MYX, $MYY);
print $terminal->Tputs('sc');
print $terminal->Tpad($MYC, 1);
print $terminal->Tputs('cl');
}
print "\n";
print $terminal->Tputs('ve');
system "stty echo -cbreak </dev/tty >/dev/tty 2>&1";
close(TTY);
exit(0);