Как я могу разделить строку вдоль предоставленного пользователем разделителя строк в Perl? - PullRequest
0 голосов
/ 30 июля 2009

Мой код раньше работал нормально, а теперь он ломается. Проблема заключается в следующем: я хочу разделить исходную строку (из базы данных, но это не важно) на разделитель. Разделитель не является фиксированным, но предоставляется пользователем в виде строки. Раньше я делал это:

@results = split($splitString, $sourceStr);

Но это ломается, когда пользователи запрашивают знак плюс (+) в качестве разделителя. Сообщение немного загадочное:

Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE

Насколько я понимаю, он ломается, потому что split не ожидает строку, а регулярное выражение. Тем не менее, я не могу найти способ избежать $ splitString таким образом, чтобы он работал. Вот мой игрушечный пример:

  my $s = 'string 1 + $splitChar + string 2';
  my $splitChar = "+";
  my @result = split(/\\$splitChar/, $s);

  print "num of results ".scalar(@result)."\n";
  foreach my $value (@result) {
    print "$value\n";   
  }

Но это совсем не раскололось. Я попробовал несколько вариантов, ни один из которых не работал. Обратите внимание, что указанный пользователем разделитель, вероятно, ограничен одним символом, но многосимвольное решение было бы лучше.

(и да, я мог бы написать свою собственную специализированную функцию разбиения, но это не главное).

($splitChar в примере с одиночной кавычкой специально, я думаю, понятно почему).

Ответы [ 2 ]

15 голосов
/ 30 июля 2009

Первый аргумент split является шаблоном:

#!/usr/bin/perl

use strict;
use warnings;

my $sep = '+';
my $source = 'one+two+three';

my @results = split /\Q$sep\E/, $source;

use Data::Dumper;
print Dumper \@results;

См. Также perldoc -q "quote a variable".

6 голосов
/ 30 июля 2009

Проблема в том, что + используется в качестве метасимвола для обозначения «одного или нескольких» из предыдущих пунктов (поэтому вы запрашиваете один или несколько, не указывая, что именно вы хотите)

Хороший ответ Синану, а также проверьте quotemeta .

...