BDS Software

Linux Server perl Scripts

Here are some representative perl scripts which I use on my primary onsite Linux server (aka "Sleepy").

These are presented solely as examples for your reference, and completely without external comment.

-----

#! /usr/bin/perl

#####
#
# setup.pl
# MDJ 2022/05/30
#
# Sets up the Work List
# directories' contents
#
# To Run:
#   . cdTenMinute.bsh
#   cd to the desired
#     subdirectory, e.g.
#     01GENPartA or
#     01GENPartB or
#     etc.
#   setup.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#     ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.32.0;
use File::Copy;
use Cwd;

print "\n";

print "Start Setup\n";

# Point Perl to the current working directory
my $mainDir = getcwd;
#print $mainDir . "\n";

# Work List basename
my $WBN = "workList.txt";

# Work List filename
my $FN0 = $mainDir . "/" . $WBN;
#print $FN0 . "\n";

# Work List variables
my $bookName = "";
my $divisionsList = "";
my $qProgressList = "";
my $qCoCoFile = "";
my $qJavaScriptFile = "";
my $qPythonFile = "";
my $eProgressList = "";
my $eManuscriptFile = "";

# Temporary Transfer Variables
my $rev0 = "";
my $rev1 = "";
my $PFIn = "";
my $PFOut = "";

# Open the Work List file
open(FH0, '<', $FN0) or die "Could not open '$FN0' $!";

# Read the Work List file in Scalar Context
# and remove the trailing newline characters
# and remove the trailing whitespace character

$bookName = ;
chomp($bookName);
chop($bookName);
print "bookName = " . $bookName . "\n";

$divisionsList = ;
chomp($divisionsList);
chop($divisionsList);
print "divisionsList = " . $divisionsList . "\n";

$qProgressList = ;
chomp($qProgressList);
chop($qProgressList);
print "qProgressList = " . $qProgressList . "\n";

$qCoCoFile = ;
chomp($qCoCoFile);
chop($qCoCoFile);
print "qCoCoFile = " . $qCoCoFile . "\n";

$qJavaScriptFile = ;
chomp($qJavaScriptFile);
chop($qJavaScriptFile);
print "qJavaScriptFile = " . $qJavaScriptFile . "\n";

$qPythonFile = ;
chomp($qPythonFile);
chop($qPythonFile);
print "qPythonFile = " . $qPythonFile . "\n";

$eProgressList = ;
chomp($eProgressList);
chop($eProgressList);
print "eProgressList = " . $eProgressList . "\n";

$eManuscriptFile = ;
chomp($eManuscriptFile);
chop($eManuscriptFile);
print "eManuscriptFile = " . $eManuscriptFile . "\n";

# Close the Work List file
close(FH0);

# Copy Questions Progress file to new name
$rev0 = reverse $qProgressList;
chop($rev0);
$rev1 = reverse $rev0;
$PFOut = $mainDir . $rev1;
my $PFIn = $mainDir . "/Progress/QuestionsProgress.txt";
copy($PFIn, $PFOut);
unlink $PFIn;

# Copy Expositions Progress file to new name
$rev0 = reverse $eProgressList;
chop($rev0);
$rev1 = reverse $rev0;
$PFOut = $mainDir . $rev1;
my $PFIn = $mainDir . "/Progress/ExpositionsProgress.txt";
copy($PFIn, $PFOut);
unlink $PFIn;

print "Setup complete\n\n";

exit;

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# TT.pl
# Traversal Test
# MDJ 2022/05/30
#
# To Run:
#   . cdMiscTesting.bsh
#   cd traversalTestingDirectory
#   TT.pl
#
#####

# Pre-setup
use 5.30.0;

print "\n";

# Point Perl to the Testing Directory
my $mainDir = '/media/mdavidjohnson/Elements/workingdir/MiscTesting/traversalTestingDirectory';

# Traversal List basename
my $TBN = "TL.txt";

# Subdirectory name variable
my $subDir = "";

# Work List basename
my $WBN = "WL.txt";

# Work List filename
my $FN1 = "";

print "Starting Traversal Test\n";

# Form Traversal List filename
my $FN0 = $mainDir . "/" . $TBN;

# Open the Traversal List file
open(FH0, '<', $FN0) or die "Could not open '$FN0' $!";

# Read the Traversal List file in Scalar Context
while ()
{
    # Get the subdirectory name from the Traversal List file
    $subDir = $_;

    # Remove newline character
    chomp($subDir);

    # Remove trailing whitespace character
    chop($subDir);

    # Form Work List filename
    $FN1 = $mainDir . "/" . $subDir . "/" . $WBN;

    # Report the file access
    print $FN1;

    # Open the Work List file
    open(FH1, '<', $FN1) or die "Could not open '$FN1' $!";

    # Report opened status
    print " - opened";

    # Close the Work List file
    close(FH1);

    # Report closed status
    print " - closed.\n";
}

# Close the Traversal List file
close(FH0);

print "Traversal Test Finished\n";

exit;

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# KJVLastVerse.pl
# MDJ 2022/04/11
#
# Given:
#   Book Abbreviation
#   Chapter Number
# Returns:
#   Last Verse Number
#   for that Chapter
#
# To Run:
#   KJVLastVerse.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#   ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.30.0;

# Perl's Database Interface Module
use DBI;

# Data Source Name
my $dsn = "dbi:mysql:dbname=KJVData";

# mysql Username
my $user = "userName";

# mysql Password
my $password = 'intentionallyObfuscated';

# mysql Attributes
my %attr = (RaiseError => 1, PrintError => 0);
# Open the Database Connection
my $dbh = DBI->connect($dsn, $user, $password, \%attr)
  or die "failed to connect to MySQL database:DBI->errstr()";

print "\nStarting KJVLastVerse Run\n\n";

# Declare variables
my($bkAbbrev) = "";    # Book Abbreviation
my($chapNum) = "";     # Chapter Number
my($versNum) = "";     # Verse Number

# Get the inputs and convert as required

print "Enter the Book Abbreviation: ";
$bkAbbrev = ;
# Truncate to remove "\n"
chomp($bkAbbrev);
# Convert to all uppercase
$bkAbbrev = uc($bkAbbrev);

print "Enter the Chapter Number: ";
$chapNum = ;
# Truncate to remove "\n"
chomp($chapNum);
# Convert to numeric
$chapNum = 0 + $chapNum;

# Call the function
$versNum = &findLastVerseNum
  ($bkAbbrev, $chapNum);

# Display the result
print "\n";
print "Book Abbreviation     = ".$bkAbbrev."\n";
print "Chapter Number        = ".$chapNum."\n";
print "Verse Number          = ".$versNum."\n";

print "\nKJVLastVerse Run Finished\n\n";

# Close the Database Connection
$dbh->disconnect;

exit;

sub findLastVerseNum
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number

    my($bkA, $chN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT NumVerses
      FROM verseData
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($vsN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $vsN;
}

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# KJVPrevVerse.pl
# MDJ 2022/05/22
#
# Given:
#   Book Abbreviation
#   Chapter Number
# Returns:
#   Number of previous
#   verses for that
#   Chapter
#
# To Run:
#   KJVPrevVerse.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#   ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.30.0;

# Perl's Database Interface Module
use DBI;

# Data Source Name
my $dsn = "dbi:mysql:dbname=KJVData";

# mysql Username
my $user = "userName";

# mysql Password
my $password = 'intentionallyObfuscated';

# mysql Attributes
my %attr = (RaiseError => 1, PrintError => 0);

# Open the Database Connection
my $dbh = DBI->connect($dsn, $user, $password, \%attr)
  or die "failed to connect to MySQL database:DBI->errstr()";

print "\nStarting KJVPrevVerse Run\n\n";

# Declare variables
my($bkAbbrev) = "";    # Book Abbreviation
my($chapNum) = "";     # Chapter Number
my($pVersNum) = "";    # Previous Number of Verses

# Get the inputs and convert as required

print "Enter the Book Abbreviation: ";
$bkAbbrev = ;
# Truncate to remove "\n"
chomp($bkAbbrev);
# Convert to all uppercase
$bkAbbrev = uc($bkAbbrev);

print "Enter the Chapter Number: ";
$chapNum = ;
# Truncate to remove "\n"
chomp($chapNum);
# Convert to numeric
$chapNum = 0 + $chapNum;

# Call the function
$pVersNum = &findPrevNumVerses
  ($bkAbbrev, $chapNum);

# Display the result
print "\n";
print "Book Abbreviation          = ".$bkAbbrev."\n";
print "Chapter Number             = ".$chapNum."\n";
print "Previous Number of Verses  = ".$pVersNum."\n";

print "\nKJVPrevVerse Run Finished\n\n";

# Close the Database Connection
$dbh->disconnect;

exit;

sub findPrevNumVerses
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $pvN = Previous Number of Verses

    my($bkA, $chN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT NumPrevVerses
      FROM verseData
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($pvN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $pvN;
}

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# KJVInfo.pl
# MDJ 2022/04/11
#
# Given:
#   Running Verse Number
# Returns:
#   Book Abbreviation
#   Chapter Number
#   Verse Number
#
# To Run:
#   KJVInfo.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#   ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.30.0;

# Perl's Database Interface Module
use DBI;

# Data Source Name
my $dsn = "dbi:mysql:dbname=KJVData";

# mysql Username
my $user = "userName";

# mysql Password
my $password = 'intentionallyObfuscated';

# mysql Attributes
my %attr = (RaiseError => 1, PrintError => 0);

# Open the Database Connection
my $dbh = DBI->connect($dsn, $user, $password, \%attr)
  or die "failed to connect to MySQL database:DBI->errstr()";

print "\nStarting KJVInfo Run\n\n";

# Declare variables
my($runVersNum) = "";      # Running Verse Number
my($bkAbbrev) = "";        # Book Abbreviation
my($chapNum) = "";         # Chapter Number
my($versNum) = "";         # Verse Number
my(@Info) = ("", "", "");  # Information Array

# Get the input and convert as required

print "Enter the Running Verse Number: ";
$runVersNum = ;
# Truncate to remove "\n"
chomp($runVersNum);
# Convert to numeric
$runVersNum = 0 + $runVersNum;

# Call the function
@Info = &findKJVInfo
  ($runVersNum);

# Break out the results
($bkAbbrev, $chapNum, $versNum) = @Info;

# Display the result
print "\n";
print "Book Abbreviation     = ".$bkAbbrev."\n";
print "Chapter Number        = ".$chapNum."\n";
print "Verse Number          = ".$versNum."\n";
print "Running Verse Number  = ".$runVersNum."\n";

print "\nKJVInfo Run Finished\n\n";

# Close the Database Connection
$dbh->disconnect;

exit;

sub findKJVInfo
{
    # $RVN = Running Verse Number
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number
    # @kjv = Information Array

    my($RVN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT BookAbbrev, ChapterNum, VerseNum
      FROM verseList
      WHERE RunVerseNum = '$RVN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($bkA, $chN, $vsN) = $sth->fetchrow_array();
    my(@kjv) = ($bkA, $chN, $vsN);

    # Complete the query
    $sth->finish();

    return @kjv;
}

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# KJV300.pl
# MDJ 2022/05/22
#
# Given:
#   Starting Book Abbreviation
#   Starting Chapter Number
# Returns:
#   Ending Book, Chapter
#   and Verse for 300
#   Verses Later
#
# To Run:
#   KJV300.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#   ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.30.0;

# Perl's Database Interface Module
use DBI;

# Data Source Name
my $dsn = "dbi:mysql:dbname=KJVData";

# mysql Username
my $user = "userName";

# mysql Password
my $password = 'intentionallyObfuscated';

# mysql Attributes
my %attr = (RaiseError => 1, PrintError => 0);

# Open the Database Connection
my $dbh = DBI->connect($dsn, $user, $password, \%attr)
  or die "failed to connect to MySQL database:DBI->errstr()";

print "\nStarting KJV300 Run\n\n";

# Declare variables
my($sBkAbbrev) = "";       # Starting Book Abbreviation
my($sChapNum) = "";        # Starting Chapter Number
my($pVersNum) = "";        # Previous Number of Verses
my($runVersNum) = "";      # Running Verse Number
my($eBkAbbrev) = "";       # Ending Book Abbreviation
my($eChapNum) = "";        # Ending Chapter Number
my($eVersNum) = "";        # Ending Verse Number
my(@Info) = ("", "", "");  # Information Array

# Get the inputs and convert as required

print "Enter the Starting Book Abbreviation: ";
$sBkAbbrev = ;
# Truncate to remove "\n"
chomp($sBkAbbrev);
# Convert to all uppercase
$sBkAbbrev = uc($sBkAbbrev);

print "Enter the Starting Chapter Number: ";
$sChapNum = ;
# Truncate to remove "\n"
chomp($sChapNum);
# Convert to numeric
$sChapNum = 0 + $sChapNum;

# Call the findPrevNumVerses function
$pVersNum = &findPrevNumVerses
  ($sBkAbbrev, $sChapNum);

# Increment the Verses variable
$runVersNum = $pVersNum + 300;
if ($runVersNum > 31102)
{
    $runVersNum = 31102;
}

# Call the findKJVInfo function
@Info = &findKJVInfo
  ($runVersNum);

# Break out the results
($eBkAbbrev, $eChapNum, $eVersNum) = @Info;

# Display the results
print "\n";
print "Starting Book Abbreviation  = ".$sBkAbbrev."\n";
print "Starting Chapter Number     = ".$sChapNum."\n";
print "      +300\n";
print "Ending Book Abbreviation    = ".$eBkAbbrev."\n";
print "Ending Chapter Number       = ".$eChapNum."\n";
print "Ending Verse Number         = ".$eVersNum."\n";

print "\nKJV300 Run Finished\n\n";

# Close the Database Connection
$dbh->disconnect;

exit;

sub findPrevNumVerses
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $pvN = Previous Number of Verses

    my($bkA, $chN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT NumPrevVerses
      FROM verseData
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($pvN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $pvN;
}

sub findKJVInfo
{
    # $RVN = Running Verse Number
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number
    # @kjv = Information Array

    my($RVN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT BookAbbrev, ChapterNum, VerseNum
      FROM verseList
      WHERE RunVerseNum = '$RVN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($bkA, $chN, $vsN) = $sth->fetchrow_array();
    my(@kjv) = ($bkA, $chN, $vsN);

    # Complete the query
    $sth->finish();

    return @kjv;
}

#####
#
# EOF
#
#####

-----

#! /usr/bin/perl

#####
#
# KJVQuizList.pl
# MDJ 2022/05/23
#
# Given:
#   Starting Book Abbreviation
#   Starting Chapter Number
#   Ending Book Abbreviation
#   Ending Chapter Number
# Returns:
#   Quiz Question Verse Range List
#
# To Run:
#   KJVQuizList.pl
#
# ** WARNING **
# When saving perl scripts in
# Textpad, you should use
# the "Save As" command and
# change the Line Ending Box
# to "UNIX".
#
# Otherwise, you may get:
# /usr/bin/perl^M No such file
#   ( ^M = \r\n ).
#
#####

# Pre-setup
use 5.30.0;

# Perl's Database Interface Module
use DBI;

# Data Source Name
my $dsn = "dbi:mysql:dbname=KJVData";

# mysql Username
my $user = "userName";

# mysql Password
my $password = 'intentionallyObfuscated';

# mysql Attributes
my %attr = (RaiseError => 1, PrintError => 0);

# Open the Database Connection
my $dbh = DBI->connect($dsn, $user, $password, \%attr)
  or die "failed to connect to MySQL database:DBI->errstr()";

print "\nStarting KJVQuizList Run\n\n";

# Declare variables
my($sBkAbbrev) = "";        # Starting Book Abbreviation
my($sChapNum) = "";         # Starting Chapter Number
my($sVersNum) = "";         # Starting Verse Number
my($eBkAbbrev) = "";        # Ending Book Abbreviation
my($eChapNum) = "";         # Ending Chapter Number
my($eVersNum) = "";         # Ending Verse Number
my($pVersNum) = "";         # Starting Number of Previous Verses
my($runVersNum) = "";       # Ending Running Verse Number
my($totNumVerses) = "";     # Total number of verses in quiz
my($numQuizQuest) = 50;     # Number of Quiz Questions
my($avgNumVerses) = "";     # Average number of verses
                            #   per quiz question
my($minNumVerses) = "";     # Minimum number of verses
                            #   per quiz question
my($maxNumVerses) = "";     # Maximum number of verses
                            #   per quiz question
my($qqBreak) = "";          # Quiz questions break number
                            #   i.e. First question using
                            #   $maxNumVerses
my($qsC) = "";              # Continuing Running Verse Number
my($qsRunVersNum) = "";     # Question Starting Running Verse Number
my($qeRunVersNum) = "";     # Question Ending Running Verse Number
my($c) = "";                # counter
my($qrp) = "";              # Quiz Question Number Prefix
my($qsBA) = "";             # Quiz Question Starting Book Abbreviation
my($qsCN) = "";             # Quiz Question Starting Chapter Number
my($qsVN) = "";             # Quiz Question Starting Verse Number
my($qeBA) = "";             # Quiz Question Ending Book Abbreviation
my($qeCN) = "";             # Quiz Question Ending Chapter Number
my($qeVN) = "";             # Quiz Question Ending Verse Number
my(@Info) = ("", "", "");   # Information Array

# Get the input and convert as required

print "Enter the Starting Book Abbreviation: ";
$sBkAbbrev = ;
# Truncate to remove "\n"
chomp($sBkAbbrev);
# Convert to all uppercase
$sBkAbbrev = uc($sBkAbbrev);

print "Enter the Starting Chapter Number: ";
$sChapNum = ;
# Truncate to remove "\n"
chomp($sChapNum);
# Convert to numeric
$sChapNum = 0 + $sChapNum;

# Call the findPrevNumVerses function
$pVersNum = &findPrevNumVerses
  ($sBkAbbrev, $sChapNum);

print "Enter the Ending Book Abbreviation: ";
$eBkAbbrev = ;
# Truncate to remove "\n"
chomp($eBkAbbrev);
# Convert to all uppercase
$eBkAbbrev = uc($eBkAbbrev);

print "Enter the Ending Chapter Number: ";
$eChapNum = ;
# Truncate to remove "\n"
chomp($eChapNum);
# Convert to numeric
$eChapNum = 0 + $eChapNum;

# Call the findLastVerseNum function
$eVersNum = &findLastVerseNum
  ($eBkAbbrev, $eChapNum);

# Call the findRunVerseNum function
$runVersNum = &findRunVerseNum
  ($eBkAbbrev, $eChapNum, $eVersNum);

# Calculate the total number of
#   verses to be considered in
#   the quiz
$totNumVerses = $runVersNum - $pVersNum;
#***
print "tot number of verses = ".$totNumVerses."\n";

# Calculate the average number of
#   verses per quiz question
$avgNumVerses = $totNumVerses / $numQuizQuest;
#***
print "avg number of verses = ".$avgNumVerses."\n";

# Calculate the minimum number of
#   verses per quiz question
$minNumVerses = int($avgNumVerses);
#***
print "min number of verses = ".$minNumVerses."\n";

# Calculate the maximum number of
#   verses per quiz question
$maxNumVerses = $minNumVerses + 1;
#***
print "max number of verses = ".$maxNumVerses."\n";

# Calculate the Quiz Questions break number
$qqBreak = $numQuizQuest -
  int(($avgNumVerses - $minNumVerses)
  * $numQuizQuest);
#***
print "break number          = ".$qqBreak."\n";

# Initiate Continuing Running Verse Number
$qsC = $pVersNum;

# Report Questions: #0 to break number
print "\n";
for ($c = 0; $c < $qqBreak; $c++)
{
    if ($c < 10)
    {
        $qrp = "Q0".$c." - ";
    }
    else
    {
        $qrp = "Q".$c." - ";
    }
    $qsRunVersNum = $qsC + 1;
    $qeRunVersNum = $qsC + $minNumVerses;
    $qsC = $qeRunVersNum;
    &reportLine;
}

# Report Questions: break number
# to next-to-last question
for ($c = $qqBreak; $c < $numQuizQuest - 1; $c++)
{
    if ($c < 10)
    {
        $qrp = "Q0".$c." - ";
    }
    else
    {
        $qrp = "Q".$c." - ";
    }
    $qsRunVersNum = $qsC + 1;
    $qeRunVersNum = $qsC + $maxNumVerses;
    $qsC = $qeRunVersNum;
    &reportLine;
}

# Report last question
$c = $numQuizQuest - 1;
$qrp = "Q".$c." - ";
$qsRunVersNum = $qsC + 1;
$qeRunVersNum = $runVersNum;
&reportLine;

print "\nKJVQuizList Run Finished\n\n";

# Close the Database Connection
$dbh->disconnect;

exit;

#####
#
# Functions
#
#####

sub findPrevNumVerses
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $pvN = Previous Number of Verses

    my($bkA, $chN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT NumPrevVerses
      FROM verseData
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($pvN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $pvN;
}

sub findLastVerseNum
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number

    my($bkA, $chN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT NumVerses
      FROM verseData
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($vsN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $vsN;
}

sub findRunVerseNum
{
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number
    # $RVN = Running Verse Number

    my($bkA, $chN, $vsN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT RunVerseNum
      FROM verseList
      WHERE BookAbbrev = '$bkA'
      AND ChapterNum = '$chN'
      AND VerseNum = '$vsN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($RVN) = $sth->fetchrow_array();

    # Complete the query
    $sth->finish();

    return $RVN;
}

sub findKJVInfo
{
    # $RVN = Running Verse Number
    # $bkA = Book Abbreviation
    # $chN = Chapter Number
    # $vsN = Verse Number
    # @kjv = Information Array

    my($RVN) = @_;

    # Prepare the SELECT Query
    my $sth = $dbh->prepare
    ("SELECT BookAbbrev, ChapterNum, VerseNum
      FROM verseList
      WHERE RunVerseNum = '$RVN'")
    or die "prepare statement failed: $dbh->errstr()";

    # Execute the SELECT query
    $sth->execute();

    # Get the result of the query
    my($bkA, $chN, $vsN) = $sth->fetchrow_array();
    my(@kjv) = ($bkA, $chN, $vsN);

    # Complete the query
    $sth->finish();

    return @kjv;
}

sub reportLine
{
    # Call the findKJVInfo function
    # for the question's starting verse
    @Info = &findKJVInfo
      ($qsRunVersNum);

    # Break out the results
    ($qsBA, $qsCN, $qsVN) = @Info;

    # Call the findKJVInfo function
    # for the question's ending verse
    @Info = &findKJVInfo
      ($qeRunVersNum);

    # Break out the results
    ($qeBA, $qeCN, $qeVN) = @Info;

    # Print the report line
    print $qrp.$qsBA." ".$qsCN.":".$qsVN." to ".
      $qeBA." ".$qeCN.":".$qeVN."\n";
}

#####
#
# EOF
#
#####

-----

-----

-----