=pod =for comment PSPP - a program for statistical analysis. =for comment Copyright (C) 2019 Free Software Foundation, Inc. =for comment =for comment This program is free software: you can redistribute it and/or modify =for comment it under the terms of the GNU General Public License as published by =for comment the Free Software Foundation, either version 3 of the License, or =for comment (at your option) any later version. =for comment =for comment This program is distributed in the hope that it will be useful, =for comment but WITHOUT ANY WARRANTY; without even the implied warranty of =for comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the =for comment GNU General Public License for more details. =for comment =for comment You should have received a copy of the GNU General Public License =for comment along with this program. If not, see . =head1 PSPP::Examples This page shows some simple examples of using the PSPP module. See L for details on each of the subroutines. =head2 A Simple example This example creates a system file called F, containing one variable called "id". It contains no data. use PSPP; my $dict = PSPP::Dict->new (); my $var = PSPP::Var->new ($dict, "id"); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->close(); =head2 A slightly more complex example In this example there are three variables, called "id", "name" and "dob". Their formats are F2.0, A80 and DATETIME17 respectively. use PSPP; my $dict = PSPP::Dict->new (); PSPP::Var->new ($dict, "id", (fmt=>PSPP::Fmt::F, width=>2, decimals=>0) ); PSPP::Var->new ($dict, "name", (fmt=>PSPP::Fmt::A, width=>80) ); PSPP::Var->new ($dict, "dob", (fmt=>PSPP::Fmt::DATETIME) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->close(); =head2 Changing the properties of variables After a variable has been created, parameters may be set for it. use PSPP; my $dict = PSPP::Dict->new (); my $var1 = PSPP::Var->new ($dict, "id"); $var1->set_label ("A unique identifier"); $var1->add_value_label (0, "Zero"); $var1->add_value_label (1, "One"); =head2 Appending data to the file When a file is created, it contains no data. Data is added by appending cases to the file. This example creates a file with 3 cases. use PSPP; my $dict = PSPP::Dict->new (); PSPP::Var->new ($dict, "id", (fmt=>PSPP::Fmt::F, width=>2, decimals=>0) ); PSPP::Var->new ($dict, "name", (fmt=>PSPP::Fmt::A, width=>8) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); $sysfile->append_case ( [1, "Alf"] ); $sysfile->append_case ( [2, "Bert"] ); $sysfile->append_case ( [3, "Charlie"] ); $sysfile->close(); =head2 Variables with differing input and output formats By default, a variable's output format corresponds to the input format. However, the output format may be changed after the variable has been created. This example shows how to create a DATETIME variable using the current time as its value. Since pspp uses a different epoch to perl, the constant PSPP::PERL_EPOCH needs to be added to the value returned from time(), in order that it be correctly represented by pspp. use PSPP; my $dict = PSPP::Dict->new (); my $var1 = PSPP::Var->new ($dict, "entrytime", (fmt=>PSPP::Fmt::F) ); $var1->set_output_format ( (fmt=>PSPP::Fmt::DATETIME, width=>20) ); my $sysfile = PSPP::Sysfile->new ("foo.sav", $dict); my $now = time (); $sysfile->append_case ( [ $now + PSPP::PERL_EPOCH] ) || die "Cant write case"; $sysfile->close(); =head2 Reading data Data can be read from a system file or other source: use PSPP; my $sf = PSPP::Reader->open ("foo.sav"); my $dict = $sf->get_dict (); Once opened, the dictionary can be used like any other. for ($v = 0 ; $v < $dict->get_var_cnt() ; $v++) { my $var = $dict->get_var ($v); # Print the variables my $name = $var->get_name (); my $label = $var->get_label (); print "Var: $name, Label: $label\n"; # Retrieve and print the value labels my $vl = $var->get_value_labels (); print "$_: $vl->{$_}\n" for keys %$vl; } Reading of data must be done sequentially using the C method. while (my $c = $sf->get_next_case () ) { my $v; for ($v = 0; $v < $dict->get_var_cnt(); $v++) { print "val$v: @$c[$v] "; } print "\n"; } =cut