2017-04-05 14 views
0

私は最後のスラッシュの後のすべてにマッチするperl正規表現を使用しています。 Perlのドキュメントを読んだ後、私は次のことがコードであることに気付きました。perlの最後のスラッシュの後の文字列を抽出します

use strict; 
use warnings; 
my $a = "E:/one/two/abc.dll"; 
if ($a =~ m/([^/]+$)/) 
{ 
print " the value is: $a \n"; 
} 

しかし、最後の文字列がabc.dllとして取得されています。何が問題なの?ありがとう。

+2

。警告を使う; '。実際にコードを実行してみましたか、スタックオーバーフローを緩和するために追加しましたか?このスニペットをコンパイルすると、何が間違っているのかが分かります: 'Unmatched [正規表現では; m /([< - - HERE ^/' – Sobrique

答えて

3

エスケープされていない/のため、コードに構文エラーが発生します。まず、\/から逃げるか、他のdelimitersを使用してください。

あなたのプリントステートメントでは、$aを印刷しているので、完全なデータが得られます。

一致するパターンを印刷する場合は$&を、グループ化された最初の要素を印刷する場合は$1を使用してください。

私のコードでは、$1を使用しました。

use strict; 
use warnings; 
my $data = "E:/one/two/abc.dll"; 

if ($data =~ m/([^\/]+)$/) 
{ 
    print " the value is: $1 \n"; 
} 

そして、これは構文エラーまたは警告を与えることはありません、変数名として$a$bを使用して避けてください。しかし、これはソートのために予約されたキーワードです。

+1

...ここで' $ a'を使うべきではありません。これは 'perl'で特別な意味を持ち、より重要なのは、厳密な使用警告が、コードに含まれているOPがコンパイルを妨げて、問題が何であるかを正確に伝えるということです。 – Sobrique

1

これはsplitのための良い仕事です。以下の例は、単に(この場合は、abc.dll)最後のエントリを抽出し、リストにスラッシュ文字に線を分割します。

my $file = (split '/', $data)[-1]; 
0

あなたはパスのようなルックスを持っている事。そうであれば、移植可能な方法でパスを解析するように設計されたモジュールを使うほうが良いでしょう。

以下のすべての例は、strictwarningsの使用を前提としています。あなたは `厳格な使用をオンに

File::Spec

use File::Spec; 
my ($volume, $dirs, $file) = File::Spec->splitpath('E:/one/two/abc.dll'); 

File::Basename

use File::Basename; 
my ($file, $dirs) = fileparse('E:/one/two/abc.dll'); 

Path::Tiny

use Path::Tiny; 
my $path = path('E:/one/two/abc.dll'); 
my $file = $path->basename; 
my $dirs = $path->parent->stringify; 
関連する問題