Bei Lesen aus dem Dateisystem brauchst Du Dich um die Namen um die es Dir wohl geht) nicht weiter kümmern. Ich vermute mal, Du willst letztendlich die gültigen und nicht reservierten Zeichen wissen um beim oder besser nach dem Schreiben keine Probleme zu haben.
Linux/Unix/Mac
Mit den gängigen Linux-Dateisystemen und auf Macs wirst Du kaum Probleme haben. Da sind alle Zeichen - sogar Steuerzeichen - gültig. Einige müssen aber "escaped" werden (Verzeichnistrenner und sonstige reservierte Zeichen).
Ausnahme: Das NUL-Byte.
Windows:
Dazu steht was im "Windows Dev Center".
Stellt sich die Frage, wie Du das Dateisystem erfährst auf dem Du gerade schreiben willst.
Stelle einfach fest unter welchen OS Dein Perl-Skript läuft. Ist es Windows, dann gehe einfach von einem Windows-Dateisystem aus. Selbst wenn jemand das Kunststück fertigbringt, unter Windows Unixoide Dateisysteme zu betreiben, dann bleibe dabei, falls derjenige die Dateien auch mal auf eines der unter Windows gängigen Dateisysteme kopieren will gibt es sonst erhebliche Probleme. Unter Unix/Linux/Mac sollte das hier das Dateisystem liefern:
#! /bin/sh
dir=$1;
if [ "" = "$dir" ]; then
dir='.';
fi
if [ -d $dir ]; then
mount | grep -P "^$(df $dir | cut -d ' ' -f1 | tail -n1) " | cut -d ' ' -f5;
exit 0;
else
echo "Fehler: '$dir' ist kein Verzeichnis." 1>&2;
exit 1;
fi
Ist es fat, fat32, vfat, extfat, ntfs (bis hierher: Windows) gilt obiges mit den Einschränkungen für fat ("8.3-Dateinamen"). Ist es iso9660, Rockridge oder joliet (CD, DVD) dann such die Regeln dafür raus...