IO::Handle: bad open mode: O_CREAT at

Fehlermeldung beim Versuch der Erstellung einer Datei mit O_CREAT ...

Ein systematisch begangener Fehler

der darin besteht eine Konstante zu quoten:

use strict;
use warnings;
use IO::File;

my $fh = IO::File->new;
$fh->open('asdf', 'O_CREAT') or die $!;

Hintergrund: Die Konstante O_CREAT verkörpert einen numerischen Wert und wird von IO::File importiert. Da eine Konstante nicht in Stringbegrenzer gesetzt werden darf, wirft IO::Handle, von dem die Klasse IO::File erbt, eine Exception mittels Carp::croak().

or die $!; kommt gar nicht zum Zuge weil die Exception bereits vorher fällt. Ein:

$fh->open('asdf', 'O_CREAT');

würde also dieselbe Fehlermeldung zeigen. Des Weiteren: Die Exception fällt in der Funktion

# IO::Handle
sub _open_mode_string {}

deswegen weil nur bestimmte Strings wie r,w,a als open_mode erlaubt sind. Diese Modulinterne (private) Funktion prüft also einen String! Und weil ein String O_CREAT als open mode nicht erlaubt ist, wird die Exception geworfen.

Über diesen Mechanismus, also die Prüfung ob in open mode ein String oder ein numerischer Wert vorliegt, wird in IO::Handle entschieden, ob die Funktion open() oder sysopen() aufgerufen werden soll. Die meisten Programmierer jedoch kennen diesen komfortablen Automatismus gar nicht und wissen ihn demzufolge auch nicht als Best Practice zu schätzen geschweige denn anzuwenden.


Die rein persönlichen Zwecken dienende Seite verwendet funktionsbedingt einen Session-Cookie. Datenschutzerklärung: Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. @: nmq​rstx-18­@yahoo.de