我的情况是这样的:我想要一个 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.\-_]
.