2012-03-23 4 views
1

編集するテキストファイルのみを開くようにPerl-Tkコードを制限しようとしています。私は、ユーザーが(私はTKS getOpenFile()を使用しています)有効なファイルを選択したことを確認するためにテストしています:テキスト-TとPDFのPerlファイルテスト

if ((defined $file) and (-f $file) and (-T $file)) { 
    #work with file 
} 

私はに実行した問題は、一部のPDFファイル(-T試験に合格し、開かれますということです多くの混乱を引き起こす)。私はPDFでいっぱいのディレクトリでこのコードを試しました:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @files = <*>; 
foreach (@files) { 
    if (-T) { print "$_ is a text file\n"}; 
} 

ディレクトリの約1/2のPDFが印刷されます。

私は-Tを間違って使用していますか? PDFをフィルタリングする正規表現を追加する必要がありますか?そして、どのようにしてPDFの一部だけがテキストであるとPerlが考えるのでしょうか?

EDIT:-Tは、ファイルがプレーンテキストの場合はtrueを返すファイルテストです。私は汚れをチェックしようとはしていない。

+2

PDFは有効なプレーンテキストファイルです。テキストエディタでプレーンテキストとしてヒットしたファイルの1つをチェックしましたか? –

+0

それはそれを説明するだろう!テキストはPDFのみが通過し、ほとんどグラフィックは表示されません – charlesbridge

答えて

2

File::TypeまたはFile::LibMagicモジュールでさらに成功する可能性があります。

PDFはほとんどプレーンテキストです。圧縮、画像、および暗号化は、それらをバイナリとして表示します。しかし、シンプルなPDFは単純なテキストから簡単なテストです。

simplyfiedバージョンでのスペックからminimal PDFはプレーンテキストです:

%PDF-1.1 
%íì¦" 

1 0 obj 
    << /Type /Catalog 
    /Pages 2 0 R 
    >> 
endobj 

2 0 obj 
    << /Type /Pages 
    /Kids [3 0 R] 
    /Count 1 
    /MediaBox [0 0 300 144] 
    >> 
endobj 

3 0 obj 
    << /Type /Page 
     /Parent 2 0 R 
     /Resources 
     << /Font 
      << /F1 
       << /Type /Font 
        /Subtype /Type1 
        /BaseFont /Times-Roman 
       >> 
      >> 
     >> 
     /Contents [ 
     << /Length 105 >> 
     stream 
      BT 
      /F1 18 Tf 
      0 0 Td 
      (Hello world.) Tj 
      ET 
     endstream ] 
    >> 
endobj 

xref 
0 4 
0000000000 65535 f 
0000000019 00000 n 
0000000078 00000 n 
0000000179 00000 n 
trailer 
    << /Root 1 0 R 
     /Size 4 
    >> 
startxref 
612 
%%EOF 
+0

私はそうだと思う。 File :: Typeを試してみましょう。ありがとう – charlesbridge

+2

[ファイル:: LibMagic](http://p3rl.org/File::LibMagic)は他のどの検出モジュールよりもはるかに優れています(http://stackoverflow.com/questions/4788542/perl-command -or-module-like-linux-file-command)を実行します。代わりにそれを使用してください。 - 'libmagic'は、この質問に対する他の2つの答えで言及された' file'コマンドの基礎となります。 – daxim

+0

ポイントは取られ、答えに追加されました。 –

-1

提案のカップル:

  • あなたは新しいPerlで試したことがありますか?ドキュメントは "ヒューリスティックな推測"を呼びます。
  • ハックの種類ですが、ファイルを開く前にファイルで 'file'を実行してみることもできます。
  • もう1つのハック:open()の後の最初の行を読んで、本当にテキストであることを確認してください。

なぜ失敗するのかわかりません。-Tを通過する一般公開のアクセス可能なPDFファイルがありますか?

+0

これらはすべて、Perl 5.12 [ECMA 262](http://www.ecma-international.org/publications/files/ECMA -ST/Ecma-262.pdf)、 [Java言語仕様](http://www-sst.informatik.tu-cottbus.de/~db/doc/Java/The_Java_Language_Specification.langspec-2.0.pdf)および [データ構造とアルゴリズム](http://docs.rtfm.us/Users/M2G/Algorithms/2_Data%20Structure%20and%20Algorithms/Data%20Structures%20and%20Algorithms%20-%20Alfred%20V.%20Aho.pdf ) – Borodin

+0

私の3番目のポイントはうまくいくはずです。私はpdfの標準を知らないし、最初の行に "%PDF"が必要でないかもしれないので、それをハックと呼んでいる。 –

2

あなたは正しく-Tを使用している:それはちょうど最良の推測ではなく、絶対的な分類です。これは、そのPDFファイルは、あなたが「file」コマンドを@yvind Skaarが指摘したように、この

sub isPDF { 
    open my $fh, '<', shift or return; 
    read $fh, my $fourcc, 4; 
    return $fourcc eq '%PDF'; 
} 
-1

のようなサブルーチンで簡単にチェックしてみてください%PDFのFOURCCを運ぶ知って役立つことがあります。

0

ほとんどのPDFは、(完全に)プレーンテキストファイルではないことを暗示する目的で、%PDFの直後にいくつかのバイナリ文字があります。 PDFの仕様であっても、それをお勧めします。

注:ほとんどは(セクション3.1、 「字句規則」を参照)を行う、ヘッダ行がすぐにで 続くことが推奨されるようPDFファイルは、バイナリデータが含まれている場合少なくとも4つのバイナリ 文字(つまりコードが128以上の文字)を含むコメント行。この は、 がファイルの先頭付近のデータを検査して、 のファイルの内容をテキストまたはバイナリとして扱うかどうかを判断するファイル転送アプリケーションの適切な動作を保証します。

@mugenenケニスの答えでは、これを引き起こそうとしている%íì¦"が見えます。

関連する問題