Программный аргумент равен 100, но возвращает значение как 0100 - PullRequest
1 голос
/ 02 октября 2019

Прямо сейчас я пытаюсь выполнить задание, где мне нужно - Извлечь информацию из файла HTML - Сохранить ее в скаляр - Запустить регулярное выражение, чтобы найти количество мест, доступных в назначенном курсе (аргумент программыномер курса, например, 100 для ICS 100) - Если курс имеет несколько сеансов, я должен найти сумму доступных мест и распечатать - Выходные данные - только количество доступных мест

Проблема здесьчто, когда я отлаживал и проверял, чтобы в моей переменной, в которой сохранен программный аргумент, хранилось правильное значение, он сохранял значения с дополнительным 0 за ним.

ex.) Perl filename.pl 100

ARGV [0] возвращается как 0100

Я пытался сохранитьИстинные значения регулярного выражения в массиве, сохранение с использованием нескольких скалярных переменных и изменение моего регулярного выражения, но ни одно из них не сработало.

die "Usage: perl NameHere_seats.pl course_number" if (@ARGV < 1);
# This variable will store the .html file contents
my $fileContents;
# This variable will store the sum of seats available in the array @seatAvailable
my $sum = 0;
# This variable will store the program argument
my $courseNum = $ARGV[0];

# Open the file to read contents all at once
open (my $fh, "<", "fa19_ics_class_availability.html") or die ("Couldn't open 'fa19_ics_class_availability.html'\n");
  # use naked brakets to limit the $/
  {
  #use local $/ to get <$fh> to read the whole file, and not one line
  local $/;
  $fileContents = <$fh>;
  }
# Close the file handle
close $fh;
# Uncomment the line below to check if you've successfully extracted the text
# print $fileContents;
# Check if the course exists
die "No courses matched...\n" if ($ARGV[0] !~ m/\b(1[0-9]{2}[A-Z]?|2[0-8][0-9][A-Z]?|29[0-3])[A-Z]?\b/);
while ($fileContents =~ m/$courseNum(.+?)align="center">(\d)</) {
  my $num = $2;
  $sum = $sum + $num;
}
print $sum;
# Use this line as error checking to make sure @ARGV[0] is storing proper number
print $courseNum;

Текущий вывод, который я получаю, когда аргумент программы равен 100, равен просто 0, а яПредположим, это потому, что регулярное выражение не перехватывает какие-либо значения как true, поэтому сумма остается равной 0. Вывод должен быть 15 ... Это ссылка на страницу .html> https://laulima.hawaii.edu/access/content/user/emeyer/ics/215/FA19/01/perl/fa19_ics_class_availability.html

1 Ответ

1 голос
/ 02 октября 2019

Вы получаете «0100», потому что у вас есть два оператора print().

print $sum;
...
print $courseNum;

И поскольку между ними нет символов новой строки или другого вывода, вы получаете два значения, распечатанные рядом с каждымДругие. $sum это «0», а $courseNum это «100».

Так почему же $sum ноль? Ну, это потому, что ваше регулярное выражение не собирает данные, которые вы хотите, чтобы соответствовать. Ваше регулярное выражение выглядит следующим образом:

m/$courseNum(.+?)align="center">(\d)</

Вы ищете $courseNum, за которым следует ряд других символов, затем 'align = "center">' и затем ваша цифра. Это не работает по ряду причин.

  1. Строка "100" появляется много раз в вашем тексте. Много раз это даже не означает номер курса (например, «100%»). Возможно, вам следует искать что-то более точное (ICS $coursenum).
  2. .+? не делает то, что вы думаете, что он делает. Точка не соответствует символам новой строки, если вы не используете опцию /s в операторе сопоставления.
  3. Но даже если вы исправите эти первые две проблемы, она все равно не будет работать, так как есть ряд числовыхячейки таблицы для каждого курса, и вы ничего не делаете для того, чтобы захватить последний. Ваш текущий код получит столбец «Curr. Enrolled», а не «Seats Available».

Это нетривиальная проблема парсинга HTML. Он не должен решаться с помощью регулярных выражений (HTML никогда не должен анализироваться с помощью регулярных выражений). Вы должны взглянуть на один из модулей синтаксического анализа HTML из CPAN - думаю, я бы использовал Web :: Query .

Обновление: Пример решения с использованием Web:: Запрос:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';

use File::Basename;
use Web::Query;

my $course_num = shift
  or die 'Usage: perl ' . basename $0 . " course_number\n";

my $source = 'fa19_ics_class_availability.html';
open my $fh, '<', $source
  or die "Cannot open '$source': $!\n";

my $html = do { local $/; <$fh> };

my $count_free;

wq($html)
  # Get each table row in the table
  ->find('table.listOfClasses tr')
  ->each(sub {
      my ($i, $elem) = @_;

      my @tds;

      # Get each <td> in the <tr>
      $elem->find('td')->each(sub { push @tds, $_[1] });

      # Ignore rows that don't have 13 columns
      return if @tds != 13;
      # Ignore rows that aren't about the right course
      return if $tds[2]->text ne "ICS $course_num";

      # Add the number of available places
      $count_free += $tds[8]->text;
    });

 say $count_free;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...