Пожалуйста, посмотрите ниже. Файл содержит test.csvстранное поведение объявления массива в perl
aa,OPEN,TEMP1
bb,CLOSE,TEMP2
cc,OPEN,TEMP3
dd,TERMINATED,TEMP4
Код:
use Data::Dumper;
sub main {
my $file = 'test.csv';
my @lines1;
my @values;
unless (open (INPUT, $file)) {
print " files does not exist";
}
while (my $line = <INPUT>) {
@values = split /\s*,\s*/, $line;
push @lines1, \@values;
}
foreach my $rr(@lines1) {
print Dumper ($rr)."\n";
}
close INPUT;
}
main();
КОД РЕЗУЛЬТАТ:
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
$VAR1 = [
'dd',
'TERMINATED',
'TEMP4
'
];
Теперь, когда я запускаю код все, что я получаю последняя строка печатается в 4 раза. но я объявляю массив @values
внутри цикла все работает отлично. Может кто-нибудь, пожалуйста, объясните мне это странное поведение.?
Благодаря
Определение переменных в наименьшей сферы возможно, 'мои @values = разделить/\ с *, \ s * /, $ строка,' как '@ values' не должны быть видны снаружи' while' петля , и в качестве побочного эффекта вы избавляетесь от нежелательного поведения. –
Этот побочный эффект или ошибка или правильное поведение ..? что это такое? потому что я больше пишу, а не добавляю значения в массиве каждый цикл. , так что я верю, что он заполняет значения, а затем в следующий раз, когда он его перезаписывает? это правильно? – Nomad
Это правильное поведение, поскольку вы всегда ссылаетесь на ту же переменную/(расположение памяти) '@ values' array =>' print \ @values, "\ n"; ' –