死活去不掉空行的pl。谁试试。

软件和网站开发以及相关技术探讨
回复
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

死活去不掉空行的pl。谁试试。

#1

帖子 eexpress » 2008-04-05 1:36

#!/usr/bin/perl -w

$home=$ENV{HOME};

#~/.config/rox.sourceforge.net/ROX-Filer/Bookmarks.xml
#<bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;">/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;</bookmark>
print "=====rox书签\n";
if (open(BM, "$home/.config/rox.sourceforge.net/ROX-Filer/Bookmarks.xml")) {
while ($line = <BM>) {
if ($line =~ /title/){
$line =~ s/<[^>]*>/\n/g;
$line =~ s/&#x([[:xdigit:]]+);/chr(hex($1))/ge;
$line =~ s/^$home/~/mg;
# $line =~ s/^\s*//mg;
# $line =~ s/\s*$//mg;
# $line =~ s/[\x0A]+/\n/mg;
$line =~ s/^\s*$//mg;
print $line;
}
if (eof) {close (BM);last;}
}
}
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2008-04-06 12:38

☎ cat ~/.config/rox.sourceforge.net/ROX-Filer/Bookmarks.xml
<?xml version="1.0"?>
<bookmarks>
<bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;">/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;</bookmark>
<bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x97F3;&#x4E50;">/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x97F3;&#x4E50;</bookmark>
<bookmark title="/home/exp/&#x4E0B;&#x8F7D;">/home/exp/&#x4E0B;&#x8F7D;</bookmark>
<bookmark title="/home/media">/home/media</bookmark>
<bookmark title="/home/exp/&#x5E94;&#x7528;/&#x811A;&#x672C;">/home/exp/&#x5E94;&#x7528;/&#x811A;&#x672C;</bookmark>
<bookmark title="/home/exp/.fvwm">/home/exp/.fvwm</bookmark>
<bookmark title="/media">/media</bookmark>
<bookmark title="/home/exp/&#x6587;&#x6863;/&#x8BBE;&#x8BA1;&#x8D44;&#x6599;/&#x745E;&#x8428;">/home/exp/&#x6587;&#x6863;/&#x8BBE;&#x8BA1;&#x8D44;&#x6599;/&#x745E;&#x8428;</bookmark>
<bookmark title="/home/exp/project/easy-account">/home/exp/project/easy-account</bookmark>
<bookmark title="/home/exp/&#x4E0B;&#x8F7D;/torrent-files">/home/exp/&#x4E0B;&#x8F7D;/torrent-files</bookmark>
<bookmark title="/home/media/&#x25CF;&#x52A8;&#x753B;">/home/media/&#x25CF;&#x52A8;&#x753B;</bookmark><bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x623F;&#x5C4B;&#x88C5;&#x9970;&#x56FE;&#x7247;">/home/exp/&#x5A92;&#x4F53;/&#x623F;&#x5C4B;&#x88C5;&#x9970;&#x56FE;&#x7247;</bookmark><bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x56FE;&#x6807;">/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x56FE;&#x6807;</bookmark><bookmark title="/usr/local/bin">/usr/local/bin</bookmark><bookmark title="/home/exp/test test">/home/exp/test test</bookmark></bookmarks>
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#3

帖子 RegentW » 2008-04-06 14:16

只是为了在console中显示的话,忽略空行就行了吧
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#4

帖子 eexpress » 2008-04-06 17:26

空行是正则产生的。为了后面的处理,最好是去掉。可$line =~ s/^\s*$//mg; 就是去不掉。
另外的2个文件,也类似操作,这样一行就去掉了。
管道挂sed,用/^\s*$/d就去掉了。只是不想这样。
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#5

帖子 RegentW » 2008-04-06 21:31

这一行

代码: 全选

$line =~ s/<[^>]*>/\n/g;
改成

代码: 全选

$line =~ s/<[^>]*>//g;
如何
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#6

帖子 eexpress » 2008-04-06 23:36

有一个你没想到的事情。就是那xml文件的最后一行,是几个标识连一起的。如果这样,就后面的路径都放一行了。
这种不规范,应该是系统造成的。我只好迁就他。

:lol:
你可以试试2楼的xml。1楼的pl改这xml的地址,就知道了。
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#7

帖子 RegentW » 2008-04-07 8:40

这个怎样

代码: 全选

#!/usr/bin/perl -w 

$home=$ENV{HOME}; 

#~/.config/rox.sourceforge.net/ROX-Filer/Bookmarks.xml 
#<bookmark title="/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;">/home/exp/&#x5A92;&#x4F53;/&#x25CF;&#x7535;&#x5F71;</bookmark> 
print "=====rox书签\n"; 
if (open(BM, "$home/.config/rox.sourceforge.net/ROX-Filer/Bookmarks.xml")) {
local $/=undef;
$line = <BM>;
$line =~ s/<[^>]*>/\n/g;
$line =~ s/&#x([[:xdigit:]]+);/chr(hex($1))/ge;
$line =~ s/^\s*$//mg;
$line =~ s/\n+/\n/mg;
print $line;
}
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#8

帖子 eexpress » 2008-04-07 9:15

local $/=undef; 是什么意思啊。没懂。这样 $line = <BM>; 读入了全部?那不是可以@line读入了。这样全部一起处理的,正常多了。

print行,老出这提示。你知道为什么吗
Wide character in print at t.pl line 15, <BM> chunk 1.

另外,你能帮忙写一个针对2楼xml的XML::Simple或者Twing的例子不。 :lol:
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#9

帖子 RegentW » 2008-04-07 9:47

$/ - The input record separator, newline by default.
这样 $line = <BM>; 读入了全部?那不是可以@line读入了。这样全部一起处理的,正常多了。
是可以
print行,老出这提示。你知道为什么吗
Wide character in print at t.pl line 15, <BM> chunk 1.
意思是Perl遇到了>255的字符,可以在脚本中加入一行

代码: 全选

binmode STDOUT, ':utf8';
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#10

帖子 eexpress » 2008-04-07 9:57

pl还是晦涩啊。没看过的东西,完全是晕的。

那XML的模块,拜托写一个哦。例子而已。

:em42 :em42
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#11

帖子 RegentW » 2008-04-07 13:06

我水平很一般的,写脚本时也经常要看perldoc或上网搜 :oops:
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#12

帖子 eexpress » 2008-04-09 9:09

可惜啊。论坛少有喜欢perl的。也没#perl-cn的irc。奇怪了。几次到#perl问,都是说一大堆,最终别人都推荐用模块。其实我不喜欢一个小事,也用模块。写的东西,不通用了。
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#13

帖子 RegentW » 2008-04-09 9:44

我有时就是喜欢reinvent the wheel
一方面可以自己学到东西 同时更适合自己的特殊需要
Core i5, 512G + SSD 20G, DDRIII 8G
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#14

帖子 eexpress » 2008-04-09 10:20

其实。perl是太成熟了。没东西搞了。什么样的脚本,都有。别人早发布了。等我想搞的时候,找不到和我一样档次的。呵呵。

yaoms才找了一个irssi的osd显示的脚本。都现成的。他改了一个很简单的。
● 鸣学
头像
RegentW
帖子: 1486
注册时间: 2007-02-27 21:47
来自: NN

#15

帖子 RegentW » 2008-04-09 12:39

是呀 正因为已经非常成熟 所以除了CPAN还有丰富的支持 想解决什么问题的话 到网上google一下很快搞定
Core i5, 512G + SSD 20G, DDRIII 8G
回复