2012-04-02 8 views
-2

私は次のコードを実行しています:私は2つの異なるLinux上でこのコードを実行したのPerl - ファイルズルズル問題

a 1 
b 2 
c 3 

open my $fh, "<", $file; 

$/ = undef; 
my $report = <$fh>; 
$/ = "\n"; 

close $fh; 

print("$report\n\n"); 

$ファイルは、次のようになりますテキストファイルを参照しますボックス。そのうちの1人が私に期待される出力を与えました(正確にはテキストファイルに表示されています)。もう一つは、代わりに私にこれを与えた:効果的にさらに内容を操作するから私を防ぎ

GLOB(0x80f1174) 

...。

私はPerlのバージョンを確認しました。予想される出力は5.10で、もう1つは5.8です。しかし、これまでの5.8と同様のファイルに対して、まったく同じコードを実行しました。

私はまた、DOSからUNIXへファイルを変換しようとしました:set ff = unix、しかし役に立たない。 $ FHは単にファイルハンドルであるとして

+1

4行目が 'my $ result = <$fh>'ではなく 'my $ result = $ fh'と表示された場合は、' GLOB(0x80f1174) 'のような出力が得られます。 – mob

+0

@mob私はコードをダブルチェックしました - それは<$fh>を使用しています。 – kaspnord

+0

@kaspnord、次にトリプルチェック。実行していると思われるファイルを実行していない可能性があります。 – ikegami

答えて

0

はい、$ FHとして

<$fh> 

を書くには、エラーが発生します。それを印刷することは、参照を印刷することと同等です。以下のコードのように、FHとして書き込むと実行時エラーが発生します。

open FH,$infile or die$!; 
while(<FH>){ 
    @line=split(/,/); 
    if($flag==0){ 
    foreach my $col (@line){ 
     $header{$col}=$count; 
     $count++; 
    } 
} 
} 
close(FH); 
4

壊れたファイルが

my $report = <$fh>; # aka: readline($fh) 

が含まれていませんおそらくそれは

my $report = $fh; 
my $report = < $fh >; # aka: glob(" $fh ") = " GLOB(0xXXXXXXX) " 
my $report = <$fh >; # aka: glob("$fh ") = "GLOB(0xXXXXXXX) " 
my $report = < $fh>; # aka: glob(" $fh") = " GLOB(0xXXXXXXX)" 

<>が含まれていreadlineglob(出力ワードGLOBとは無関係)のショートカットです。空白はglobになります。

+0

申し訳ありませんが、<$fh>のバリエーションが含まれている可能性があるファイルの意味がわかりません - もう少し説明できますか?私は<$fh>のバリエーションを知りませんでした... – kaspnord

+0

perlopの["I/O Operators"セクションを参照](http://search.cpan.org/perldoc?perlop#I/O_Operators) – mob

+0

@kaspnord、あなたの言っていることを含んでいないので、私はあなたのファイルに含まれているものを推測しています。 – ikegami

1

CPANのFile::Slurpモジュールを使用することをお勧めします。次に、あなたのコードは次のようになります。

use File::Slurp 'read_file'; 
my $file = '/path/to/some/file'; 
my $report = read_file $file; 
print("$report\n\n"); 

はるかに読みやすく、予測可能な、IMO。 、この方法を完了したら、すべての変更がdoブロックに対してローカルな

my $report = do { 
    open my $fh, '<', $file; 
    local $/; 
    <$fh>; 
}; 

:Hercyniumが推奨するよう

0

一つは、OPはのようなルックスを掲載するものに近いメカニズムをファイル::読まを使用することができますファイルハンドルを閉じることを含む。

N.B. perldoc -f doは本当に機能をBLOCK

をしていない私たちに

を伝えます。 BLOCKで示されたコマンドの シーケンスの最後のコマンドの値を返します。

最後に実行されたステートメントのコンテキストは、do block(ここではスカラー)のコンテキストです。私はdoブロックが非常に有用であることを発見しました。彼らは字句の実行をブロックするのに最適ですが、何かを外側のスコープに簡単に戻すことができます。

関連する問題