Много способов сделать это в Perl.Одним из них является использование регулярных выражений:
if ($data =~ /^\[([^\]]+)\]\s*\[([^\]]+)\]\s*\[([^\]]+)\]/) {
my $command = $1;
my $source = $2;
my $destination = $3;
}
else {
die "Didn't match\n";
}
Это немного уродливо.В основном \[
и \]
соответствуют вашим квадратным скобкам.Вы должны поставить перед ними обратную косую черту, потому что скобки магические в регулярных выражениях.[^\]]
соответствует незамкнутым скобкам.[^x]
означает что угодно, кроме x
.Знак плюс на конце означает, по крайней мере, один.Таким образом, [^\]]+
соответствует как можно большему числу символов, пока не дойдет до другой закрывающей скобки.Изогнутые скобки вокруг выражения сохраняют его в переменных $1
, $2
и $3
.Я повторяю это для каждого элемента, с которым я сопоставляюсь.
Существует способ циклически повторять регулярное выражение, чтобы продолжать находить совпадающие части, но это немного сложнее, чем вы хотите сейчас разобраться.
Другой способ - использовать команду split:
$data =~ s/^\[(.*)\]$/$1/;
my ($move, $source, $destination) = split (/\]\s*\[/, $data);
В первой строке удаляются префиксные и добавляющие скобки, а затем я разделяю скобки "] [".Опять же, я использую регулярные выражения.
Регулярные выражения - это кровь Perl, и вы должны узнать о них как можно больше.Perl берет стандартные регулярные выражения Unix и расширяет их немного.Вы можете ввести perldoc perlre , чтобы найти документацию о регулярных выражениях и о том, как они используются, но это скорее справочное руководство, а не учебник.Вы также можете попробовать perldoc perlrequick , который является больше учебником.