9 ответов:
Это простое решение:
Пример 1
my $var1 = "123abc"; print $var1 + 0;результат
123Пример 2
my $var2 = "abc123"; print $var2 + 0;результат
0
Perl-это контекстный язык. Он не делает свою работу в соответствии с данными, которые вы ему даете. Вместо этого он выясняет, как обрабатывать данные на основе используемых операторов и контекста, в котором они используются. Если вы делаете номера видов вещей, вы получаете номера:
# numeric addition with strings: my $sum = '5.45' + '0.01'; # 5.46Если вы делаете строки виды вещей, вы получаете строки:
# string replication with numbers: my $string = ( 45/2 ) x 4; # "22.522.522.522.5"Perl в основном выясняет, что делать, и это в основном правильно. Другой способ сказать то же самое, что Perl заботится больше про глаголы, чем существительные.
вы пытаетесь что-то сделать, и это не работает?
Google привел меня сюда во время поиска по тому же вопросу, который задал Фил (сортировка плавает), поэтому я решил, что стоит опубликовать ответ, несмотря на то, что поток довольно старый. Я новичок в perl и все еще получаю свою голову, обернутую вокруг него, но заявление Брайана д Фоя "Perl больше заботится о глаголах, чем о существительных."выше действительно попадает в самую точку. Вам не нужно преобразовывать строки в поплавки перед применением сортировки. Вам нужно указать сортировку, чтобы отсортировать значения как числа, а не строки. то есть
my @foo = ('1.2', '3.4', '2.1', '4.6'); my @foo_sort = sort {$a <=> $b} @foo;см.http://perldoc.perl.org/functions/sort.html для более подробной информации о сортировке
Как я понимаю int () не предназначен в качестве функции "cast" для обозначения типа данных он просто используется (ab)здесь, чтобы определить контекст как арифметический. Я (ab)использовал (0+$val) в прошлом, чтобы убедиться, что $val рассматривается как число.
$var += 0вероятно, что вы хотите. Однако имейте в виду, что если $var is string не может быть преобразован в numeric, вы получите ошибку, а $var будет сброшено до 0:
my $var = 'abc123'; print "var = $var\n"; $var += 0; print "var = $var\n";журналы
var = abc123 Argument "abc123" isn't numeric in addition (+) at test.pl line 7. var = 0
Perl действительно имеет только три типа: скаляры, массивы и хэши. И даже это различие спорно. ;) Способ обработки каждой переменной зависит от того, что вы с ней делаете:
% perl -e "print 5.4 . 3.4;" 5.43.4 % perl -e "print '5.4' + '3.4';" 8.8
в сравнениях это имеет значение, если скаляр является числом строки. И это не всегда можно решить. Я могу сообщить случай, когда perl извлек поплавок в" научной " нотации и использовал тот же самый несколько строк ниже в сравнении:
use strict; .... next unless $line =~ /and your result is:\s*(.*)/; my $val = ; if ($val < 0.001) { print "this is small\n"; }и здесь
$valне было интерпретировано как числовое значение, например"2e-77"полученные от$line. Добавление 0 (или 0.0 для хороших программистов ole C) помогло.
Perl слабо типизирован и основан на контексте. Многие скаляры можно рассматривать как строки и числа, в зависимости от используемых операторов.
$a = 7*6; $b = 7x6; print "$a $b\n";
вы получаете42 777777.есть тонкая разница, однако. При чтении числовых данных из текстового файла в структуру данных, а затем просмотреть его с помощью
Data::Dumper, вы заметите, что ваши цифры указаны. Perl рассматривает их внутренне как строки.
читать:$my_hash{} = if /(.+)=(.+)\n/;.
свалка:'foo' => '42'если вы хотите некотируемые числа в дампе:
читать:$my_hash{} = +0 if /(.+)=(.+)\n/;.
свалка:'foo' => 42после
+0Perl замечает, что вы рассматривали $2 как число, потому что вы использовали числовой оператор.я заметил это, пытаясь сравнить два хэша с
Data::Dumper.
Comments