Вот один из способов сделать это, для простоты предположим, что вы просто хотите распечатать объекты по порядку:
# lets read all the data into a big 2d array
buffer = []
for row in readinput:
values = [row[0], row[1], row[2], row[3]]
buffer.append(values)
# what you have in your code
for i in range(len(buffer)):
for j in range(len(buffer[0])):
print buffer[i][j]
# this is called a transpose; we have buffer[i][j] to read row then column,
# switch i and j around to do the opposite
for i in range(len(buffer[0])):
for j in range(len(buffer)):
print buffer[j][i]
Так как вам нужен массив для передачи в writer.writerow
, вы можете сделать это
for i in range(len(buffer[0])):
writer.writerow([buffer[j][i] for j in range(len(buffer))])
Двойные кавычки используют расширение переменных. Одиночные кавычки не могут
В строке с двойными кавычками вам нужно экранировать определенные символы, чтобы они не интерпретировались по-разному. В строке в одинарных кавычках вы этого не делаете (за исключением обратной косой черты, если это последний символ в строке)
my $var1 = 'Hello';
my $var2 = "$var1";
my $var3 = '$var1';
print $var2;
print "\n";
print $var3;
print "\n";
Будет выведено
Hello
$var1
Perl Monks имеет довольно хорошее объяснение этого здесь
'не разрешает переменные, а экранирование
"разрешает переменные и escape-символы.
Если вы хотите сохранить свой символ \ в строке в $ var2, используйте" \\ ("
Если вы собираетесь создавать строки регулярных выражений, вам действительно следует использовать qr // подобный кавычкам оператор :
my $matchStr = "(";
my $var1 = qr/\(/;
my $res1 = ($matchStr =~ m/$var1/);
Он создает скомпилированное регулярное выражение, которое намного быстрее чем просто использовать переменную, содержащую строку. Он также вернет строку, если не используется в контексте регулярного выражения, поэтому вы можете сказать такие вещи, как
print "$var1\n"; #prints (?-xism:\()
Двойные кавычки интерпретируют, а одинарные кавычки - нет
Perl принимает одинарные кавычки строки "как есть" и интерполируют строки в двойных кавычках. Интерполировать означает, что он заменяет переменные значениями переменных, а также понимает экранированные символы. Итак, ваш "\ (" интерпретируется как '(', а ваше регулярное выражение становится m / (/, вот почему Perl жалуется.
"" Поддерживает интерполяцию переменных и экранирование. поэтому внутри "\ ("
\
экранирует (
Где as "'тоже не поддерживает. Итак, ' \ ('
буквально \ (