我是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);
在这里您可以找到使用的vcard:
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:info@a.de
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
这就是我拥有的一切
此致 卡尔 - 亨氏
答案 0 :(得分: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:info@a.de
TEL;TYPE=work:+49 (0000) 123456
END:VCARD
无论如何 - 有问题的模块......
使用时,load_file
方法,
my $v = vCard->new;
my $r = $v->load_file('v.vcf');
不是将文件加载到当前实例中,而是返回新的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 "info@a.de",
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"
}
}
模块的另一个问题是,在加载之后,模块无法使用未定义的值,如
honorific_prefixes [
[0] undef
],
因此需要用
初始化它们$r->other_names([]);
$r->honorific_prefixes([]);
$r->honorific_suffixes([]);
p $r;
到
honorific_prefixes [],
正如我所说,它仍然是一个有点错误的模块。