Вы можете быть уверены, что имя файла никогда не будет иметь /
. Поэтому достаточно сделать:
$0=~/([^\/]+)$/;
my $this = $1;
print "my name is $this\n";
Все остальное (, кроме \0
), является честной игрой в имени файла. Таким образом, ваш подход пропустил бы такое сумасшедшее имя файла:
th&is%sc(ip)tHas
a^really#weird"+Name=!
И да, вы можете создать файл с таким именем:
$ touch 'th&is%sc(ip)tHas'$'\n'$'\t''a^really#weird"+Name=!'
$ ls -l *Nam*
-rw-r--r-- 1 terdon terdon 0 Jul 5 16:00 'th&is%sc(ip)tHas'$'\n\t''a^really#weird"+Name=!'
Но Perl может с этим справиться. Я сохранил строки выше с этим ужасным именем и запустил:
$ perl *Nam*
my name is th&is%sc(ip)tHas
a^really#weird"+Name=!
Ваша первоначальная версия потерпела бы неудачу с:
$ perl *Nam*
Use of uninitialized value $this in concatenation (.) or string at th&is%sc(ip)tHas
a^really#weird"+Name=! line 7.
my name is
Это потому, что[\w\.\-\_]
1 не соответствует ни одному из символов(&%()^#"+=!
)или пробелу в имени.
1Между прочим, вам не нужно убегать от большинства из них. Просто используйте [\w.\-_]
.