我有一个在crontab中运行的Perl脚本,它生成一个包含重复条目的文件,因为在每次运行时它都会重写先前写入的信息.
我会使用一个sort -u文件,但是,我会在Perl脚本文件的末尾执行此操作.
10/10/2017 00:01:39:000;Sagitter
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
10/12/2017 00:09:00:459;Sagitter
10/13/2017 01:11:03:009;Lupus
12/13/2017 04:29:00:609;Ariet
10/11/2017 00:00:01:002;Lupus
10/12/2017 00:03:14:109;Leon
...
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/perl
# Libraries
use strict;
use warnings 'all';
%lines = ();
# Remove duplicate
open( TMP_GL_OUTPUT, '>', $OUTPUT_FILE ) or die $!;
while ( <TMP_GL_OUTPUT> ) {
$lines{$_}++;
}
open( OUTFILE, '>', $TMPOUTPUT_FILE ) or die $!;
print OUTFILE keys %lines;
close( OUTFILE );
close( TMP_GL_OUTPUT );
Run Code Online (Sandbox Code Playgroud)
我哪里错了?在shell中它比Perl感觉更短.
sort -u $TMPOUTPUT_FILE > $OUTPUT_FILE
Run Code Online (Sandbox Code Playgroud)
正如ikegamy用户建议的那样,我做如下:
move $OUTPUT_FILE, $TMPOUTPUT_FILE; # Copy file
run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE; # Remove duplicate
unlink $TMPOUTPUT_FILE;
Run Code Online (Sandbox Code Playgroud)
我想你在问为什么你的Perl程序比你的shell脚本更长.
首先,您的shell脚本与Perl程序完全不同.
Perl相当于
sort -u -- "$TMPOUTPUT_FILE" > "$OUTPUT_FILE"
Run Code Online (Sandbox Code Playgroud)
是
use IPC::Run qw( run );
run [ 'sort', '-u', '--', $TMPOUTPUT_FILE ], '>', $OUTPUT_FILE;
Run Code Online (Sandbox Code Playgroud)
(这两者之间的错误处理存在差异.)
它们的长度没有那么不同.
这带来了第二个区别.shell专门用于执行程序,但Perl是一种通用语言.如果不再是Perl,那将是令人惊讶的!
(现在尝试将Perl程序的大小与sort... 的来源进行比较)