2016-07-28 9 views
0

Скажем, у меня есть фиксированной переменной:Perl: Regular Expression Matching

$f_variable = "hello.exe"; 

и я хочу искать через файл построчно и найти путь, который содержит это слово, например:

/Desktop/Downloads/hello.exe 

или

/Desktop/Downloads/hello_qwdqd.exe 

Допустим, что расширение файла может быть exe или ex

и я написал эту строку кода:

if ($line =~ m/(\/$f_variable.*\.[exe]+) 

, очевидно, это будет не работает, потому что строка кода выше на самом деле:

if ($line =~ m/(\/hello.exe.*\.[exe]+) 

, который не будет что-нибудь.

Так что мой вопрос в том, какие изменения следует внести, чтобы правильно совместить и улавливать весь путь без, изменяя значение $f_variable?

+0

См. [Файл :: Базисное имя] (https://metacpan.org/pod/File::Basename). –

ответ

1

То, что вы написали, даже не является полным регулярным выражением. Хотя вы четко не сказал, что в файле (? Являются ли строки только пути), вы, вероятно, хотите что-то вроде:

my $pattern = $f_variable; 
$pattern =~ s/\.exe?$//; 
if ($line =~ m{(/\S*\Q$pattern\E[^/]*\.exe?)}) { 
    print "$1\n"; 
} 

Это удаляет имя файла .ex или .exe суффикс, чтобы получить базовое имя, затем сопоставляет первая строка, содержащая базовое имя, включая любые несущие пробелы, а не пробелы, заканчивающиеся на .ex или .exe.

+0

Могу ли я спросить, что является функцией '$' во второй строке рядом с .exe? '? –

+0

его конец состояния – ssr1012