1

我有以下代码( perl ),但我不确定如何提取发生事件?

use Net::Google::Calendar;



my @cals = $parent->get_calendars;

for my $cal_selected (@cals) {

        printf "CALENDAR: %s\n", $cal_selected->title;

        $parent->set_calendar( $cal_selected );

                for ( $parent->get_events() ) {
                        my $title = $_->title || "";
                        my ($start, $end) = $_->when();

                        print "title: $title, start: $start, end: $end \n";
                }
}

所以,其中一个事件有一个“开始”变量,但它每 4 天跳跃一次 - 我在当前输出中看不到它。

输出如下所示:

title: "Event 1", start: 2012-08-06T00:00:00, end: 2012-08-13T00:00:00 
title: "Event 2", start: 2012-07-05T00:00:00, end: 2012-07-05T00:00:00

“Event1”有一个非常明确的开始和结束日期,6 天..

看到“事件 2”是在同一天,但发生在 2012-07-05、2012-07-09、2012-07-13 但我在输出本身中看不到...

4

1 回答 1

1

您可能需要尝试该recurrence方法。问题是如果你使用这个并且你没有Data::ICal安装模块,你会得到一个undef而不是一个错误。undef不幸的是,如果您已安装,您也会得到一个Data::ICal,并且不会再次发生。那只是糟糕的模块编程。

递归方法返回一个Data::Ical::Entry::Event对象。

从那里开始,我不完全确定该怎么做。Data::ICal::Entry::Event文档真的很少。我必须通读iCalendar RFC,其中提到该字段存储在名为rdate. 模块中提到了多个rdate属性Data::ICal::Entry::Event,但没有说明如何访问它或它的格式。

我认为您应该使用Data::ICal::DateTime来帮助解析这些信息。这个模块有一个 reoccurrence 方法,可以让你拉出所有 rddate 的集。不幸的是,它使用了一个Data::ICal对象,而你有一个Data::ICal::Entry::Event对象。也许那是 的子类Data::ICal,所以也许它仍然可以工作。

不幸的是,我没有谷歌日历设置,所以我真的没有办法玩这个。很抱歉没有更明确地说明这一点。但是,我希望这会引导你正确的方式。


另一项建议:使用Data::Dumper转储您获得的各种对象。这将帮助您了解正在发生的事情以及信息如何存储在这些对象中。运气好的话,您将能够准确地确定获取所需信息所需的方法和模块。

偷看是不礼貌的,但是当你不理解问题时,在书后查找答案有时会有所帮助。

于 2012-07-08T16:33:07.577 回答