my $pointer = 0;
foreach (@new1)
{
my $test = $_;
foreach (@chk)
{
my $check = $_;
chomp $check;
delete($new1[$pointer]) if ($test =~ /^$check/i);
}
$pointer++;
}
的不匹配變量if語句永遠不匹配的事實@名new1陣列中的許多條目確實包含$檢查在數組(88至少)的開始。 我不知道它是嵌套循環,導致該問題的原因是,如果我嘗試這一點,也無法匹配:Perl的IF語句正則表達式
foreach (@chk)
{
@final = (grep /^$_/, @new1);
}
@final是空的,但我知道至少有88個entires爲$ _是@名new1。
我在運行Windows ActivePerl 5.14.2的機器上編寫了這段代碼,並且最上面的代碼有效。然後,我(使用@ new1的副本)比較兩者並刪除任何重複項(也適用於5.14.2)。我確實試圖否定if匹配,但似乎消滅了@ new1數組(所以我不需要做一個哈希比較)。
當我嘗試在Linux RedHat框中使用Perl 5.8.0運行此代碼時,它似乎很難與REGEX中的變量匹配。如果我用一個我知道在@ new1中的例子對REGEX進行硬編碼,匹配將起作用,並且在第一個代碼中該條目將被刪除(在第二個值中插入@final)。
@chk數組是Web服務器上的列表文件,通過在Web服務器上打開兩個日誌文件,然後將其中一個推入另一個文件,創建@ new1數組。
我甚至花費了在每個循環迭代中打印出$ test和$ check的麻煩,並且手動檢查是否有任何值匹配,其中一些值是否匹配。
它讓我感到困惑好幾天了,我不得不扔掉毛巾尋求幫助,有什麼想法?
顯示'@ new1'和'@ chk'的一些內容。 – toolic 2012-08-01 13:01:30
我注意到你在'@ chk'的值上使用'chomp',而不是'@ new1'的值,並且你最初在Windows上開發了這個代碼。這兩個列表最初是如何填充的?如果'@ chk'中的字符串具有Windows行結束符,那麼Linux下的'chomp'將只刪除'\ n',而不是'\ r \ n'。對陣列的 – chepner 2012-08-01 13:07:37
[delete](http://p3rl.org/delete)已棄用。如果你想刪除一個元素,使用[splice](http://p3rl.org/splice)。如果你想取消定義一個元素,使用[undef](http://p3rl.org/undef)。 – daxim 2012-08-01 13:11:28