0
for ($i=0; $i<10; $i++)
{
  my $v1 = $sel->get_text("//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td/div/div");

my $v2 = $sel->get_text("//body[@\id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td[2]/div/div")

print ($v1 . $v2);
}

反復ごとに、14番目の要素を見つけてdiv[10]、増加したdiv[ ]要素に置き換える必要があります(例:14番目の要素がの場合はdiv、に置き換えdiv[2]ます。次の反復では、14番目の要素を見つけます。つまり、div[2]&に置き換えますdiv[3])。

PATTERNマッチングを使用することにより、それはできません。その特定の要素を見つけて置き換えるために正規表現を使用する方法はありますか?どうすればいいですか?

 my $a = "//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td/div/div"; 
    my @arr = split ('/' , $a); 
    print "@arr \n"; 
    my $size1 = @arr; 
    print "$size1\n"; 
    print $arr[16]; 
    foreach my $a2 (@arr) 
    { 
    print "$a2 \n"; 
    }
my $b = "//body[\@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/**div**/table/tbody/tr/td[2]/div/div";

上記の質問でv1とv2($aと$bとして編集)として言及されている2つの変数では、変更を両方に適用する必要があります。私はあなたが言ったことにほとんど近いと思います。よろしくお願いします

4

2 に答える 2

1
use 5.010;
my $xpath = q(//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div/table/tbody/tr/td/div/div);

for my $i (0..10) {
    my @nodes = split qr'/', $xpath;
    $nodes[16] .= "[$i]" unless 0 == $i;
    say join '/', @nodes;
}

結果:

//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[1]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[2]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[3]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[4]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[5]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[6]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[7]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[8]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[9]/table/tbody/tr/td/div/div
//body[@id='ext-gen3']/div[10]/div[2]/div/div/div/div/div/div/div/div/div/div[2]/div/div[10]/table/tbody/tr/td/div/div
于 2012-06-26T12:07:17.683 に答える
-1

うーん、すべての要素は/で区切られていますよね?したがって、ネイティブのsplitメソッドを使用して、/に基づいてdiv[10]に続くテキストの部分を分割できます。配列$arrに格納します。それをマージして、文字列の長さを見つけます。たとえば、$lenです。div [10]のインデックス、たとえば$orig_indexを見つけます。次に、14番目の要素を見つけ、正規表現の一致を実行して、それがどの形式であるかを確認します。

$arr[13] =~ /div([\d+])?/;
if ($1) {
  $arr[13] =~ /div[$1]/div[($1+1)]/e;
      }
else {
   $arr[13] = div[2];
   }

14番目の要素が変更されたので、配列を連結して、div[10]と14番目の要素の間の部分からその部分の新しい出力文字列を取得します。

{
local $" = ''; 
$newstring = "@arr";
}
splice($originalstring,$orig_index,$len,$newstring);

私はそれでいいと思います。

于 2012-06-26T07:39:28.743 に答える