1

文字列内のサブ文字列「[ids]」、「[order]」、および「[limit]」を他の3つのサブ文字列(パラメーターとしてルーチンに渡される)に置き換えたいと思います。

ただし、「[」または「]」の前に「\」( "\ ["、 "\]")が付いている場合は、「[...]」の特別な意味をキャンセルしたいと思います。また、「\」は自動的にキャンセルする必要があります。「\\」は「\」を意味します。

これをPerlで実装する方法は?

「[ids]」、「[order]」、「[limit]」の代わりに他のものを使用する場合があることに注意してください。これは石に設定されていません。

4

3 に答える 3

2

さらに別のテンプレートを発明する代わりに、既存のテンプレートモジュールを使用してみませんか?

とにかく、これがあなたのフォーマットを処理するパーサーです。

my %replace = (
   ids => ...,
   ...
);

my $out = '';
for ($in) {
   if (/\G    ( (?: [^\\\[\]]+ | \\. )+ )    /xsgc) {
       $out .= $1;
       redo;
   }

   if (/\G \[ ( (?: [^\\\[\]]+ | \\. )+ ) \] /xsgc) {
       die if !exists($replace{$1});
       $out .= $replace{$1};
       redo;
   }

   die if !/\G\Z/xsgc;
}
于 2012-05-29T15:09:35.527 に答える
0
#!/usr/bin/perl

use strict;
use warnings;

sub replace_squared_terms {
  my ($str, $hash) = @_;
  my $new = "";
  for(;;) {
    return $new if $str eq "";
    if($str =~ /^([^\[\]\\\/]+)(.*)/s) {
      $new .= $1;
      $str = $2;
    } elsif($str =~ /^\[([^\/\[\]]+)\](.*)/s) {
      die "Wrong template" unless exists $hash->{$1};
      $new .= $hash->{$1};
      $str = $2;
    } elsif($str =~ /^\\(.)(.*)/s) {
      $new .= $1;
      $str = $2;
    } else {
      die "Wrong template";
    }
  }
}

my $str = "[a] [b] \\[ [a] \\\\";
print replace_squared_terms($str, {a=>"123", b=>"XYZ"}), "\n";
于 2012-05-29T16:15:05.093 に答える
0

これがあなたがそれをすることができる1つの方法です:

sub replace{
    my ($str, $ids, $order, $limit) = @_;
    $str =~ s/(?<!\\)((?:\\.)*) \[ (?: (ids) | (order) | limit ) \]/
              $1 . ($2? $ids: $3? $order: $limit)/gsex;
    return $str;
}

例:

print replace <<'_STR_', '<1DZ>', '<0RD3RZ>', '<L1M1TZ>';
[ids][order][limit]
\[ids]\\[ids]\\\[ids]
_STR_

出力:

<1DZ><0RD3RZ><L1M1TZ>
\[ids]\\<1DZ>\\\[ids]
于 2012-05-29T16:22:18.693 に答える