好吧,我们的想法是删除文件的描述方向并将其存储在哈希
中这是文件/ home / opmeitle / files-pl / bookmarks2
中的内容 }, {
"date_added": "12989744094664781",
"id": "1721",
"name": "Perl DBI - dbi.perl.org",
"type": "url",
"url": "http://dbi.perl.org/"
}, {
"date_added": "12989744373130384",
"id": "1722",
"name": "DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI) - metacpan.org",
"type": "url",
"url": "https://metacpan.org/module/DBD::mysql"
}, {
现在,perl中的代码。
use strict;
open(FILE, '/home/opmeitle/files-pl/bookmarks2');
my @lines = <FILE>;
my @list55;
my $count = 1;
my $n = 0;
my %hash=(); #$hash{$lines[$n]}=$lines[$n];
while ($lines[$n]) {
if ($lines[$n] =~ /(http:|https:|name)/) {
if ($lines[$n] =~ s/("|: |,|id|url|name|\n)//g) {
if ($lines[$n] =~ s/^\s+//){
if ($lines[$n] =~ /http:|https/){
$hash{$lines[$n]} = '';
}
else {
$hash{$n} = $lines[$n];
}
}
}
}
$n++;
$count++;
}
close(FILE);
# print hash
my $key;
my $value;
while( ($key,$value) = each %hash){
print "$key = $value\n";
}
执行脚本后的结果。
http://dbi.perl.org/ =
https://metacpan.org/module/DBD::mysql =
3 = Perl DBI - dbi.perl.org
9 = DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI) - metacpan.org
但我需要这样的东西
http://dbi.perl.org/ = Perl DBI - dbi.perl.org
Perl DBI - dbi.perl.org = DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI) - metacpan.org
谢谢你的答案。
答案 0 :(得分:2)
正如@amon暗示的那样,Chrome书签是JSON格式,CPAN上有几个好的模块。
use strict;
use warnings;
use JSON;
my $file = '/home/opmeitle/files-pl/bookmarks2';
open my $fh, '<', $file or die "$file: $!\n";
my $inhash = decode_json(join '', <$fh>);
close $fh;
my %outhash = map traverse($_), values %{ $inhash->{roots} };
sub traverse
{
my $hashref = shift;
if (exists $hashref->{children}) {
return map traverse($_), @{ $hashref->{children} };
} else {
return $hashref->{url} => $hashref->{name};
}
}
现在%outhash
包含您想要的数据。
编辑:帮助了解这里发生了什么:
use Data::Dumper;
print Dumper($inhash); # pretty-print the structure returned by decode_json
答案 1 :(得分:1)
正如其他人所说,最好的办法是将JSON数据加载到Perl数据结构中。使用JSON
模块可以轻松完成此操作。在我们这样做之前,我们需要读入文件。有两种方法可以做到这一点。非CPAN方式:
# always ...
use strict;
use warnings;
my $file = '/home/opmeitle/files-pl/bookmarks2';
my $text = do {
open my $fh, '<', $file or die "Cannot open $file: $!\n";
local $/; #enable slurp
<$fh>;
};
或CPAN方式
# always ...
use strict;
use warnings;
use File::Slurp;
my $text = read_file $file;
读入文件后,再解码
use JSON;
my $data = decode_json $text;
请发布整个文件并更好地描述您想要的内容,我很乐意评论一种更正式的遍历数据结构的方法。