Perl
這是提取腳本名稱的好方法嗎?
我的情況是這樣的:我想要一個 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.\-_]
.