11.7 練習問題2
コマンドラインならファイル名のリストを受け取って、その1つ1つについて、読み出し可能か、書き込み可能か、実行可能か、存在しないかを表示するプログラムを書いてください
はじめてのPerl p.200
それではまず自作コードを。
#! /usr/local/bin/perl use strict; use warnings; #全てのファイルテストを行い、結果を表示させる関数 sub test { my $file = $_[0]; #まずファイルが存在するかチェックする。存在するときのみ他のファイルテストを行う if (-e $file) { print "\tファイルが存在します\n"; if (-r $file) { print "\t読み出し可能\です\n"; } else { print "\t読み出し不可能\です\n"; } if (-w $file) { print "\t書き込み可能\です\n"; } else { print "\t書き込み不可能\です\n"; } if (-x $file) { print "\t実行可能\です\n\n"; } else { print "\t実行不可能\です\n\n"; } } else { print "\tファイルが存在しません\n"; print "\tこのファイルへのテストを終了します\n\n"; } } #全ての引数を処理するループ。判定して表示する。 for (@ARGV) { print "[$_]\n"; test($_); }
あんまりif文使いたくないけど、致し方無いのか。
さてさて、プログラムを実行してみます。
C:\Perl\hajip>perl hoge.pl notfound.txt tes1.txt tes2.txt
[notfound.txt]
ファイルが存在しません
このファイルへのテストを終了します[tes1.txt]
ファイルが存在します
読み出し可能です
書き込み可能です
実行不可能です[tes2.txt]
ファイルが存在します
読み出し可能です
書き込み可能です
実行不可能です
ふむ。問題なし。
解答を参考に、いけてない部分を箇条書きにすると
- if文多すぎ。
- メッセージは減ることになるが、もっとコードの見た目を良くできる。
- どの程度までユーザにメッセージを伝えるべきか、さじ加減が課題
- if文の入れ子が嫌。
- return使ってサブルーチンの途中で随時戻していく
- ファイルテストごとにシステムコールしている
- if文が無駄にもっさりしている
- 一行に収まりそうなときは収める
- if文の箇所のみならず、全体的にコードがもっさりしている、わかりづらい
- 常にプログラムを短く、簡単に書けないか意識する
- ルーチン同士が依存しあっている
- 常にモジュール強度、結合度を意識
書きなおしてみます。
#! /usr/local/bin/perl use strict; use warnings; #引数に対してファイルテストを行い、順次その結果を出力するサブルーチン sub test { my $file = shift @_; unless (-e $file) { print "\t$file doesn't exist\n"; return; } print "\t読み出し可能\です\n" if (-r _); print "\t書き込み可能\です\n" if (-w _); print "\t実行可能\です\n" if (-x _); print "\n"; } for (@ARGV) { print "[$_]\n"; &test($_); }
おおっ、結構きれいになったんじゃないかと。
43行→24行へダイエット成功。