public class ShuffleArray {
public static void shuffleArray(int[] a) {
int n = a.length;
Random random = new Random();
random.nextInt();
for (int i = 0; i < n; i++) {
int change = i + random.nextInt(n - i);
swap(a, i, change);
}
}
private static void swap(int[] a, int i, int change) {
int helper = a[i];
a[i] = a[change];
a[change] = helper;
}
public static void main(String[] args) {
int[] a = new int[] { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1 };
shuffleArray(a);
for (int i : a) {
System.out.println(i);
}
}
}
Попытайтесь использовать прагму, открытую вместо этого:
use strict;
use warnings;
use open qw(:std :utf8);
while(<>){
my @chars = split //, $_;
print "$_" foreach(@chars);
}
Необходимо сделать это, потому что <> оператор является волшебным. Поскольку Вы знаете, что это будет читать из STDIN или из файлов в @ARGV. Чтение из STDIN не вызывает проблемы, поскольку STDIN уже открыт таким образом binmode работы хорошо над ним. Проблема при чтении из файлов в @ARGV, когда сценарий запускает и называет binmode, файлы не открыты. Это заставляет STDIN быть установленным на UTF-8, но этот канал IO не используется, когда @ARGV имеет файлы. В этом случае <> оператор открывает новый дескриптор файла для каждого файла в @ARGV. Каждый дескриптор файла сбрасывается и проигрывает, это - атрибут UTF-8. При помощи прагмы открывают Вас, вынуждают каждый новый STDIN быть в UTF-8.
Можно включить UTF8 по умолчанию с эти -C
флаг:
perl -CSD -ne 'print join("\n",split //);' utf8.txt
переключатель -CSD
включает UTF8 безусловно; если Вы будете использовать просто -C
, то это включит UTF8, только если соответствующие переменные среды (LC_ALL
, LC_TYPE
и LANG
) указывают так. См. perlrun для деталей.
Это не рекомендуется, если Вы не вызываете жемчуг непосредственно (в частности, он не мог бы работать надежно при передаче опций жемчугу от строки хижины). См. другие ответы в этом случае.
Ваш сценарий работает, если Вы делаете это:
#!/usr/bin/perl -w
binmode STDOUT, ':utf8';
while(<>){
binmode ARGV, ':utf8';
my @chars = split //, $_;
print "$_\n" foreach(@chars);
}
Волшебный дескриптор файла, что <> чтения от назван *ARGV
, и это открыто при вызове readline.
Но действительно, я - поклонник явного использования Encode::decode
и Encode::encode
в надлежащих случаях.