我的测试文件有“n”行,每行之间有一个 ^M,这又使其成为一个大字符串。
我正在使用的代码打开所述文件,并应解析出标题,然后解析出后续行。然后它搜索目录路径和文件名。但由于文件最终只是一个大字符串,因此它无法正常工作。
#!/usr/bin/perl
#use strict;
#use warnings;
open(DATA, "<file.txt") or die("Unable to open file");
my $search_string = "Directory Path";
my $column_search = "Filename";
my $header = <DATA>;
my @header_titles = split /\t/, $header;
my $extract_col = 0;
my $col_search = 0;
for my $header_line (@header_titles) {
last if $header_line =~ m/$search_string/;
$extract_col++;
}
for my $header_line (@header_titles) {
last if $header_line =~ m/$column_search/;
$col_search++;
}
print "Extracting column $extract_col $search_string\n";
while (my $row = <DATA>) {
last unless $row =~ /\S/;
chomp $row;
my @cells = split /\t/, $row;
$cells[74] =~ s/:/\//g;
$cells[$extract_col] = $cells[74] . $cells[$col_search];
print "$cells[$extract_col] \n";
}
Run Code Online (Sandbox Code Playgroud)
当我在vi中打开测试文件时,我使用了:
#!/usr/bin/perl
#use strict;
#use warnings;
open(DATA, "<file.txt") or die("Unable to open file");
my $search_string = "Directory Path";
my $column_search = "Filename";
my $header = <DATA>;
my @header_titles = split /\t/, $header;
my $extract_col = 0;
my $col_search = 0;
for my $header_line (@header_titles) {
last if $header_line =~ m/$search_string/;
$extract_col++;
}
for my $header_line (@header_titles) {
last if $header_line =~ m/$column_search/;
$col_search++;
}
print "Extracting column $extract_col $search_string\n";
while (my $row = <DATA>) {
last unless $row =~ /\S/;
chomp $row;
my @cells = split /\t/, $row;
$cells[74] =~ s/:/\//g;
$cells[$extract_col] = $cells[74] . $cells[$col_search];
print "$cells[$extract_col] \n";
}
Run Code Online (Sandbox Code Playgroud)
这样就删除了 ^M,但是我该如何在这个 Perl 程序中做到这一点呢?当我尝试一个测试程序并将其插入s\^M/\r/g 并写入另一个文件时,它出现了很多汉字。
如果 mac2unix 不适合您,您可以将自己的 mac2unix 编写为 Perl 单行代码:
perl -pi -e 'tr/\r/\n/' file.txt
Run Code Online (Sandbox Code Playgroud)
如果文件的大小大于虚拟内存,则可能会失败,因为它将整个文件读入内存。
为了完整起见,我们还有一个 dos2unix:
perl -pi -e 'tr/\r//d' file.txt
Run Code Online (Sandbox Code Playgroud)
和一个unix2dos:
perl -pi -e 's/\n/\r\n/g' file.txt
Run Code Online (Sandbox Code Playgroud)
在开始读取文件之前,请设置$/为"\r". 默认情况下,它设置为换行符,这对于 UNIX 样式的行结束符来说很好,对于 DOS 样式的行结束符几乎没问题,但对于您所看到的旧 Mac 样式的行结束符来说毫无用处。如果已安装,您还可以在输入文件上尝试 mac2unix。
有关更多信息,请在perlvar 联机帮助页中查找“INPUT_RECORD_SEPARATOR” 。