私はスクリプト言語が新しく、erlのコマンドラインから与えられた引数から名前を抽出する必要があるという作業があります。Perlスクリプトのコマンドラインから引数として指定された名前を抽出する
が、私はこの
./perl.plx file.txt
のようなPerlスクリプトを呼び出していると私は、ファイルの名前を取得するにはそれだけでfile
名前、全体ではなくfile.txt
私はスクリプト言語が新しく、erlのコマンドラインから与えられた引数から名前を抽出する必要があるという作業があります。Perlスクリプトのコマンドラインから引数として指定された名前を抽出する
が、私はこの
./perl.plx file.txt
のようなPerlスクリプトを呼び出していると私は、ファイルの名前を取得するにはそれだけでfile
名前、全体ではなくfile.txt
を取得する必要があり、あなたはそれを抽出する必要があります@ARGV
から、ドット上で分割します。 「」:
my $fileName = (split /\./, $ARGV[0])[0];
、について説明ドット(文字の
split /\./, $ARGV[0]
分割が正規表現で特殊文字で、それは 『任意の文字』を意味;文字通りそれを持って、あなたはそれをエスケープする必要があり、よって、)。
(...)[0];
は、最初の要素、つまりファイル名をとります。
File :: Basenameよりも 'split()'を使うのはなぜですか? –
@DaveCross私はOPの特定のユースケースに迅速に対応していたので(コメントで私の質問からわかるように、正確な問題を理解するまでには既にしばらく時間がかかりました)私が正直であれば、私は 'File ::'について忘れてしまうほどのファイル名を扱いません。 – AntonH
Perlスクリプトへのコマンドライン引数は、perldoc perlvar
で説明されている@ARGV
に表示されます。
ファイル名の解析は簡単ではありませんが、外観は誤解を招く可能性があります。しかし、Perlにはすぐには考慮しないかもしれないエッジケースを扱うFile::Basename
というモジュールが付属しています。単純なsplit
が処理しない1つの辺のケースは、最後の接尾辞を除いて、ファイル名のどこかにドットが表示される可能性があります。
File::Basename
のドキュメントを確認するには、コマンドプロンプトにperldoc File::Basename
と入力します。
use stict;
use warnings;
use File::Basename qw(fileparse);
my ($fname, $dirs, $suffix) = fileparse($ARGV[0], qr/\.txt/);
print "Base file name is $fname\n";
print "Suffix is $suffix\n";
print "Path to $fname$suffix is $dirs\n";
Perlで、このモジュールの船は、あなたがそれを使用するために何かをインストールする必要はありませんので:ここでは
は一例です。すべてのPerlディストリビューションに同梱されているコアPerlモジュールを利用する際には、これらのツールで実装されたベストプラクティスとデバッグを活用してください。ありがとうございます。私が言ったように、私は 'perl 'には新しく、特にコマンドライン引数のようなものには新しいです。しかし、これのために多くのおかげで、多くの有用だった。 –
'@ ARGV'を見てみると、それはパラメータを持つ配列です。それはそこにある。 – AntonH
はい、$ ARGV [0]を使ってみると** file.txt **が返されます。文字列型ではないので、区切り文字で分割することはできません。私が言ったように、それは私に** file.txt **全体を与え、私は**ファイル**の名前だけが必要です。 –
'@ ARGV'には文字列しか含まれていません。それはあなたがそれらと何をするのかです。したがって、 '$ ARGV [0]'と 'file.txt'を持つ場合、その文字列' my $ name =(split /\./、$ ARGV [0])[0]; ' $ name'は "file"を含んでいます。 – AntonH