1

見つからない場合は正規表現を使用して、完全な文字列を置き換えたいと思います。見つかった場合はこれを使用して置き換えています:

my $var = "This apple is white";
$var =~ s/(.*)pple(.*)/No apples for you!/i;

今、私はそれを反転したいので、 pple が見つからない場合は、すべてを "No apples for you!" に置き換える必要があります。

私はこれで反転しようとしました

my $var = "This apple is white";
$var =~ s/(.*)^pple(.*)/No apples for you!/i;

しかし、私はそれを機能させる方法を見つけることができました。

4

1 に答える 1

7

「すべてを置き換える」は、「新しい値を割り当てる」とまったく同じです。したがって、単純な一致で十分な場合は、置換演算子 ('s///') は必要ありません。

my $var = 'This apple is white';
if ($var !~ /\bapple\b/i) {
  $var = 'No apples for you!';
}

正規表現を少し変更しました:/i修飾子を追加し、パターンの大文字と小文字を区別しないようにしました ('Apple' と 'apple' の両方をキャプチャするため; 元の投稿では 'pple' だったのはそのためだと思います)。\b('Applegate' と 'pineapple' の一致を防ぐため)。

更新:それが最も明確な解決策だと思いますが、技術的には、なしで行うことも可能ですif:

$var =~ s/^(?!.*\bapple\b.*).*$/No apples for you/i;

簡単なテストを次に示します。

use 5.010;
use warnings;
use strict;

my @fruit_strings = (
    'This apple is white',
    'This pineapple is violet',
    'This Apple is a company',
    'This pear is green');

for (@fruit_strings) {
     s/^(?!.*\bapple\b.*).*$/No apples for you/i;
     say;
}

文字列が複数行の場合/m、正規表現に修飾子を追加する必要があることに注意してください。

また、Perl 正規表現のクイック スタートPerl 正規表現の 2 つのチュートリアルを読むことをお勧めします。

于 2013-02-01T10:22:16.650 に答える