pmruk has asked for the wisdom of the Perl Monks concerning the following question:

Hi guys,

I'm trying to write a script that will aggregate two or more RSS feeds and display the contents of both feeds in one place on a webpage. I've managed to achieve this if I explicitly set the RSS URLs in my Perl script but this isn't ideal. In order to scale, I need to be able pass the script the URLs that need aggregating. That way I can use one script for numerous implementations.

So I've used the following which works:

while (<DATA>) { blah } _DATA_ http://www.domain.com/path/to/RSS/feed.xml http://www.domain.com/path/to/second/RSS/feed.xml

However, what I'd really like to do is this:

my $url1 = $cgi->param('url1'); my $url2 = $cgi->param('url2'); while (<DATA>) { blah } _DATA_ $url1 $url2

I'm sorry if I've misunderstood something fundamental here, but I guess what I want to know is is there a way to pass my script the URLs I need aggregating whilst still using the _DATA_ token?

Thanks :)

Replies are listed 'Best First'.
Re: Passing values to use under _DATA_ token
by almut (Canon) on Feb 21, 2009 at 10:34 UTC

    __DATA__ sections aren't being interpolated.

    Why not do something like

    for my $url (map $cgi->param($_), qw(url1 url2)) { # blah }
Re: Passing values to use under _DATA_ token
by ww (Archbishop) on Feb 21, 2009 at 11:46 UTC

    Your

    _DATA_ ^ ^
    really confuses the issue... and will not compile (is not a token which Perl knows how to interpret).

    If, in the first pseudocode snippet, you're trying to use http://www.domain.com/path/to/RSS/feed.xml and http://www.domain.com/path/to/second/RSS/feed.xml, then the header for that data must be:

    __DATA__ ^^ ^^

    But since your second code example appears to try to obtain the URLs from outside this script, using CGI, there is no point to a __DATA__ section. Try using almut's solution.

    In that case, however, you're going to have to use CGI in the second snippet... and have a source (a form in an html page, most likely) from which to obtain your URLs.

Re: Passing values to use under _DATA_ token
by Your Mother (Archbishop) on Feb 21, 2009 at 10:39 UTC

    Maybe see instead XML::Feed + config format of your choice, or perhaps this is close to what you need RSSycklr.

Re: Passing values to use under _DATA_ token
by cdarke (Prior) on Feb 22, 2009 at 11:09 UTC
    You can write to the script file, but I would avoid this if you possibily can, its screwy:
    my $url1 = $cgi->param('url1'); my $url2 = $cgi->param('url2'); if (<DATA>) { while (<DATA>) { # blah } } else { open (my $fh, '>>', $0) or die "Unable to open $0: $!"; print $fh "Data start\n$url1\n$url2\n"; close $fh; exec $0 } __DATA__
    The "Data start\n" marker is so that the first DATA test has something to read.