1
数値と文字列の違いを教えてください'1'
。
これを行う理由は、一致が成功した後、正規表現でキャプチャ括弧の数を決定したいからです。perlop doc によると、パターンにキャプチャ グループがない場合、リスト (1) が返されます。したがって、成功した一致とリスト (1) を取得した場合、パターンに括弧がないか、括弧が 1 つあり、「1」と一致したかどうかはわかりません。1
numberと stringの間に違いがある場合、そのあいまいさを解決できます'1'
。
1
数値と文字列の違いを教えてください'1'
。
これを行う理由は、一致が成功した後、正規表現でキャプチャ括弧の数を決定したいからです。perlop doc によると、パターンにキャプチャ グループがない場合、リスト (1) が返されます。したがって、成功した一致とリスト (1) を取得した場合、パターンに括弧がないか、括弧が 1 つあり、「1」と一致したかどうかはわかりません。1
numberと stringの間に違いがある場合、そのあいまいさを解決できます'1'
。
特殊な@+配列 を使用して、最後に成功した一致に含まれるキャプチャ グループの数を知ることができます。$#+
キャプチャ グループの数です。それが 0 の場合、キャプチャ括弧はありませんでした。
たとえば、ビット単位の演算子は、文字列と整数に対して異なる動作をします。
~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 を設定) のいずれかを返します。
正規表現が一致したキャプチャ グループの数を知りたい場合は、それらを数えるだけです。それらが返す値を見ないでください。これが問題のようです。
リスト代入の結果を見ると、リスト代入の右側にあるアイテムの数が返され、カウントを取得できます。
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
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'
、もはや区別できなくなります。
一致が成功した後、$1 の定義を確認します。ロジックは次のようになります。
あなたの質問はあまり意味がありませんが、次の違いを知りたいようです。
$a = "foo";
@f = $a =~ /foo/;
と
$a = "foo1";
@f = $a =~ /foo(1)?/;
キャプチャが行われたかどうかに関係なく、両方とも同じものを返すためです。
答えは次のとおりです。返された配列を使用しようとしないでください。$1
と等しくないかどうかを確認します""