كيف يمكنني تقسيم سلسلة على طول الفاصل سلسلة المقدمة المستخدم في بيرل؟

StackOverflow https://stackoverflow.com/questions/1206464

  •  05-07-2019
  •  | 
  •  

سؤال

ورمزي يستخدم للعمل بشكل جيد، والآن حان كسر. تخفيض من المشكلة هو ما يلي: أريد أن تقسيم سلسلة المصدر (من قاعدة بيانات، ولكن هذا ليس مهما) في فاصل. لم يتم إصلاح فاصل، ولكن شريطة المستخدم، في سلسلة. اعتدت أن تفعل ما يلي:

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

ولكن هذا يكسر عندما يسأل المستخدمين للعلامة الجمع (+) كفاصل. الرسالة خفي قليلا:

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

وما أفهمه هو أنه يكسر بسبب انقسام لا تتوقع سلسلة، ولكن التعبير العادي. ومع ذلك، لا يمكن أن ينجح في ايجاد وسيلة للهروب من $ 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 في المثال سلسلة مقتبسة واحد هو عن قصد، أعتقد أنه من الواضح لماذا).

هل كانت مفيدة؟

المحلول

والوسيطة الأولى إلى 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" .

نصائح أخرى

والمشكلة هي أن يستخدم + باعتباره metacharacter للإشارة إلى "واحد أو أكثر 'من البنود السابقة (ما كنت تسأل عن واحد أو أكثر، دون أن يحدد ما هو عليه تريد)

والجواب سنان هي فكرة جيدة، والتحقق من quotemeta وظيفة فضلا .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top