我有一個由我的腳本附加的sitemap.xml文件(該腳本從我的動態站點製作靜態頁面並添加靜態頁面網址到網站地圖。)Perl - 如何刪除文件中匹配項的匹配行和「x」行
但是,有一種情況下,當$ SomeID頁面不再需要時,需要腳本刪除(5)行。
這裏是我想刪除時$ SomeID(12345例如)匹配Sitemap的一個部分的示例:
<url>
<loc>http://mydomain.com/directory/some-page-name-34-098765.htm</loc>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>
#I want to delete from here
<url>
<loc>http://mydomain.com/directory/some-page-name-340-12345.htm</loc>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>
##to here (when 12345 is matched (done below))
<url>
<loc>http://mydomain.com/directory/some-page-name-445-45673.htm</loc>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>
現在,我可以找到行和號:
#!/usr/bin/perl -w
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print CGI::header();
use strict;
use warnings;
use LWP::Simple qw(!head);
use Fcntl; #needed for the verbose file handler calls like O_CREAT
use File::Slurp;
use File::Basename;
use DBI;
use Tie::File;
上面是我過去因各種原因使用的模塊的一個例子。
不需要在下面運行,但只需從另一個腳本粘貼。
my $SiteMapFile = 'sitemap.xml';
my $fh;
my $SomeID='12345';
my $cnt = '1';
my @SiteMap;
open($fh, "<", $SiteMapFile) || die "Can't open $SiteMapFile: $!";
my @maplines = <$fh>;
foreach(@maplines){
if ($_ =~ $SomeID){
print qq~Match in sitemap Sitemap Line $_<br />~;
push(@SiteMap, $_);
print qq~Found match at line number $cnt<br />;
}
$cnt++;
}
close $fh;
我把匹配的行插入到下一步我猜的數組中。
有沒有一種方法可以通過行號刪除一行?
那麼,我可以刪除行,它之前的行和它後面的3行,而無需創建臨時文件/使用兩個文件?
我在這裏看了一些類似的帖子,但是,沒有什麼能夠指出我的問題或者說明了我的理解。
我幾乎是一個noob,但耐心。 (原諒我上面的基本編碼技巧?) 我放棄了,所以我就是!
謝謝...
(我可以使用的模塊,比如領帶::如果需要的文件)
這看起來像XML。難道你不能用一些標準模塊來解析它到通常的哈希結構數組,而不是正則表達式嗎? –