1

2つの文字列を抽出して比較するワードパッドファイルがあります。この場合、それらは両方とも等しいですが、=~式を使用してそれらを評価することはできません。

if($pin_list =~ /$lvl_list/){ do something}

私がデバッグモードで試したこと:

  1. によって評価されるように、両方の文字列は等しいeq
  2. によって評価されるように、両方の文字列は等しい==
  3. 別の変数を手動で同じ文字列に設定してからif、新しい変数を使用してステートメントを実行します。if($pin_list =~ /$x/){do something}。この試みは成功しました。
  4. chomp(var)両方の文字列変数で数回実行してから、コードを実行しました。失敗した
  5. $tst_pins =~ s/\n//g両方の変数のキャリッジリターンビアを削除しました。失敗した
  6. 両方の変数の長さは同じです。
  7. 両方の変数を手動で印刷し、両方の文字列が同じであることを視覚的に確認しました。

誰かアイデアがありますか?ワードパッドとおそらく隠された文字に関係しているのではないかと思いますが、それを追跡する方法がわかりません。


tchrist->良い質問です。この場合、文字列は同じですが、常にそうであるとは限りません。通常の状態では、私は単に1つの文字列が別の文字列のサブセットになることを探しています。


興味のある方へ。問題が解決しました。

'+'で'結合した文字列がありました。したがって、文字列は次のようになります。

「1+2 + 3 + 4 + a + b+etc」

'+'が問題になりました。同僚の提案で、私はsubstrを実行し、問題のあるポイントまで弦の1つを削り落としました。'+'をキャプチャした直後に発生しました。次に、「+」の代わりに空白を使用して参加しましたが、すべてが機能します。

アルファベット以外の異なる文字を使用すると、他のすべてが等しいと言った理由を説明するのにまだ途方に暮れているという影響があります。

ブレット

4

2 に答える 2

4

一致演算子 (m//別名//) は、提供された文字列が提供された正規表現パターンと一致するかどうかをチェックします。提供された正規表現パターンと文字が等しいかどうかではありません。文字列と正確に一致する正規表現パターンを作成する場合は、quotemeta.

$str1これは と等しいかどうかをチェックします$str2:

my $pat = quotemeta($str1);
$str2 =~ /^$pat\z/

quotemeta経由で呼び出すこともできます\Q..\E

$str1 =~ /^\Q$str2\E\z/

もちろん、そのまま使用することもできますeq

$str1 eq $str2
于 2011-04-14T19:14:56.633 に答える
3

+などの文字は正規表現内で特別な意味を持つため、使用するだけで$expression =~ /$some_arbitrary_string/問題が発生する可能性があります。

ある文字列が別の文字列に文字通り含まれているかどうかという問題がある場合は、index正規表現を指定するためのすべての規則を使用して心配する必要はありません。

if (index($pin_list, $lvl_list) >= 0) {
    do_something;
}
于 2011-04-14T19:04:13.730 に答える