私はいくつかのPerlコードを持っています。 (今は何をしているかに集中しないでください。まだ作業中です。)
#!/usr/bin/perl -w
if(!@ARGV)
{
print ("ERROR: NO ARGS\n");
exit 1;
}
else
{
use Cwd qw(cwd);
my $dir = cwd;
print $ARGV[0];
@allfiles = glob($ARGV[0]);
foreach $file (@allfiles){
print "$file\n";
}
}
ARGV [0]の内容は行で@allfiles = glob($ARGV[0]);
解釈されます。私は彼らがそうしたくありません。たとえば、ARGV[0] が *.txt の場合、メタ文字のみが解釈されます。私はそうしたくありません。 glob()への入力として「*.txt」を使用したいと思います。どうすればいいですか?
答え1
zsh
シェルでは、次のものを使用できます。
alias myscript='noglob myscript'
noglob
multios
次の単純コマンドの引数にワイルドカード文字が表示されないようにするシェルキーワード(オンの場合、リダイレクトは発生しません)。
これは引き続き実行できます。
ENV_VAR=value myscript args
または
<input myscript args
または簡単に使用できます
myscript "*.$ext"
拡張したいが$ext
グローブを拡張しない場合。
答え2
この場合、関数の代わりにbashエイリアスを使用することをお勧めします。 Bashのマニュアルでは、For almost every purpose, aliases are superseded by shell functions
これが例外であると述べています。
普通こう言うと
perl script *.txt
これにより、シェルは* .txtを展開します。この機能は「set + f」を使用してオフにできます。関数の使用の問題は、関数が呼び出されたときにシェルがパターンを拡張したため、エイリアスと関数を組み合わせて使用することがコツです。
alias script="set +f ; _script"
_script(){ set -f ; perl script "$@" ; }
その後実行
script *.txt
"set +f; _script *.txt" として扱われるため、_script 関数を呼び出す前にモード拡張がオフになります。この関数はスキーマ拡張を再度開き、Perlスクリプトを呼び出します。
この問題を回避する別の方法は、シェル引用を使用して次のように話すことです。
perl script '*.txt'
そして、引用符はシェルがパターン拡張を実行するのを防ぎます。