这是提取脚本名称的好方法吗?

这是提取脚本名称的好方法吗?

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

相关内容