1

ユーザーにファイル名を入力してもらい、プログラムにファイルの内容を出力させたい。

「引用符で囲まれていない文字列は将来の予約語と衝突する可能性があります」と「グローバル シンボル $filename には明示的なパッケージ名が必要です。

use strict;
use warnings;
print 'Enter file name: ';
my $fileName = <STDIN>;
chomp($fileName);
open(fh, $filename or die $!);

また、ファイルハンドルが変数ではないのはなぜですか (実際には、ここにあるように、変数であるかどうかを見た例によって異なります)。

4

5 に答える 5

5

$fileNameは異なります$filename-- Perl では大文字と小文字が区別されます。

于 2012-05-16T18:00:06.663 に答える
4

あなたの問題はすべてここにあります (そして$filenamevs. $fileName)。

open(fh, $filename or die $!);

もっと似たものが欲しい

open (my $fh, '<', $filename) || die $!;

最初のケースでは、die条件は on$filenameです。それは以下と同等です:

if (!$filename) { die $! }

しかし、2番目のものはより似ています:

if (!open (my $fh, '<', $filename)) { die $! }

より便利なスコープでif (!open)宣言しない限り、この方法 ( を使用) は無意味ですが、現在はブロック内でのみ表示されます。$fhif

$filenameif is undefinedopen()で失敗するため、2 番目のケースは暗黙的に最初のケースをカバーしUse of uninitialized value $filename in openます。

于 2012-05-16T18:01:50.503 に答える
4

2x「引用符で囲まれていない文字列が将来の予約語と衝突する可能性があります」と表示されます

fhする必要がありますmy $fh

「グローバル シンボル $filename には明示的なパッケージ名が必要です。

$fileName$filenameは異なる変数です。2番目のものは宣言されていません。

于 2012-05-16T18:00:53.640 に答える
3

fhまた、ベアワード ファイルハンドル (例: ) とスカラーファイルハンドル (例: )が見られる理由も尋ねました$fh。前者は非推奨です。宣言されているが未定義のスカラー ファイルハンドルを使用すると、「間接的な」ファイルハンドルを使用して呼び出されます。Perl は、ファイル (ハンドル) への参照を自動的に有効化 (作成) します。最も重要なことは、変数がスコープ外になり、それへの他の参照がなくなるとすぐに、ファイルハンドルが自動的に閉じられ、Perl のガベージ コレクションが使用されたメモリを取得できることです。

于 2012-05-16T18:19:54.957 に答える
2

ドル記号と正しい$fileName:

open(my $fh, '<', $fileName) or die $!;

ここにいくつかの役立つリファレンスがあります: http://perldoc.perl.org/functions/open.html

于 2012-05-16T18:00:31.507 に答える