1

1数値と文字列の違いを教えてください'1'

これを行う理由は、一致が成功した後、正規表現でキャプチャ括弧の数を決定したいからです。perlop doc によると、パターンにキャプチャ グループがない場合、リスト (1) が返されます。したがって、成功した一致とリスト (1) を取得した場合、パターンに括弧がないか、括弧が 1 つあり、「1」と一致したかどうかはわかりません。1numberと stringの間に違いがある場合、そのあいまいさを解決できます'1'

4

6 に答える 6

7

特殊な@+配列 を使用して、最後に成功した一致に含まれるキャプチャ グループの数を知ることができます。$#+キャプチャ グループの数です。それが 0 の場合、キャプチャ括弧はありませんでした。

于 2011-11-11T19:43:44.037 に答える
2

たとえば、ビット単位の演算子は、文字列と整数に対して異なる動作をします。

~1 = 18446744073709551614

~'1' = Î('1' = 0x31、~'1' = ~0x31 = 0xce = 'Î')

#!/usr/bin/perl

($b) = ('1' =~ /(1)/);
print isstring($b) ? "string\n" : "int\n";
($b) = ('1' =~ /1/);
print isstring($b) ? "string\n" : "int\n";

sub isstring() {
    return ($_[0] & ~$_[0]);
}

isstring は、false である 0 (ビット単位の数値操作の結果として)、または空でない文字列であるため true である "\0" (ビット単位の文字列操作の結果として、perldoc perlop を設定) のいずれかを返します。

于 2011-11-11T19:32:46.707 に答える
1

正規表現が一致したキャプチャ グループの数を知りたい場合は、それらを数えるだけです。それらが返す値を見ないでください。これが問題のようです。

リスト代入の結果を見ると、リスト代入の右側にあるアイテムの数が返され、カウントを取得できます。

my $count = my @array = $string =~ m/.../g;

キャプチャ バッファを保持する必要がない場合は、空のリストに割り当てます。

my $count = () = $string =~ m/.../g;

または、次の 2 つの手順で行います。

my @array = $string =~ m/.../g;
my $count = @array;

Mastering Perlの最初のページで示したトリックのいくつかを使用して、@+または変数を使用することもできます。これらの配列には、各キャプチャ バッファの開始位置と終了位置があります。インデックス 0 の値はパターン全体に適用され、インデックス 1 の値は などです。最後のインデックスは、キャプチャ バッファの総数です。perlvarを参照してください。@-$1

于 2011-11-11T21:23:09.083 に答える
0

Perlは、必要に応じて文字列と数値を自動的に変換します。内部的には、値を個別に追跡します。Devel :: Peekを使用して、これが実際に動作していることを確認できます。

use Devel::Peek;
$x = 1;
$y = '1';
Dump($x);
Dump($y);

出力は次のとおりです。

SV = IV(0x3073f40) at 0x3073f44
  REFCNT = 1
  FLAGS = (IOK,pIOK)
  IV = 1
SV = PV(0x30698cc) at 0x3073484
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x3079bb4 "1"\0
  CUR = 1
  LEN = 4

$xのダンプにはIVスロットの値がありますが、のダンプにはあり$yませんが、PVスロットには値があることに注意してください。また、異なるコンテキストで値を使用するだけで、文字列化または数値化がトリガーされ、他のスロットにデータが入力される可能性があることにも注意してください。たとえば、値を確認した場合、$x . ''または$y + 0値を確認する前に、次のように表示されます。

SV = PVIV(0x2b30b74) at 0x3073f44
  REFCNT = 1
  FLAGS = (IOK,POK,pIOK,pPOK)
  IV = 1
  PV = 0x3079c5c "1"\0
  CUR = 1
  LEN = 4

その時点1'1'、もはや区別できなくなります。

于 2011-11-11T19:40:03.150 に答える
0

一致が成功した後、$1 の定義を確認します。ロジックは次のようになります。

  • リストが空の場合、パターン マッチは失敗しました
  • それ以外の場合、 $1 が定義されている場合、リストには取得されたすべての部分文字列が含まれます
  • それ以外の場合、一致は成功しましたが、キャプチャはありませんでした
于 2011-11-11T19:47:27.667 に答える
-1

あなたの質問はあまり意味がありませんが、次の違いを知りたいようです。

$a = "foo"; 
@f = $a =~ /foo/; 

$a = "foo1"; 
@f = $a =~ /foo(1)?/; 

キャプチャが行われたかどうかに関係なく、両方とも同じものを返すためです。

答えは次のとおりです。返された配列を使用しようとしないでください。$1と等しくないかどうかを確認します""

于 2011-11-11T19:40:10.250 に答える