Определить пустую строку в Perl - PullRequest
14 голосов
/ 20 декабря 2010

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

  • взять 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

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

Ответы [ 5 ]

24 голосов
/ 20 декабря 2010

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

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

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

$date //= 'N/A';

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

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

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

$date ||= 'N/A';
6 голосов
/ 20 декабря 2010
  1. Насколько ваша третья точка пули и актуальный вопрос: проверить на пустоту:

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

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

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

    • ... или вы можете просто перестать заботиться о неопределенных предупреждениях, отключив их (ч / б Брайан Д. Фой):

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

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

3 голосов
/ 20 декабря 2010
$name = "N/A" if (!defined($name) || ($name eq ""))
$date = "N/A" if (!defined($date) || ($date eq ""))
$size = "N/A" if (!defined($size) || ($size eq ""))

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

2 голосов
/ 20 декабря 2010

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

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

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

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

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

1 голос
/ 18 июля 2016
if ($date eq '') { print "STRING IS EMPTY\n" } else { Print "STRING IS NOT EMPTY\n";}

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

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