Perl: перегоняем строку в массив символов
Довольно часто хочется работать со строкой как с массивом символов. Но в Perl это - две разные вещи. Как же получить из одного другое?
Чаще всего рекомендуют следующий способ:
@array = split(//, $string);
Его легко написать и понять. Действительно, если передать функции split //, undef или пустой символ в качестве разделителя, то она разобьёт строку на массив символов. Вопрос исчерпан?
Вы забываете, о каком языке мы говорим. Это Perl, а значит - есть ещё способы сделать это.
@array = unpack(“C*”, $string);
Здесь всё также понятно, просто и быстро. Но если вы - фанат регэкспов, то следующий кусочек кода вам понравится чуть больше:
while (/./g) {…}
Точка в регулярном выражении означает любой символ (кроме новой строки). Чтобы точка ловила и символы новой строки, нужно добавить опцию /g к выражению.
Внутри цикла вы можете использовать переменную $1, где будет храниться текущий символ. Это действительно удобно, потому что решает не саму проблему, а её причину, позволяя работать со строкой посимвольно. Можно также использовать функции index и substr, но я не буду приводить примеров, они похожи.
Чуть проще записать следующее:
@array = ($string =~ /./g)
Это только основные способы, их можно комбинировать для совершенной эзотерики :-)