Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 解析文件时,如何确定制表符是什么?_Perl_File_Parsing - Fatal编程技术网

Perl 解析文件时,如何确定制表符是什么?

Perl 解析文件时,如何确定制表符是什么?,perl,file,parsing,Perl,File,Parsing,我正在打开一个文件(用perl),我想知道如何确定制表符的外观 我知道它们在我的档案里,但我想知道怎么才能知道是什么。我知道,对于文件的输出,您可以使用\t,但对于读取文件,则不同 我也知道它是以某种制表符的形式读取的,因为我在每一行上逐字符打印出一行,并且可以很容易地看到制表符行。制表符总是\t,关于它没有更多的说明 但是,一些编辑器使用关于单个制表符应表示多少空格的约定。一般的说法是8,但人们通常指的是4,我见过它指的是3,甚至是2个空格 一些编辑器(如Komodo或Komodo Edit)

我正在打开一个文件(用perl),我想知道如何确定制表符的外观

我知道它们在我的档案里,但我想知道怎么才能知道是什么。我知道,对于文件的输出,您可以使用\t,但对于读取文件,则不同


我也知道它是以某种制表符的形式读取的,因为我在每一行上逐字符打印出一行,并且可以很容易地看到制表符行。

制表符总是
\t
,关于它没有更多的说明

但是,一些编辑器使用关于单个制表符应表示多少空格的约定。一般的说法是8,但人们通常指的是4,我见过它指的是3,甚至是2个空格

一些编辑器(如Komodo或Komodo Edit)试图变得聪明:他们读取源文件并计算前导空格和制表符的典型分布。例如,如果只有4,8,12,。。。可以看到前导空格,它可能会隐式地假定制表符应该表示4个空格。或者,如果是2,4,6,。。。如果观察到前导空格,则每个选项卡可能使用2个空格

如果我理解正确,您希望前导空格具有类似的行为

在这种情况下,您可以使用下面的代码确定最可能的制表符到空格的值。注意,这段代码不是最优的:它将忽略带有实际制表符的行,它只考虑第一个缩进级别以获得制表符缩进,以此类推。认为这只是获得良好实施的起点:

my %dist;
while (my $line = <>) {
    my ($spaces) = ($line =~ /(^ *)/);
    my $len = length($spaces);
    $dist{$len}++;
}
my @sp = sort {$a <=> $b} keys %dist;
print "Leading space distribution in file: "
    . join(",", @sp) . "\n";
if (scalar @sp >= 2) {
    print "Most likely tab setting is: ", $sp[1] - $sp[0];
}
my%dist;
while(我的$line=){
我的($spaces)=($line=~/(^*)/);
my$len=长度($spaces);
$dist{$len}++;
}
my@sp=sort{$a$b}键%dist;
打印“文件中的前导空间分布:”
. 加入(“,”,@sp)。“\n”;
如果(标量@sp>=2){
打印“最可能的选项卡设置为:”,$sp[1]-$sp[0];
}

如果按tab键,一些IDE和编辑器通常会插入四个空格而不是tab字符。实际的制表符在perl中是\t(内容取决于平台,但\t应始终表示平台的制表符)


为了确保捕获制表符和任何4个空格的组,您可以在shell中为
/\t{4}/

使用正则表达式。我的perl脚本的目的实际上是将我在代码中放入的制表符替换为4个空格。然后简单的
sed-e's/\t//g'out.txt应该可以(在这里读为4个空格),你不认为吗?内容取决于平台:真的吗?你能找到任何一个tab字符(
\t
)不是ASCII码9或ASCII码的平台吗?@mvp:我想你从来没有体验过EBCDIC的奇迹吧?在那个世界里,标签是字符5。。。通常()即使在您列出的选项中,它也取决于平台,因为U+0009并不总是表示为一个值为0x09的单字节-它是UTF16或UTF32编码中的多个字节。