내 상황은 다음과 같습니다. Perl 스크립트가 자체 이름을 말하기를 원합니다. 나는 노력했다
print "$0\n";
스크립트와 동일한 디렉터리에서 작업하는 경우 이는 좋은 솔루션입니다. 이 해결책을 찾았습니다
use strict;
use warnings;
$0 =~ /([\w\.\-\_]+)$/;
my $this = $1;
print "my name is $this\n";
이것이 좋은 해결책입니까?
답변1
파일 이름은 절대 존재하지 않을 것이므로 /
다음을 수행하는 것만으로도 충분합니다.
$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.\-_]
.