Perl 创建的文本文件是否有行长度限制?

7
在编写Perl脚本时,我需要在文件的一行中用逗号分隔符写入用户名称。因此,我想知道.txt文件中行的最大大小是否受限制。

1
你希望创建什么样的文件大小? - brian d foy
7个回答

14

文本文件就像其他文件一样,换行符也像其他字符一样,因此只适用通常的文件大小限制(老的文件系统有4GB大小限制,文件必须符合磁盘容量等要求)。

只要你不逐行读取它,读写文本文件时通常不会遇到任何问题——否则可能会出现内存耗尽或缓冲区溢出等问题。这可能会发生在任何文本编辑器或文本处理程序中(如sed或awk),因为在这些程序中,与操作系统内核不同的是,每行都很重要。

建议将每个用户放在一行上,因为这样更自然易读,并且在使用外部程序处理文件时,错误率更低。


至少kwrite和vi不会受到行大小的影响(在一个4Mb单行XML文件上进行了测试)。 - Cem Kalyoncu
肯定有限制。它必须适合磁盘,如果你按行读取它,那么它必须适合内存。除此之外,你可能需要大文件支持来处理超过4G的文件。 - brian d foy
@brian d foy:既然您在这方面更有经验,超过SO,我遵循您的建议,扮演明显的队长,所以现在我的帖子说,磁盘上的文件不应超过该磁盘的大小。 唉。 - P Shved
2
没有什么是显而易见的。你可能能够在Perl中创建一个字符串,它无法保存到你的完整磁盘中,但你可以将其适应程序内存,而且你可能没有足够的程序内存来一次性读取整个文件。这些都是你在处理非常大的字符串和文件时必须处理的真正问题,但大多数人从未考虑过它们。 - brian d foy
@brian d foy:好的,你说了很多每个人都应该记住的正确事情。但是你有没有注意到话题已经从“换行符和操作系统”变成了“处理大文件”?你确定这是正确的方式吗? - P Shved
我确定这是正确的方式吗?如果你在谈论行,可以看看我的答案。 - brian d foy

5

你唯一需要担心的是你能够创建和读取的文件大小。

计算机并不知道什么是行,这只是文件中字节的解释。我们决定某些字符序列标志着行的结束,然后告诉程序从文件中获取内容直到遇到该序列为止。对我们来说,那就是一行。

例如,你可以定义一个以逗号结尾的文本文件行:

 $/ = ',';

 while( <DATA> )
    {
    chomp;
    print "Line is: $_\n";
    }

 __DATA__
 a,b,c,d,e,f,g

尽管看起来我在__DATA__下面只有一行,但这是因为我们习惯了书籍的格式。计算机不读书籍。相反,这个程序认为逗号之间的所有内容都是一行:
Line is: a
Line is: b
Line is: c
Line is: d
Line is: e
Line is: f
Line is: g

3

除了您的文件系统,最可能是2TB或其他大小限制外,没有大小限制。


3

不,除非您达到任何文件大小限制,否则没有这样的限制。


2

我在Kwrite中遇到了一个大约1M字符长的行的问题。

虽然理论上没有限制,但如果您要处理文件,您必须将该行进行换行以适应显示宽度。每次编辑时,都会执行许多计算,可能涉及交换内存。这使得编辑很笨拙。长行可能非常不方便。


1
在一些旧的Unix系统上,一些文本工具(例如join、sort甚至是一些旧版awk)有最大行长度的限制。我认为这是工具的限制而不是操作系统的限制。据我所知,GNU工具没有这样的限制,因此Linux从来没有这个问题。

我曾经在旧版本的IRIX和AIX上遇到过这个问题。然后我在我的主目录中安装了GNU textutils(未合并到coreutils),这解决了问题。 - user172818

-1

文件大小取决于您操作系统的文件系统。工具本身没有限制(至少我到目前为止还没有见过...)


一些工具存在限制,因为它们使用四字节整数地址空间,这就是为什么某些工具支持大文件的原因。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接