如何在 perl 中的相同列上重写文本文件?
How do I rewrite a text file on the same columns in perl?
我有一个 ncl 脚本,我在 perl 脚本中修改它,每次我 运行 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
您将在最终打印中添加 spaces:
print $NCLSCRPT "@scrptlines\n";
当您将数组插入到字符串中时,每个元素都会填充一个 space($"
变量的默认值)。因此,当您从文件中获取行并以这种方式连续插入它们时,您将添加 spaces.
应该改为
print $NCLSCRPT @scrptlines;
如果您从不编辑行尾,则无需担心。
我有一个 ncl 脚本,我在 perl 脚本中修改它,每次我 运行 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
您将在最终打印中添加 spaces:
print $NCLSCRPT "@scrptlines\n";
当您将数组插入到字符串中时,每个元素都会填充一个 space($"
变量的默认值)。因此,当您从文件中获取行并以这种方式连续插入它们时,您将添加 spaces.
应该改为
print $NCLSCRPT @scrptlines;
如果您从不编辑行尾,则无需担心。