2017-06-19 18 views
-1

我试图在保留整个单词的同时将文件的每一行缩短为96个字符。如果一行字符小于或等于96个字符,我不想对该行做任何事情。如果它超过96个字符,我希望它在保留整个单词的同时将其缩减到最接近的96个字符。当我运行这段代码时,我得到一个空白文件。截取文件中的所有行,同时保留整个单词

use Text::Autoformat; 

use strict; 
use warnings; 

#open the file 
my $filename = $ARGV[0]; # store the 1st argument into the variable 
open my $file, '<', $filename; 
open my $fileout, '>>', $filename.96; 

my @file = <$file>; #each line of the file into an array 

while (my $line = <$file>) { 
    chomp $line; 
    foreach (@file) { 
####### 
sub truncate($$) { 
    my ($line, $max) = @_; 

    # always do nothing if already short enough 
    (length($line) <= $max) and return $line; 

    # forced to chop a word anyway 
    if ($line =~ /\s/) { 
     return substr($line, 0, $max); 
    } 
    # otherwise truncate on word boundary 
    $line =~ s/\S+$// and return $line; 

    die; # unreachable 
} 
####### 

my $truncated = &truncate($line,96); 

print $fileout "$truncated\n"; 

    } 
}  
close($file); 
close($fileout); 
+0

为什么使用Text :: Autoformat;?你的代码不使用它。你想用它吗? – toolic

+0

[Text :: Wrap](http://search.cpan.org/perldoc?Text::Wrap) – ikegami

回答

3

您没有输出,因为您没有输入。

1. my @file = <$file>; #each line of the file into an array 
2. while (my $line = <$file>) { ... 

<$file>操作线1是在列表环境“消耗”所有的输入,并将其装入@file。第2行中的<$file>操作没有更多输入可供读取,因此while循环不会执行。

你要么想从文件句柄

# don't call @file = <$file> 
while (my $line = <$file>) { 
    chomp $line; 
    my $truncated = &truncate($line, 96); 
    ... 
} 

还是从文件内容的阵列读取流

my @file = <$file>; 
foreach my $line (@file) { 
    chomp $line; 
    my $truncated = &truncate($line, 96); 
    ... 
} 

如果输入很大,前者格式具有的只是加载的优势一次一条线进入内存。

+2

由于'truncate'是一个perl内建函数,'&sigil'是许多方法之一(因为它是Perl)抑制'Ambiguous call resolved CORE :: truncate ...'消息。 OP特此警告[避免使用'&'sigil](https://metacpan.org/pod/Perl::Critic::Policy::Subroutines::ProhibitAmpersandSigils), [谨慎使用原型](https:/ /metacpan.org/pod/Perl::Critic::Policy::Subroutines::ProhibitSubroutinePrototypes)和[不使用与内置Perl函数相同的子例程名称](https://metacpan.org/pod/Perl ::评论家::策略::子程序:: ProhibitBuiltinHomonyms)。 – mob

相关问题