重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

下記記述でディレクトリー内のリスト出力しているのですが、抽出するときにファイルのサイズが0バイトははじくということはできるのでしょうか?

@FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR));

A 回答 (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);
※カッコは全て必要です。

この回答への補足

回答ありがとうございます。

0バイトのファイルと正常ファイルを混在させてテストしているのですが、文法エラーは出ないのですが、これでいくと1ファイルも出力されませんでした。

3通りすべて実行しましたが同様でした。grepの後に下記記述がありますが、「該当なし」にとんでしまうようです。

if (@FTPlist){
foreach (@FTPlist) {
print ;
print "\n";
}
else { print "該当なし"; }
}

補足日時:2005/01/13 14:22
    • good
    • 0

先ほどはミスコードを提示してしまい失礼しました。


# 言い訳ですが・・普段はブロック構文を使った書き方ばかりしてるので優先度とかすっかり忘れてました。

本題。
-s で $_ のファイルサイズを得ようとしているのですが、$_にはパス情報がありません。
DIR でオープンしたディレクトリがカレントディレクトリでない場合は違うディレクトリを見てしまっているわけです。

なので
-s "パス/$_" と略さず、パス情報も付ける必要があります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。パス指定することによって解決したようです。

お礼日時:2005/01/13 17:22

まんま、その条件をgrepの第1引数に加えてやればいいかと思います。


# あと、間違いではないけどカッコが一組冗長ですね。

@FTPlist = grep /^$head$year$mon$mday.*\.csv$/ and -s, readdir(DIR);

参考URL:http://www.rfs.jp/sitebuilder/perl/05/func/x.html
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。上記記述をコピーして実行してみたのですが、下記エラーが出て動作しませんでした。

Not enough arguments for grep

お礼日時:2005/01/13 13:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!