Определить пустую строку в Perl

Вероятно, это простое решение, но я не могу понять это. Я ищу:

  • взять CSV файл в массив
  • цикл через массив и разделение полей на переменные
  • , если поле массива пуст, установите переменную в "N/A"

Примечание. Он устанавливает только $variable в "N/A", что я не могу работать.

Например:

foreach $var (@list) {

($name,$date,$size, etc...)=split(/,\"/,$var);

}

Как бы установить $date в "N/A", если поле в массиве пуст?

чтобы произвести:

$name = Jim
$date = N/A
$size = small

Надеюсь, это имеет смысл и легко исправить. -Спасибо

Ответы

Ответ 1

Предполагая, что переменная $date равна undefined, когда "empty":

if (!defined($date)) {
  $date = 'N/A';
}

Или более кратко:

$date //= 'N/A';

Или, если это действительно пустая строка, т.е. $date = ''; (это также будет работать в случае, когда $date - undefined, но вы не хотите использовать это, если хотите определить случай где undefined):

if ($date eq '') {
  $date = 'N/A';
}

Или более кратко (обратите внимание, что это также установит $date в N/A, если $date - '0' из-за слабого ввода текста в Perl):

$date ||= 'N/A';

Ответ 2

  • Что касается вашей третьей точки и фактического вопроса: проверить пустоту:

    • Для пустой строки вы можете либо выполнить вышеупомянутый eq "", либо проверить длину строки: $var = "N/A" unless length($var);;

    • Для undefined пустой строки в Perl 5.10 вы можете использовать оператор "defined-or" (//) для выполнения короткой версии: $var = "N/A" unless length($var // '');

    • В Perl до 5.10, где "defined-or" недоступно, вам нужно будет указать определенную проверку: $var = "N/A" unless defined $var && length($var);

    • ... или вы можете просто перестать заботиться о предупреждениях undefined, отключив их (h/t brian d foy):

      no warnings 'uninitialized';
      $_ = "N/A" unless length($_) foreach ($name,$date,$size, etc...);
      use warnings 'uninitialized'; # Always turn back on.
      
  • Однако учтите, что вы также должны рассмотреть другой подход к первым двум пунктам. Внедрение собственного анализатора CSV, который на 100% правильный, не является тривиальным - например, ваш образец кода будет разбит, если какое-либо из полей содержит двойную кавычку.

    Вместо этого вы всегда должны использовать один из стандартных парсеров Perl CSV, например Text::CSV_XS.

Ответ 3

$name = "N/A" if (!defined($name) || ($name eq ""))
$date = "N/A" if (!defined($date) || ($date eq ""))
$size = "N/A" if (!defined($size) || ($size eq ""))

Убедитесь, что вы используете сравнение строк для сравнения строк:)

Ответ 4

Каким будет вход, если дата отсутствует? Если вход: somename, 200 (где 200 - размер), то дата будет установлена ​​как 200 справа?

Если вход подобен этому SomeName, 200

где 200 - размер, а поскольку дата недоступна, она установлена ​​в пустую. Затем вы можете сделать простой if-check:

if($date eq '')
{
  $date = "NA";
}

Примечание. Будет определена дата date, она будет просто пуста

Ответ 5

if ($date eq '') { print "STRING IS EMPTY\n" } else { Print "STRING IS NOT EMPTY\n";}

мы можем использовать приведенный выше код для идентификации пустой строки, а использование регулярного выражения является более эффективным. Оператор "= ~" и с использованием регулярного выражения также может быть и этой проблемой.