Как переписать текстовый файл с теми же столбцами в Perl?

avatar
Zilore Mumba
8 августа 2021 в 20:05
70
1
-2

У меня есть сценарий ncl, который я модифицирую внутри сценария Perl, каждый раз, когда я запускаю сценарий Perl, а затем вызываю тот же сценарий ncl внутри сценария Perl. Я заметил, что каждый раз, когда я запускаю perl-скрипт, строки в ncl-скрипте постепенно переписываются вправо. Интересно, как далеко они уйдут вправо и будет ли работать скрипт ncl, если двигаться очень далеко вправо. Мне интересно, можно ли указать столбец, с которого начинать запись. Я понятия не имею, есть ли решение для этого, кроме ручного возврата строк назад. Ниже приведены изменения, внесенные мной в скрипт.

open($NCLSCRPT, " < /home/zmumba/DA/TMINTMAX/Scripts/10_PlotT2mMinMax.ncl") || die "open $NCLSCRPT: failed $! ($^E)";
@scrptlines=<$NCLSCRPT>;
foreach $scrptlines (@scrptlines) {
  if ($scrptlines =~ /(^|\s+)a = addfile/) {
    $scrptlines =~ s/\w+\.nc/Tmin.nc/g;
  }
  if ($scrptlines =~ /wks = gsn_open_wks/) {
    $scrptlines =~ s/\w+_\d{2}/Tmin_$day/g;
  }
  $scrptlines =~ s/\w+ Temperature/Minimum Temperature/g;

  if ($scrptlines =~ /Valid on/) {
    $scrptlines =~ s/$valdate/${day}\/${month}\/${year}/g;
  }
  if ($scrptlines =~ /From 00z on/) {
    $scrptlines =~ s/$wrffcr/T\+00H/g;
    $scrptlines =~ s/$valdate/${day}\/${month}\/${year}/g;
  }
}

close $NCLSCRPT;
open($NCLSCRPT, " > /home/zmumba/DA/TMINTMAX/Scripts/10_PlotT2mMinMax.ncl") || die "open $NCLSCRPT: failed $! ($^E)";
print $NCLSCRPT "@scrptlines\n";
close $NCLSCRPT;

Чтобы отдать должное, я добавляю часть текстового файла, который я обрабатываю по запросу @Håkon Hægland. В противном случае проблема решена.

begin
;Open input file.
;************************
 DATADir = "./"

 a = addfile(DATADir+"Tmax.nc","r")

 T = wrf_user_getvar(a,"T2",0)
 T = T-273.15
 wrf_smooth_2d( T, 3 )             ; smooth T
 ;printVarSummary(T)
 ;exit

 lat2d    = a->XLAT(:,:)
 lon2d    = a->XLONG(:,:)

 lat      = lat2d(:,0)           ; create classic 1D coordinate arrays
 lon      = lon2d(0,:)
 lat@units= "degrees_north"
 lon@units= "degrees_east"
 lat!0    = "lat"
 lon!0    = "lon"
 lat&lat  =  lat
Источник
zdim
8 августа 2021 в 20:22
0

Подстановки регулярных выражений в принципе могут добавлять пробелы в начало каждой строки, но я этого не вижу. Единственная такая возможность в показанном коде будет в переменной $day -- если в ее начале есть пробел (или несколько) (чего в любом случае не должно быть), и если $validate (которую он заменяет) стоит в начале своей строки. Но это не будет на всех строках...

Håkon Hægland
8 августа 2021 в 20:25
2

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

Ответы (1)

avatar
TLP
8 августа 2021 в 21:47
1

Вы добавляете пробелы в окончательный вариант печати:

print $NCLSCRPT "@scrptlines\n";

При интерполяции массива в строку каждый элемент дополняется пробелом (значение по умолчанию для переменной $"). Таким образом, когда вы берете строки из файла и непрерывно интерполируете их таким образом, вы добавляете пробелы.

Вместо этого должно быть

print $NCLSCRPT @scrptlines;

Если вы никогда не редактируете окончания строк, вам не нужно о них беспокоиться.