Используйте группировку с круглыми скобками и сохраните первую группу.
if( $line =~ /(\S{2}DT\S{3})/i )
{
my $substring = $1;
}
Приведенный выше код исправляет непосредственную проблему извлечения первого имени таблицы. Тем не менее, вопрос также спросил, как вытащить все имена таблиц. Итак:
# FROM\s+ match FROM followed by one or more spaces
# (.+?) match (non-greedy) and capture any character until...
# (?:x|y) match x OR y - next 2 matches
# [^,]\s+[^,] match non-comma, 1 or more spaces, and non-comma
# \s*; match 0 or more spaces followed by a semi colon
if( $line =~ /FROM\s+(.+?)(?:[^,]\s+[^,]|\s*;)/i )
{
# $1 will be table1, table2, table3
my @tables = split(/\s*,\s*/, $1);
# delim is a space/comma
foreach(@tables)
{
# $_ = table name
print $_ . "\n";
}
}
Результат:
Если $ line = "SELECT * FROM AADTTAB, BBDTTAB;"
Выход:
AADTTAB
BBDTTAB
Если $ line = "SELECT * FROM AADTTAB;"
Выход:
AADTTAB
Версия Perl: v5.10.0 для MSWin32-x86-multi-thread