use strict; use warnings; sub ical_parse { my $fh = shift; my %ical_hash; my ( $lastelement, $lastdata ); my %event; while (<$fh>) { chomp; if (/^\s+(.+)/) { } if (/^(METHOD|PRODID|VERSION):(.+)/) { $ical_hash{$1} = $2; } if ( /^BEGIN:VEVENT/ .. /^END:VEVENT/ ) { if (/^BEGIN:/) { %event = (); next; } if (/^END:/) { $ical_hash{_events_}{$event{SUMMARY}} = { %event }; %event = (); next; } if (/^(\w[^:]+):(.+)/) { $event{$1} = $2; next; } } } return %ical_hash; } sub ical_add_event { my ($to_hash) = shift; my (%event) = @_; # entweder die Daten werden hier drin umgewandelt oder richtig übergeben # und weiterer Code ;) #... # die "iCal entry $event{SUMMARY} exists!" if exists $to_hash->{_events_}{$event{SUMMARY}}; $to_hash->{_events_}{$event{SUMMARY}} = \%event; } sub ISO_datetime { my ($time) = shift // time; # 0 1 2 3 4 5 6 7 8 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); return sprintf '%4d%02d%02dT%02d%02d%02dZ',$year+1900,$mon+1,$mday,$hour,$min,$sec; } my %hash = ical_parse(*DATA); use Data::Dumper; say Dumper( \%hash ); ical_add_event( \%hash, CREATED => ISO_datetime(), 'LAST-MODIFIED' => ISO_datetime(), 'DTSTART;VALUE=DATE' => '20140101', 'DTEND;VALUE=DATE' => '20140101', SUMMARY => 'Sylvesterferien', DESCRIPTION => 'Sonderferien in Bayern', URL => 'http://mydomain.tld/', # einzigartige Zeichenfolge! + @ + domain UID => 'Sonderferien_in_Bayern1235473253483773463535353@mydomain.tld', TRANSP => 'TRANSPARENT', DTSTAMP => ISO_datetime(), ); say Dumper( \%hash ); __DATA__ BEGIN:VCALENDAR METHOD:PUBLISH PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Winterferien Bayern DTSTART;VALUE=DATE:20140303 DTEND;VALUE=DATE:20140308 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Winterferien-Bayern-201403081093325744@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Osterferien Bayern DTSTART;VALUE=DATE:20140414 DTEND;VALUE=DATE:20140427 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Osterferien-Bayern-201404271062227588@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Pfingstferien Bayern DTSTART;VALUE=DATE:20140610 DTEND;VALUE=DATE:20140622 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Pfingstferien-Bayern-201406221052186503@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Sommerferien Bayern DTSTART;VALUE=DATE:20140730 DTEND;VALUE=DATE:20140916 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Sommerferien-Bayern-201409161222283686@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Herbstferien Bayern DTSTART;VALUE=DATE:20141027 DTEND;VALUE=DATE:20141101 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Herbstferien-Bayern-201411011005635868@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Weihnachtsferien Bayern DTSTART;VALUE=DATE:20140101 DTEND;VALUE=DATE:20140105 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Weihnachtsferien-Bayern-201401051129637466@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Weihnachtsferien Bayern DTSTART;VALUE=DATE:20141224 DTEND;VALUE=DATE:20150101 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Weihnachtsferien-Bayern-201501011322846554@schulferien.org END:VEVENT END:VCALENDAR