或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。おバカなことが大好きです。

MS-DOS/Perlでcatコマンドを実装する

Python使いの俺ですが、他流試合に燃えております。

Perlにめっちゃ対抗意識燃やしています。 - 蛇使いのブログもなかなかPV多いのでお暇があれば読んでいただけると喜びます。

さて、Linuxのcatコマンドが便利だけど、MS-DOSにはそれ相当の機能が無いから実装してみようとしたのだが出来ない・・・。

サンプルコード

for(@ARGV){
        open(IN, "< ", $_);
        read (IN, $buf, (-s  $_));
        print $buf,"\n";
        close IN;
}

こんな感じ。あからさまに不細工だけど・・・。

サンプルデータ

$more test.txt
aaa
bbb
ccc

$more test2.txt
ddd
fff
ggg

動作確認結果

引数ベタ打ち
$perl cat.pl test.txt test2.txt
aaa
bbb
ccc
ddd
fff
ggg
引数をワイルドカード
$perl cat.pl *.txt

バグってますなぁ。出力結果からすると、ファイル名が取れていないっぽい。

$more *.txt
aaa
bbb
ccc
ddd
fff
ggg

これは上手く行くんだけどなぁ・・・。

誰かわかる人がいたら教えて下さい~

下手すると、車輪の再発明をやっていそうな気がしないでもない・・・。

追記2013/06/25

やはり、MS-DOSはワイルドカードの展開はやってくれないようだ。Linuxだとシェルがやってくれるのにね・・・。なので、アプリケーション側でやってやる必要があるみたい。

で、以下のように書くとよい。

サンプルコード

@files = map { glob( $_ ) } @ARGV;
for(@files){
	open(IN, "< ", $_);
	read (IN, $buf, (-s  $_));
	print $buf,"\n";
	close IN;
}

ポイントは、map使ってるところですかね。どうゆう仕組みで展開しているのか、非Perl使いにはわからない・・・。内部動作難しいっすわ。

動作確認結果

$perl cat.pl *.txt
aaa
bbb
ccc
ddd
fff
ggg