($dummy, $class) = split;
Split возвращает массив значений. Первое помещается в $dummy
, второе - в $class
, и любые дальнейшие значения игнорируются. Первый аргумент, скорее всего, называется dummy, потому что автор планирует игнорировать это значение. Лучший вариант - использовать undef для
игнорировать возвращенную запись: ( undef, $class ) = split;
Perldoc может показать вам, как работает функция разделения. При вызове без аргументов функция split будет работать против $_
и будет разделяться пробелами. $_
- это переменная по умолчанию в perl, воспринимайте ее как подразумеваемое «это», как определено контекстом.
Использование подразумеваемого $ _ может сделать короткий код более кратким, но его использование в больших блоках является плохой формой. Вы не хотите, чтобы читатель запутался в том, с каким «этим» вы хотите работать.
split ; # split it
for (@list) { foo($_) } # look at each element of list, foo it.
@new = map { $_ + 2 } @list ;# look at each element of list,
# add 2 to it, put it in new list
while(<>){ foo($_)} # grab each line of input, foo it.
perldoc -f split
Если EXPR опущен, разбивает строку $ _. Если PATTERN также опущен, разбивается на
пробел (после пропуска любого начального пробела). Все, что соответствует ШАБЛОНУ
считается разделителем полей. (Обратите внимание, что разделитель может
быть длиннее одного символа.)
Я большой поклонник троичного оператора ? :
для установки строковых значений и проталкивания логики в блоки и подпрограммы.
my $Truthsity = 9999
my $Falsity = 2134123
print test_truthsity( $Truthsity, $Falsity, $_ );
sub test_truthsity {
my ($truthsity, $falsity, $line ) = @_;
my $newClass = $truthsity > $falsity ? 'truth' : 'lie';
my (undef, $class) = split /\s+/, $line ;
my $output = $class eq $newClass ? 'correct'
: $class eq 'true' ? 'false neg'
: 'false pos';
return $output;
}
В этой версии может быть небольшая ошибка. split
без аргументов - это не то же самое, что split(/\s+/, $_)
, они ведут себя иначе, если строка начинается с пробелов. В полностью определенном разбиении возвращаются пустые ведущие поля. split
без аргументов отбрасывает начальные пробелы.
$_ = " ab cd";
my @a = split # @a contains ( 'ab', 'cd' );
my @b = split /\s+/, $_; # @b contains ( '', 'ab', 'cd')