Newsrc(3pm) | User Contributed Perl Documentation | Newsrc(3pm) |
News::Newsrc - manage newsrc files
use News::Newsrc; $newsrc = new News::Newsrc; $newsrc = new News::Newsrc $file; $newsrc = new News::Newsrc $file, create => 1; $ok = $newsrc->load; $ok = $newsrc->load ( $file); $newsrc->import_rc ( @lines); $newsrc->import_rc (\@lines); $newsrc->save; $newsrc->save_as ($file); @lines = $newsrc->export_rc; $ok = $newsrc-> add_group ($group, %options); $ok = $newsrc->move_group ($group, %options); $ok = $newsrc-> del_group ($group); $newsrc-> subscribe ($group, %options); $newsrc->unsubscribe ($group, %options); $newsrc->mark ($group, $article , %options); $newsrc->mark_list ($group, \@articles, %options); $newsrc->mark_range ($group, $from, $to, %options); $newsrc->unmark ($group, $article , %options); $newsrc->unmark_list ($group, \@articles, %options); $newsrc->unmark_range ($group, $from, $to, %options); ... if $newsrc->exists ($group); ... if $newsrc->subscribed ($group); ... if $newsrc->marked ($group, $article); $n = $newsrc-> num_groups; @groups = $newsrc-> groups; @groups = $newsrc-> sub_groups; @groups = $newsrc->unsub_groups; @articles = $newsrc-> marked_articles($group, %options); @articles = $newsrc->unmarked_articles($group, $from, $to, %options); $articles = $newsrc->get_articles ($group, %options); $ok = $newsrc->set_articles ($group, $articles, %options);
Perl 5.6.0, Set::IntSpan 1.17
Nothing
"News::Newsrc" manages newsrc files, of the style
alt.foo: 1-21,28,31-34 alt.bar! 3,5,9-2900,2902
Methods are provided for
A newsrc file is an ASCII file that lists newsgroups and article numbers. Each line of a newsrc file describes a single newsgroup. Each line is divided into three fields: a group, a subscription mark and an article list.
Lines containing only whitespace are ignored. Whitespace within a line is ignored.
Group names must be unique within a newsrc file. The group name is required.
"News::Newsrc" preserves the order of newsgroups in a newsrc file: if a file is loaded and then saved, the newsgroup order will be unchanged.
Methods that add or move newsgroups affect the newsgroup order. By default, these methods put newsgroups at the end of the newsrc file. Other locations may be specified by passing an %options hash with a "where" key to the method. Recognized locations are:
If the other newsgroups are not sorted alphabetically, put the group at an arbitrary location.
If $group does not exist, put the group last.
If $group does not exist, put the group last.
If $file is specified, "new" loads the newsgroups in $file into the object. Subsequent calls to "save" will write to $file.
If $file exists and the load fails, "new" "die"s.
If $file doesn't exist and the "create => 1" option is supplied in %options, then "new" doesn't load any newsgroups.
If $file doesn't exist and the "create => 1" option is not supplied in %options, then "new" dies.
If $file can't be opened, "load" discards existing data from $newsrc and returns null.
If $file contains invalid lines, "load" will "die". When this happens, the state of $newsrc is undefined.
Each line in @lines describes a single newsgroup, and must have the format described in "NEWSRC FILES". If @lines contains invalid lines, "import_rc" will "die". When this happens, the state of $newsrc is undefined.
"import_rc" accepts either an array or an array reference.
"save" will "die" if there is an error writing the file.
"save_as" will "die" if there is an error writing the file.
In scalar context, returns an array reference.
By default, $group is added to the end of the list of newsgroups. Other locations may be specified in %options; see "NEWSGROUP ORDER" for details.
By default, "add_group" does nothing if $group already exists. If the "replace" => 1 option is provided, then "add_group" will delete $group if it exists, and then add it.
"add_group" returns true iff $group was added.
If $group does not exist, "move_group" does nothing and returns false. Otherwise, it returns true.
If $group does not exist in $newsrc, "del_group" does nothing and returns false.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
If you plan to do any nontrivial processing on the article list, consider converting it to a "Set::IntSpan" object:
$articles = Set::IntSpan->new($newsrc->get_articles('alt.foo'))
$articles is a string, as described in "NEWSRC FILES".
$group will be created if it does not exist. Its location may be specified in %options; see "NEWSGROUP ORDER" for details.
If $articles does not have the format described in "NEWSRC FILES", "set_articles" does nothing and returns false. Otherwise, it returns true.
"Don't test for errors that you can't handle."
"load" returns null if it can't open the newsrc file, and dies if the newsrc file contains invalid data. This isn't as schizophrenic as it seems.
There are several ways a program could handle an open failure on the newsrc file. It could prompt the user to reenter the file name. It could assume that the user doesn't have a newsrc file yet. If it doesn't want to handle the error, it could go ahead and die.
On the other hand, it is very difficult for a program to do anything sensible if the newsrc file opens successfully and then turns out to contain invalid data. Was there a disk error? Is the file corrupt? Did the user accidentally specify his kill file instead of his newsrc file? And what are you going to do about it?
Rather than try to handle an error like this, it's probably better to die and let the user sort things out. By the same rational, "save" and "save_as" die on failure.
Programs that must retain control can use eval{...} to protect calls that may die. For example, Perl/Tk runs all callbacks inside an eval{...}. If a callback dies, Perl/Tk regains control and displays $@ in a dialog box. The user can then decide whether to continue or quit from the program.
I was going to call these methods "import" and "export", but "import" turns out not to be a good name for a method, because "use" also calls "import", and expects different semantics.
I added the "_rc" suffix to "import" to avoid this conflict. It's reasonably short and somewhat mnemonic (the module manages newsrc files). I added the same suffix to "export" for symmetry.
Up until version 1.09, "News::Newsrc" specified "use integer". As of 2012, users are reporting newsgroups with article numbers above 0x7fffffff, which break the underlying "Set::IntSpan" module on 32-bit processors.
Version 1.10 removes the "use integer" from "News::Newsrc". This extends the usable range of "Set::IntSpan" to (typically) 9e15, which ought to be enough, even for usenet.
If you want "use integer" back, either for performance, or because you are somehow dependent on its semantics, write
BEGIN { $Set::IntSpan::integer = 1 } use News::Newsrc;
See "Set::IntSpan" for more information.
Steven McDougall, swmcd@world.std.com
perl(1), Set::IntSpan
Copyright 1996-2013 by Steven McDougall. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2022-11-19 | perl v5.36.0 |