2017-03-04 7 views
-4

私はスクリプト言語が新しく、erlのコマンドラインから与えられた引数から名前を抽出する必要があるという作業があります。Perlスクリプトのコマンドラインから引数として指定された名前を抽出する

が、私はこの

./perl.plx file.txt 

のようなPerlスクリプトを呼び出していると私は、ファイルの名前を取得するにはそれだけでfile名前、全体ではなくfile.txt

+1

'@ ARGV'を見てみると、それはパラメータを持つ配列です。それはそこにある。 – AntonH

+0

はい、$ ARGV [0]を使ってみると** file.txt **が返されます。文字列型ではないので、区切り文字で分割することはできません。私が言ったように、それは私に** file.txt **全体を与え、私は**ファイル**の名前だけが必要です。 –

+1

'@ ARGV'には文字列しか含まれていません。それはあなたがそれらと何をするのかです。したがって、 '$ ARGV [0]'と 'file.txt'を持つ場合、その文字列' my $ name =(split /\./、$ ARGV [0])[0]; ' $ name'は "file"を含んでいます。 – AntonH

答えて

0

を取得する必要があり、あなたはそれを抽出する必要があります@ARGVから、ドット上で分割します。 「」:

my $fileName = (split /\./, $ARGV[0])[0]; 

、について説明ドット(文字の

split /\./, $ARGV[0]分割が正規表現で特殊文字で、それは 『任意の文字』を意味;文字通りそれを持って、あなたはそれをエスケープする必要があり、よって、)。

(...)[0];は、最初の要素、つまりファイル名をとります。

+0

File :: Basenameよりも 'split()'を使うのはなぜですか? –

+0

@DaveCross私はOPの特定のユースケースに迅速に対応していたので(コメントで私の質問からわかるように、正確な問題を理解するまでには既にしばらく時間がかかりました)私が正直であれば、私は 'File ::'について忘れてしまうほどのファイル名を扱いません。 – AntonH

5

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モジュールを利用する際には、これらのツールで実装されたベストプラクティスとデバッグを活用してください。

+0

ありがとうございます。私が言ったように、私は 'perl 'には新しく、特にコマンドライン引数のようなものには新しいです。しかし、これのために多くのおかげで、多くの有用だった。 –

関連する問題