Perl散列+;文件+;虽然

Perl散列+;文件+;虽然,perl,Perl,好的,我们的想法是删除一个带有描述的文件,并将其存储在散列中 这是文件/home/opmeitle/files pl/bookmarks2中的内容 }, { "date_added": "12989744094664781", "id": "1721", "name": "Perl DBI - dbi.perl.org", "type": "url", "url": "http://dbi.perl.org/"

好的,我们的想法是删除一个带有描述的文件,并将其存储在散列中

这是文件/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/ = Perl DBI - dbi.perl.org
Perl DBI - dbi.perl.org = DBD::mysql - MySQL driver for the Perl5 Database Interface (DBI) - metacpan.org

谢谢你的回答。

正如@amon所暗示的,Chrome书签是JSON格式的,上面有几个很好的模块


正如@amon所暗示的,Chrome书签是JSON格式的,其上有几个好的模块


正如其他人所说,最好的做法是将JSON数据加载到Perl数据结构中。使用该模块可以轻松完成此操作。在执行此操作之前,我们需要先读取该文件。有两种方法可以做到这一点。非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>;
};
一旦读入文件,然后解码

use JSON;

my $data = decode_json $text;

请发布一个完整的文件,并更好地描述您想要的内容,我很高兴就更正式的遍历数据结构的方式发表评论

正如其他人所说,最好的做法是将JSON数据加载到Perl数据结构中。使用该模块可以轻松完成此操作。在执行此操作之前,我们需要先读取该文件。有两种方法可以做到这一点。非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>;
};
一旦读入文件,然后解码

use JSON;

my $data = decode_json $text;


请发布一个完整的文件,并更好地描述您想要的内容,我很高兴就更正式的遍历数据结构的方式发表评论

使用pragma
strict
,save your life:)是一个文件,其中在chromeis中保存书签是您显示正确的预期结果。看起来应该是“url”=“name”,但第二行不在后面。使用pragma
strict
,save your life:)是一个文件,其中在chromeis中保存书签是您显示正确的预期结果。看起来应该是“url”=“name”,但第二行不是这样的。我觉得用一个global来表示这一点真的很奇怪。简单地收集返回应该足够好了。@JoelBerger的观点很好,刚刚意识到我可以使用
map
,编辑得更好了,我仍然不太确定OP希望遍历做什么,但不管它是什么,这现在好多了。:-)感谢您为我的脚本所做的一切,我希望对每一行都有一个解释,这样我就可以从现在开始不着急地实现它了thanks@opmeitle
decode_json
返回散列数组的散列,散列数组的散列可以达到任意嵌套级别(因为这是书签文件的格式).
traverse
是一个递归子例程,它通过哈希收集url/名称对。也可以查看我的编辑。我认为使用全局函数来实现这一点非常奇怪。简单地收集返回应该足够好了。@JoelBerger说得好,刚刚意识到我可以使用
map
来实现这一点,编辑得更好了,我仍然不太确定P想要遍历,但不管它是什么,现在好多了。:-)谢谢你为我解决脚本问题所做的一切,我希望对每一行都有一个解释,这样我就能够从无到有地实施它thanks@opmeitle
decode_json
返回散列数组的散列,散列数组的散列可以达到任意嵌套级别(因为这是书签文件的格式)<代码>遍历是一个递归子例程,它遍历哈希收集url/名称对。另请参见我的编辑。chrome使用该存档以任何方式保存书签服务于任何json,非常感谢您的帮助,尽管我需要每行代码的详细信息
,但我需要每行代码的详细信息
这样做的目的不是教您Perl,但要帮助您解决代码中的问题点。如果你需要一行一行地描述它的语法(比我已经给出的更多),我建议你从阅读开始,这是一个免费的PDF下载。chrome使用该存档保存书签,以任何方式服务于任何json,非常感谢你的帮助,我收到了,虽然我需要每行代码的详细信息,但我需要每行代码的详细信息,所以SO的目的不是教您Perl,而是帮助您解决代码中的问题点。如果你需要逐行描述它的语法(比我已经给出的更多),我建议你从阅读开始,这是一个免费的PDF下载。
# always ...
use strict;
use warnings;

use File::Slurp;
my $text = read_file $file;
use JSON;

my $data = decode_json $text;