Определить пустую строку в 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";}
мы можем использовать приведенный выше код для идентификации пустой строки, а использование регулярного выражения является более эффективным. Оператор "= ~" и с использованием регулярного выражения также может быть и этой проблемой.