2014-04-01 92 views
1

我是perl的新手,但對我的第一個腳本有一些成功。 我想使用模塊「vCard」。perl模塊vCard

好的,根據要求, 完整的腳本+文件+輸出。

#!/usr/bin/perl 
use strict; 
use warnings; 

use Text::vCard::Node; 
use Text::vCard; 
use Text::vFile; 
use vCard; 
use Glib; 
use Gtk2 '-init'; 
use Getopt::Long; 
# _  __  _  _  _  
# \ //  (_)  | | | |  
# \ \//_ _ _ __ _ __ _| |__ | | ___ 
# \ \//_` | '__| |/ _` | '_ \| |/ _ \ 
# \/(_| | | | | (_| | |_) | | __/ 
#  \/ \__,_|_| |_|\__,_|_.__/|_|\___| 
#           
#           
### variables block 
my $self=''; 
my $av_std_VERSION; 
my $av_loc_FILENAME; 
my $av_loc_VCARD; 
my $av_ADDRESSES; 
my $av_NODES; 
my $tmp_av_STRING; 
my $tmp_av_FN; 
my $tmp_av_FILE; 
my $tmp_av_RETURN; 

# option parameters 
my $av_pospar_DEBUG=''; 
my $av_pospar_VERBOSE=''; 
my $av_pospar_LOGGING=''; 
my $av_pospar_TEST=''; 
my $av_pospar_VERSION=''; 

#dialogelemente 
my $av_WINDOW; 
my $av_BUTTON; 
my $av_HBOX; 
my $av_VBOX; 
my $av_TEXTBOX1; 
my $av_LABEL1; 

#filehandler 
my $fh_av_VCARD; 

# ______    _ _     
# ____|    | | (_)     
# |__ _ _ _ __ ___| |_ _ ___ _ __ ___ 
# __| | | | '_ \/__| __| |/ _ \| '_ \/ __| 
# | | |_| | | | | (__| |_| | (_) | | | \__ \ 
# _| \__,_|_| |_|\___|\__|_|\___/|_| |_|___/ 
#            
#            
### functions commands block 
sub schluss 
{ 
    Gtk2->main_quit(); 
    exit (0); 
} 
sub auswertung 
{ 
    $tmp_av_STRING = $av_TEXTBOX1->get_text(); 
    Gtk2->main_quit(); 
} 

sub av_help 
{ 
    print "Benutzung:\n"; 
    print "xxx.pl [-d, --debug] [-f, --file <filename>] [-h, --help] [-t, --test] [-v, --verbose] [-V, --version]\n"; 
    print "Bedeutung der Optionen:\n"; 
    print "-d, --debug := debug on\n"; 
    print "-f, --file := dateiname einer existierenden .vcf-datei deren Werte eingelesen werden sollen\n"; 
    print "-h, --help := diese Information\n"; 
    print "-l, --logging := log all output to file in /var/userlog/\n"; 
    print "-t, --test := test mode on\n"; 
    print "-v, --verbose, -d, --debug := verbose on + debug on\n"; 
    print "-V, --version := Version wird ausgegeben\n"; 
} 
# _____        _ _    
# __ \        | | (_)    
# |__) | __ ___ _ __ __ _ _ __ __ _| |_ _ ___ _ __ 
# ___/ '__/ _ \ '_ \/_` | '__/ _` | __| |/ _ \| '_ \ 
# | | | | __/ |_) | (_| | | | (_| | |_| | (_) | | | | 
# _| |_| \___| .__/ \__,_|_| \__,_|\__|_|\___/|_| |_| 
#    | |          
#    |_|          
### preparation commands block 

GetOptions ("d" => \$av_pospar_DEBUG, # debug 
       "debug" => \$av_pospar_DEBUG,  # debug 
       "h" => \&av_help,  # help 
       "help" => \&av_help,  # help 
       "f=s" => \$av_loc_FILENAME,  # file 
       "file=s" => \$av_loc_FILENAME,  # file 
       "l" => \$av_pospar_LOGGING,  # logging 
       "logging" => \$av_pospar_LOGGING,  # logging 
       "t" => \$av_pospar_TEST,  # test 
       "test" => \$av_pospar_TEST,  # test 
       "v" => \$av_pospar_VERBOSE,  # verbose 
       "verbose" => \$av_pospar_VERBOSE, # verbose 
#    "V" => \$av_pospar_VERSION,  # version 
       "version" => \$av_pospar_VERSION) # version 
    or die("Error in command line arguments\n"); 

print "debug: $av_pospar_DEBUG\n"; 
print "file: $av_loc_FILENAME\n"; 
print "logging: $av_pospar_LOGGING\n"; 
print "test: $av_pospar_TEST\n"; 
print "verbose: $av_pospar_VERBOSE\n"; 
print "version: $av_pospar_VERSION\n"; 
print "alle optionen: @ARGV\n"; 

# __ __  _   _____     
# \/ |  (_)  | __ \     
# \/| __ _ _ _ __ | |__) | __ ___ ___ 
# |\/| |/ _` | | '_ \ | ___/ '__/ _ \/__| 
# | | | (_| | | | | | | | | | | (_) | (__ _ 
# _| |_|\__,_|_|_| |_| |_| |_| \___/ \___(_) 
#             
#             
### main procedure 

$av_loc_VCARD = vCard->new; 

$av_loc_VCARD->load_file($av_loc_FILENAME); 
print "return: $!\n"; 

$tmp_av_STRING = $av_loc_VCARD->as_string; 
print "$tmp_av_STRING\n"; 

# ______   _ _____     
# | ____|   | | | __ \     
# | |__ _ __ __| | | |__) | __ ___ ___ 
# | __| | '_ \/_` | | ___/ '__/ _ \/__| 
# | |____| | | | (_| | | | | | | (_) | (__ _ 
# |______|_| |_|\__,_| |_| |_| \___/ \___(_) 
#            
#            
### end procedure 
exit (0); 

這裏你可以找到使用的電子名片:

BEGIN:VCARD 
VERSION:3.0 
N;LANGUAGE=de:mySurname;myFirstname 
FN:myFirstname mySurname 
ORG:myCompany GmbH 
TEL;TYPE=work:+49 (0000) 123456 
ADR;TYPE=work:;;Strasse 1;Ortschaft arbeit;;56789;Deutschland 
ADR;TYPE=home;PREF:;;Privatstrasse 17;Privatortschaft;;00111;Deutschland 
EMAIL:[email protected] 
URL:www.a.de 
END:VCARD 

這就是輸出:

./av_perl_10.pl -v -f test_input.vcf 
debug: 
file: test_input.vcf 
logging: 
test: 
verbose: 1 
version: 
alle optionen: 
return: 
BEGIN:VCARD 
VERSION:4.0 
END:VCARD 

這就是我的全部

問候 卡爾 - 海因茨·

+3

請向我們展示整個程序,而不僅僅是您認爲相關的部分。你有''嚴格使用''和'使用警告;'在代碼的頂部?另外,我沒有在輸出中看到它打印返回碼。 –

+1

我無法重現您的錯誤。我得到這個:'BEGIN VCARD沒有匹配END'。你發佈了你的實際vcf文件嗎? – toolic

+0

我無法使用Text :: vCard甚至通過CPAN進行安裝,而無法獲得'BEGIN VCARD而沒有匹配END'錯誤。在Windows 8.1中使用ActivePerl 5.16(64位)。活動狀態的PPM安裝OK,但它不包括似乎是CPAN模塊一部分的所有文件。基本模塊可能有問題... – jimtut

回答

0

這個工程(有點):

use 5.012; 
use vCard; 

my $v = vCard->new; 
my $r = $v->load_file('v.vcf'); 
$r->other_names([]); 
$r->honorific_prefixes([]); 
$r->honorific_suffixes([]); 
my $tmp = $r->as_string; 
print "$tmp\n"; 

,並打印

BEGIN:VCARD 
VERSION:3.0 
N:name;first;;; 
FN:first name 
ADR;TYPE=work:;;Strasse 1;Ortschaft arbeit;;56789;Deutschland 
ADR;PREF=1;TYPE=home,pref:;;Strasse 2;Ortschaft 4;;12345;Deutschland 
EMAIL:[email protected] 
TEL;TYPE=work:+49 (0000) 123456 
END:VCARD 

反正 - 竊聽模塊...

當您使用時,load_file方法,

my $v = vCard->new; 
my $r = $v->load_file('v.vcf'); 

代替加載文件 current instan ce,它會返回一個新的vCard實例。你可以用Data::Printer模塊檢查這個,如果你傾倒了返回的情況下,例如,如:

use 5.012; 
use vCard; 
use DDP; 

my $v = vCard->new; 
my $r = $v->load_file('v.vcf'); #not loaded into $v, but returns a new instance 
p $v; #dump the "original" $v 
p $r; #dump the "new" $r 

返回$v

vCard { 
    Parents  Moo::Object 
    public methods (22) : addresses, as_file, as_string, birthday, email_addresses, encoding_in, encoding_out, family_names, full_name, given_names, honorific_prefixes, honorific_suffixes, load_file, load_hashref, load_string, new, other_names, phones, photo, timezone, title, version 
    private methods (8) : _build_address_nodes, _build_email_address_nodes, _build_name_node, _build_phone_nodes, _build_simple_nodes, _data, _setget, _simple_node_types 
    internals: { 
     _data   { 
      version 4.0 
     }, 
     encoding_in "UTF-8", 
     encoding_out "UTF-8" 
    } 
} 

爲$ R

vCard { 
    Parents  Moo::Object 
    public methods (22) : addresses, as_file, as_string, birthday, email_addresses, encoding_in, encoding_out, family_names, full_name, given_names, honorific_prefixes, honorific_suffixes, load_file, load_hashref, load_string, new, other_names, phones, photo, timezone, title, version 
    private methods (8) : _build_address_nodes, _build_email_address_nodes, _build_name_node, _build_phone_nodes, _build_simple_nodes, _data, _setget, _simple_node_types 
    internals: { 
     _data   { 
      addresses   [ 
       [0] { 
        city  "Ortschaft arbeit", 
        country  "Deutschland", 
        extended undef, 
        po_box  undef, 
        post_code 56789, 
        preferred 0, 
        region  undef, 
        street  "Strasse 1", 
        type  [ 
         [0] "work" 
        ] 
       }, 
       [1] { 
        city  "Ortschaft 4", 
        country  "Deutschland", 
        extended undef, 
        po_box  undef, 
        post_code 12345, 
        preferred 1, 
        region  undef, 
        street  "Strasse 2", 
        type  [ 
         [0] "home", 
         [1] "pref" 
        ] 
       } 
      ], 
      email_addresses  [ 
       [0] { 
        address  "[email protected]", 
        preferred 0, 
        type  undef 
       } 
      ], 
      family_names   [ 
       [0] "name" 
      ], 
      full_name   "first name", 
      given_names   [ 
       [0] "first" 
      ], 
      honorific_prefixes [ 
       [0] undef 
      ], 
      honorific_suffixes [ 
       [0] undef 
      ], 
      other_names   [ 
       [0] undef 
      ], 
      phones    [ 
       [0] { 
        number  "+49 (0000) 123456", 
        preferred 0, 
        type  [ 
         [0] "work" 
        ] 
       } 
      ], 
      version    3.0 
     }, 
     encoding_in "UTF-8", 
     encoding_out "UTF-8" 
    } 
} 

模塊的另一個問題是,與負載之後相比,模塊不能處理未定義的值,如

01因此
 honorific_prefixes [ 
       [0] undef 
      ], 

需要

$r->other_names([]); 
$r->honorific_prefixes([]); 
$r->honorific_suffixes([]); 
p $r; 

初始化他們

honorific_prefixes [], 

照我說的,它仍然是一個有點竊聽模塊。

+0

嗨;謝謝 - 會試一試。如果這是錯誤的,你能否推薦其他方式來處理電子名片(創建,編輯)? – averlon

+0

我嘗試過使用$ v和$ r的例子,但得到一個錯誤:繼續行,但沒有在/usr/local/share/perl/5.14.2/Text/vFile/asData.pm行的前一行34 – averlon