2015-07-12 2 views
1

У меня есть число, хранящееся в переменной Perl, и я хочу «передавать/конвертировать/сохранять» свои цифры в разных положениях массива. В качестве примера для лучшего зрения:Perl int to array

у меня есть, скажем, это число, сохраненное:

$hello = 429384 

И мне нужен новый массив с цифрами, хранящихся в нем, так:

$hello2[0] = 4 
$hello2[1] = 2 
$hello2[2] = 9 
Etc.. 

Возможно, я могу сделать это с помощью пары петель, но я хочу знать, есть ли эффективный и быстрый способ сделать это. Thx заранее!

+0

Perl массивы обычно начинаются с 0. Вы уверены, что хотите первая цифра в '$ hello2 [ 1] '? Что происходит в '$ hello2 [0]'? – cjm

+0

Да, первый из них 0, я просто указывал на метод, чтобы синтаксический анализ этого массива автоматически, а не один за другим =) – Ghost

ответ

5
my @hello = split //, $hello; 

В Perl, если вы используете номер в оператора строки, преобразование выполняется автоматически

+0

Love u bro, работал отлично! Большое спасибо! – Ghost

+0

Первым аргументом 'split' должно быть регулярное выражение, поэтому используйте' split //, $ hello', а не 'split '', $ hello'. –

+0

@ davecross Нет, это не обязательно. Пожалуйста, проверьте perldoc для вашей справки. – texasbruce

0

Использование только Regex и без использования встроенной функции:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $string=429384; 

my @numbers = $string =~ /./g; # dot matches a single character at a time 
           #and returns it 

print "@numbers \n"; 
+0

Почему вы думаете, что регулярные выражения не являются встроенной функцией? И зачем печатать пробел перед новой строкой? – Borodin

+0

Я думаю, что '= ~' больше похож на оператор, чем на функцию. Пространство не является намеренным.IMHO это ничего не влияет. –

0

это значительно быстрее, чем регулярное выражение:

$string = '1234567890'; 
    $_-=48 for @digits = unpack 'C*',$string; 

тест:

use Time::HiRes; 
$string = '1234567890'; 



$start_time = [Time::HiRes::gettimeofday()]; 
for (1.. 100000){ 
    $_-=48 for @digits= unpack 'C*',$string; 
} 
$diff = Time::HiRes::tv_interval($start_time); 
print "\n\n$diff\n"; 



$start_time = [Time::HiRes::gettimeofday()]; 
for (1.. 100000){ 
    @digits = split //, $string; 
} 
$diff = Time::HiRes::tv_interval($start_time); 
print "\n\n$diff\n"; 

выход:

0,265814

0,314735