首页 > 解决方案 > 如何在 perl 的相同列上重写文本文件?

问题描述

我有一个在 perl 脚本中修改的 ncl 脚本,每次我运行 Perl 脚本然后在 perl 脚本中调用相同的 ncl 脚本。我注意到的是,每次我运行 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

标签: perl

解决方案


您正在为最终打印添加空格:

print $NCLSCRPT "@scrptlines\n";

当您将数组插入字符串时,每个元素都填充有空格($"变量的默认值)。因此,当您从文件中取出行并以这种方式连续插入它们时,您将添加空格。

它应该是

print $NCLSCRPT @scrptlines;

如果您从不编辑行尾,则无需担心它们。


推荐阅读