4

私はこのperlの例を取得しました。これは、これまでのところ死ぬことだけを示していることを除いて、sysopenとを示していると思われます。printf

#! /usr/bin/perl  
$filepath = 'myhtml.html';
sysopen (HTML, $filepath, O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened.";
printf HTML "<html>\n";

しかし、私がコードを実行するとき、それはただdiesです。

myhtml.html cannot be opened. at file_handle.pl line 7.

myhtml.html存在しませんが、O_CREATフラグによって作成されている必要があります。いけませんか?


編集

use strictとに関する提案を含めるようにコードを編集しました$!。以下は、新しいコードとその結果です。

#! /usr/bin/perl
use strict; 
$filepath = "myhtml.html";

sysopen (HTML, '$filepath', O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened. $!";
printf HTML "<html>\n"; 

出力は、のために、use strict私たちにたくさんのエラーを与えました:

Global symbol "$filepath" requires explicit package name at file_handle.pl line 3.
Global symbol "$filepath" requires explicit package name at file_handle.pl line 5.
Bareword "O_RDWR" not allowed while "strict subs" in use at file_handle.pl line 5.
Bareword "O_EXCL" not allowed while "strict subs" in use at file_handle.pl line 5.
Bareword "O_CREAT" not allowed while "strict subs" in use at file_handle.pl line 5.
Execution of file_handle.pl aborted due to compilation errors.

編集2

みんなの提案と助けに基づいて、これが最終的な作業コードです:

#! /usr/bin/perl
use strict;
use Fcntl;

my $filepath = "myhtml.html";

sysopen (HTML, $filepath, O_RDWR|O_EXCL|O_CREAT, 0755) 
    or die "$filepath cannot be opened. $!";
printf HTML "<html>\n"; 
....
4

3 に答える 3

11

O_RWDR、、、O_EXCLおよびO_CREATはすべてFcntlモジュールで定義された定数です。行を置く

use Fcntl;

スクリプトの上部近く。

于 2012-08-31T01:56:41.193 に答える
8

ここにたくさんの問題があります:

  • 常にuse strict;プログラムの一番上に置いてください。それは手がかりを提供します。
  • sysopen失敗した理由は$!変数にあります。通常、メッセージにはそれを含める必要がありdieます。
  • sysopenエントリでman perlfunc説明されているように、さまざまなO_*定数がモジュールによってエクスポートされFcntlます。useこれらの定数を定義する場合は、そのモジュールを使用する必要があります。"O_RDWR"現状では、文字列、、、"O_EXCL"およびを文字ごとに組み合わせているため、どうしたらよいかわからない "O_CREAT"別の文字列が生成されます。これが起こらないようにします。sysopenuse strict
于 2012-08-31T01:47:51.867 に答える
1

myhtml.htmlファイルはおそらくすでに存在します。スクリプトの前回の実行によってスクリプトが作成されたことが原因である可能性があります。ファイルが存在する場合、フラグは失敗しますO_EXCL。ドキュメントsysopenからの関連する引用:sysopen

多くのシステムでは、O_EXCLフラグは排他モードでファイルを開くために使用できます。これはロックではありません。排他性とは、ファイルがすでに存在する場合、sysopen()失敗することを意味します。

于 2012-08-31T01:47:07.530 に答える