Хорошо, во-первых, вы, вероятно, хотели иметь $_ =~ s/\..*$//
- обратите внимание на отсутствующий s
в вашем примере. Кроме того, вы, вероятно, имеете в виду map
не grep
.
Во-вторых, это не то, что вы хотите. Это на самом деле изменяет @input
! Внутри grep
(и map
и нескольких других местах) $_
фактически имеет псевдоним для каждого значения. Таким образом, вы на самом деле меняете значение.
Также обратите внимание, что сопоставление с образцом не возвращает сопоставленное значение; он возвращает истину (если есть совпадение) или ложь (если нет). Вот и все 1, которые вы видите.
Вместо этого сделайте что-то вроде этого:
my @output = map {
(my $foo = $_) =~ s/\..*$//;
$foo;
} @input ;
Сначала копируется $_
в $foo
, а затем изменяется $foo
. Затем он возвращает измененное значение (хранится в $foo
). Вы не можете использовать return $foo
, потому что это блок, а не подпрограмма.