2012-09-02 69 views
0

好,這個想法是刪除文件的方向與他們的描述,並將其存儲在一個散Perl的哈希+文件+雖然

這是文件內容的/ home/opmeitle /文件-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 

感謝你的答案等。

+1

使用編譯指示'strict',保存你的生活:) –

+0

Ist JSON中的輸入文件? – amon

+0

是一個文件,其中保存chrome – opmeitle

回答

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 
+0

我覺得用這個全球化非常奇怪。簡單收集回報應該足夠好。 –

+0

@JoelBerger好點,剛纔意識到我可以使用'map',編輯 – Oktalist

+0

好多了,我還不太確定OP想要遍歷什麼,但是不管它是什麼,現在這個好多了。 :-) –

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; 

請上傳整個文件和一個更好的描述你想要什麼,我會很樂意評論一個更正式的遍歷數據結構的方式。

+0

該存檔被Chrome用來保存書籤,以任何方式服務於任何json,非常感謝您爲我提供的幫助,儘管我需要每行代碼的詳細信息 – opmeitle

+0

'我需要一個詳細信息每行代碼'SO的目的不是要教你Perl,而是幫助你通過代碼中的問題點。如果你需要逐行描述它的語法(比我已經提供的更多),我推薦閱讀[The Modern Perl Book](http://onyxneon.com/books/modern_perl/index.html),它是一個免費PDF下載。 –