Listing 5. The XS Implementation

double
std_dev(sv)
    INPUT:
	SV *		sv
    CODE:
	double sum = 0;
	double sumsq = 0;
	double mean = 0;

	/* Dereference a scalar to retrieve 
           an array value */
	AV* data = (AV*)SvRV(sv);

	/* Determine the length of the array */
	I32 arrayLen = av_len(data);

	if(arrayLen > 0)
	{
	  for(I32 i = 0; i <= arrayLen; i++)
	    {
	      /* Fetch the scalar located at i 
                 from the array.*/
	      SV** pvalue = av_fetch(data,i,0);

	      /* Dereference the scalar into 
                 a numeric value. */
	      double value = SvNV(*pvalue);

	      /* collect the sum and the 
                 sum of squares. */
	      sum += value;
	      sumsq += value * value;

	    }
	  mean = (sum/(arrayLen+1));
	  RETVAL = sqrt((sumsq/(arrayLen+1)) - 
                        (mean * mean));
	}
	else
	{
	  RETVAL = 0;
	}

    OUTPUT:
	RETVAL
