-2

私は次のコードを実行しています:

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

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

close $fh;

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

$ fileは、次のようなテキストファイルを参照します。

a    1
b    2
c    3

このコードを2つの異なるLinuxボックスで実行しました。それらの1つは、期待される出力を私に与えました(テキストファイルに表示されているとおり)。もう1つは、代わりにこれをくれました。

GLOB(0x80f1174)

...これにより、コンテンツをさらに操作することが効果的に防止されます。

Perlのバージョンを確認しました。期待される出力が5.10であるのに対し、もう1つは5.8です。ただし、過去に5.8で機能した同様のファイルに対して、まったく同じコードを実行しました。

また、:set ff = unixを使用してファイルをDOSからUNIXに変換しようとしましたが、役に立ちませんでした。

4

4 に答える 4

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)"

<>readlineorのショートカットですglob(出力内の単語 GLOB とは関係ありません)。スペースにより、 になりglobます。

于 2012-04-02T16:05:16.490 に答える
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。

于 2012-04-03T02:36:25.750 に答える
0

はい、書きます

<$fh>

$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);
于 2012-04-02T15:58:37.180 に答える
0

Hercyniumが推奨するように File::Slurp を使用できます.OPが投稿したものに近いメカニズムは次のようになります:

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

このようにするとdo、ファイルハンドルを閉じることを含め、すべての変更がブロックに対してローカルになります。

NBperldoc -f doは教えてくれます

ブロックする

実際には関数ではありません。BLOCK で示される一連のコマンドの最後のコマンドの値を返します。

最後に実行されたステートメントのコンテキストがdo block(ここではスカラー) のコンテキストであることに注意してください。ブロックは非常に便利だと思いますdo(そしてあまり活用されていません)。これらはレキシカルな実行をブロックする優れた方法ですが、外部スコープに何かを簡単に返すこともできます。

于 2012-04-03T04:39:56.270 に答える