Perl

這是提取腳本名稱的好方法嗎?

  • July 5, 2019

我的情況是這樣的:我想要一個 Perl 腳本說出它自己的名字。我試過

print "$0\n";

如果您在腳本所在的同一目錄中工作,這是一個很好的解決方案。我找到了這個解決方案

use strict;
use warnings;
$0 =~ /([\w\.\-\_]+)$/;
my $this = $1;
print "my name is $this\n";

這是一個很好的解決方案嗎?

您可以確定文件名永遠不會有/. 因此,這樣做就足夠了:

$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.\-_].

引用自:https://unix.stackexchange.com/questions/528552