File: logic.pl

package info (click to toggle)
libfile-slurper-perl 0.014-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 156 kB
  • sloc: perl: 354; makefile: 2
file content (88 lines) | stat: -rw-r--r-- 2,469 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#! /usr/bin/env perl

use strict;
use warnings;
use Carp 'croak';
use File::Slurp 'read_file';
use File::Slurper 'read_binary';

use Benchmark 'cmpthese';

my $filename = shift or die "No argument given";
my $count = shift || -0.5;

sub read_complicated {
	my $filename = shift;
	my $buf;

	open my $fh, '<:unix', $filename or croak "Couldn't open $filename: $!";
	my $size = -s $fh;
	my ($pos, $read) = 0;
	do {
		defined($read = read $fh, $buf, $size - $pos, $pos) or croak "Couldn't read $filename: $!";
		$pos += $read;
	} while ($read && $pos < $size);
	return $buf;
}

sub read_complicated_ref {
	my $filename = shift;
	my $buf = shift;

	open my $fh, '<:unix', $filename or croak "Couldn't open $filename: $!";
	my $size = -s $fh;
	my ($pos, $read) = 0;
	do {
		defined($read = read $fh, ${$buf}, $size - $pos, $pos) or croak "Couldn't read $filename: $!";
		$pos += $read;
	} while ($read && $pos < $size);
	return ${$buf};
}

sub read_simple {
	my $filename = shift;

	open my $fh, '<:unix', $filename or croak "Couldn't open $filename: $!";
	return do { local $/; <$fh> };
}

sub read_naive {
	my $filename = shift;

	open my $fh, '<:raw', $filename or croak "Couldn't open $filename: $!";
	return do { local $/; <$fh> };
}

sub read_sysread {
	my $filename = shift;
	my $buf;

	open my $fh, '<:unix', $filename or croak "Couldn't open $filename: $!";
	my $size = -s $fh;
	my ($pos, $read) = 0;
	do {
		defined($read = sysread $fh, $buf, $size - $pos, $pos) or croak "Couldn't read $filename: $!";
		$pos += $read;
	} while ($read && $pos < $size);
	return $buf;
}

cmpthese($count, {
	complicated => sub { read_complicated($filename) },
	ref         => sub { read_complicated_ref($filename, \my $content) },
	simple      => sub { read_simple($filename) },
	naive       => sub { read_naive($filename) },
	sysread     => sub { read_sysread($filename) },
	slurp       => sub { read_file($filename, binmode => ':raw') },
	slurper     => sub { read_binary($filename) },
});

cmpthese($count, {
	complicated => sub { my $content = read_complicated($filename) },
	simple      => sub { my $content = read_simple($filename) },
	naive       => sub { my $content = read_naive($filename) },
	sysread     => sub { my $content = read_sysread($filename) },
	ref         => sub { read_complicated_ref($filename, \my $content) },
	slurp       => sub { my $content = read_file($filename, binmode => ':raw') },
	slurper     => sub { my $content = read_binary($filename) },
});