我使用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。可能是什麼問題 ?謝謝。
我使用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。可能是什麼問題 ?謝謝。
由於未轉義的/
,您的代碼會給出語法錯誤。首先,您應該跳過\/
或使用其他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
作爲變量名,這將不會給語法錯誤或警告。但這些都是保留的關鍵字排序。
...並且不應該使用'$ a',因爲它在'perl'中有特殊含義,即使它沒有'單字母變量名是骯髒的,更重要的是 - '嚴格使用;使用警告'; OP包含在代碼中會阻止它編譯並且完全告訴它們什麼是問題。 – Sobrique
這是一個很好的工作split。下面的例子分割的是斜線字符行成一個列表,然後只需提取的最後一個條目(在這種情況下,abc.dll
):
my $file = (split '/', $data)[-1];
你看起來像一個路徑的反思。如果這是真的,那麼最好使用一個旨在以便攜方式解析路徑的模塊。
以下所有示例均假定使用strict
和warnings
。
use File::Spec;
my ($volume, $dirs, $file) = File::Spec->splitpath('E:/one/two/abc.dll');
use File::Basename;
my ($file, $dirs) = fileparse('E:/one/two/abc.dll');
use Path::Tiny;
my $path = path('E:/one/two/abc.dll');
my $file = $path->basename;
my $dirs = $path->parent->stringify;
您打開'使用嚴格的;使用警告;'。這樣做後,你真的嘗試運行代碼,或者你只是添加它來安撫堆棧溢出?因爲它會告訴你什麼是錯誤的,如果你編譯這段代碼:'不匹配[在正則表達式;標記爲< - HERE in m /([< - HERE^/' – Sobrique