- ベストアンサー
ディレクトリー内のリスト出力について
下記記述でディレクトリー内のリスト出力しているのですが、抽出するときにファイルのサイズが0バイトははじくということはできるのでしょうか? @FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR));
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイルサイズはファイルテスト演算子の -s で得られます。-s の用法は次の3通りです。 -s ファイル名 -s ファイルハンドル -s 3番目の用法では、$_ が指定されたものとして動作します。 これを grep の条件に追加すればよいのですが、No.1 の方法では and が , より優先度が低いため、 grep(/^$head$year$mon$mday.*\.csv$/) and (-s, readdir(DIR)); として解釈されて文法エラーとなります。 ですので、and ではなく && を使うか、 grep /^$head$year$mon$mday.*\.csv$/ && -s, readdir DIR; 次のようなブロック構文を使います。 grep { /^$head$year$mon$mday.*\.csv$/ and -s } readdir DIR; ※ブロック構文では、, をつけてはいけません。 もちろんカッコを使って優先度を変更してもできますが、見にくいのでおすすめしません。 grep((/^$head$year$mon$mday.*\.csv$/ and -s), readdir DIR); ※カッコは全て必要です。
その他の回答 (2)
- steel_gray
- ベストアンサー率66% (1052/1578)
先ほどはミスコードを提示してしまい失礼しました。 # 言い訳ですが・・普段はブロック構文を使った書き方ばかりしてるので優先度とかすっかり忘れてました。 本題。 -s で $_ のファイルサイズを得ようとしているのですが、$_にはパス情報がありません。 DIR でオープンしたディレクトリがカレントディレクトリでない場合は違うディレクトリを見てしまっているわけです。 なので -s "パス/$_" と略さず、パス情報も付ける必要があります。
お礼
ご回答ありがとうございます。パス指定することによって解決したようです。
- steel_gray
- ベストアンサー率66% (1052/1578)
まんま、その条件をgrepの第1引数に加えてやればいいかと思います。 # あと、間違いではないけどカッコが一組冗長ですね。 @FTPlist = grep /^$head$year$mon$mday.*\.csv$/ and -s, readdir(DIR);
お礼
ご回答ありがとうございます。上記記述をコピーして実行してみたのですが、下記エラーが出て動作しませんでした。 Not enough arguments for grep
補足
回答ありがとうございます。 0バイトのファイルと正常ファイルを混在させてテストしているのですが、文法エラーは出ないのですが、これでいくと1ファイルも出力されませんでした。 3通りすべて実行しましたが同様でした。grepの後に下記記述がありますが、「該当なし」にとんでしまうようです。 if (@FTPlist){ foreach (@FTPlist) { print ; print "\n"; } else { print "該当なし"; } }