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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
|
<?xml version="1.0" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Perl Weekly Challenge #45 Task #2, Source Dumper</title>
<link rel="stylesheet" href="/www/Perl/PWC/pwc_coloured.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:root@localhost" />
</head>
<body>
<table border="0" width="100%" cellspacing="0" cellpadding="3">
<tr><td class="_podblock_" valign="middle">
<big><strong><span class="_podblock_"> Perl Weekly Challenge #45 Task #2, Source Dumper</span></strong></big>
</td></tr>
</table>
<ul id="index">
<li><a href="#Perl-Weekly-Challenge-45-Task-2:-Source-Dumper">Perl Weekly Challenge #45 Task #2: Source Dumper</a></li>
<li><a href="#SYNOPSIS">SYNOPSIS</a></li>
<li><a href="#Definition-Task-2:-Source-Dumper">Definition Task #2: Source Dumper</a></li>
<li><a href="#Perl5">Perl5</a>
<ul>
<li><a href="#Source-Code">Source Code</a></li>
</ul>
</li>
<li><a href="#Perl6">Perl6</a></li>
<li><a href="#Python">Python</a></li>
<li><a href="#AUTHOR">AUTHOR</a></li>
</ul>
<h1 id="Perl-Weekly-Challenge-45-Task-2:-Source-Dumper">Perl Weekly Challenge #45 Task #2: Source Dumper</h1>
<p>The Source Dumper dumps the source code of itself. For my Blog of the PWC I use syntax highlighting. The perl program I use for the syntax highlighting I included in the Source Dumper of my Perl5 solution. This is a simple add-on with Text::VimColor.</p>
<p>Some highlights:</p>
<ul>
<li><p>Perl5, Perl6 and Python solution.</p>
</li>
<li><p>Syntax Highlighting with Text::VimColor.</p>
</li>
<li><p>Program name with $0, $*PROGRAM and __file__</p>
</li>
<li><p>Simple line by line file reading.</p>
</li>
</ul>
<h2> Download and References </h2>
<b>Download File:</b><a href="ch-2.pl" download> Perl5 Solution PWC #45 Task #2 ch-2.pl</a><br>
<b>Download File:</b><a href="ch-2.p6" download> Perl6 Solution PWC #45 Task #2 ch-2.p6</a><br>
<b>Download File:</b><a href="ch-2.py" download> Python Solution PWC #45 Task #2 ch-2.py</a><br>
<br>
Here I found the $*PROGRAM variable for Perl6:<br>
<a target=_blank href="https://docs.perl6.org/language/variables.html">docs.perl6.org: Variables</a><br>
<h1 id="SYNOPSIS">SYNOPSIS</h1>
<pre><code> # ./ch-2.pl - Execution of program
# ./ch-2.pl help - Help on parameters
# ./ch-2.p6 - Execution of program
# ./ch-2.py - Execution of program
# ./ch-2.pl | diff - ch-2.pl - Should result in no difference
# ./ch-2.p6 | diff - ch-2.p6
# ./ch-2.py | diff - ch-2.py
# perldoc ch-2.pod - POD</code></pre>
<h1 id="Definition-Task-2:-Source-Dumper">Definition Task #2: Source Dumper</h1>
<p>Write a script that dumps its own source code. For example, say, the script name is ch-2.pl then the following command should returns nothing.</p>
<pre><code> $ perl ch-2.pl | diff - ch-2.pl</code></pre>
<h1 id="Perl5">Perl5</h1>
<p>The printing of the Source Code is done with <code>open(IN,$0)</code> the file, a while loop <code>while(IN) { print; }</code> together with print and to <code>close</code> the file. Here the program name is in var <code>$0</code>.</p>
<p>The biggest part of the code is not needed for the PWC. It is a Source Dumper in HTML with Syntax Highlighting. This is done with the module <code>Text::VimColor</code> rather easy. You can print a full HTML page or only the source code part of the HTML. Some extra code is spent for the line numbers. Allthough <code>Text::VimColor</code> has an option for line numbers, it did not work. So I added the line numbers for myself.</p>
<h2 id="Source-Code">Source Code</h2>
<p>This is the code part needed for PWC, like described above:</p>
<pre><code> 35 open(IN,$0) or die "Cant open $0\n";
36 while(<IN>) { print; }
37 close IN;</code></pre>
<p>Some Highlights are:</p>
<ul>
<li><p><code>Text::VimColor</code> for Synthax Highlighting.</p>
</li>
<li><p><code>$0</code> for the program name,</p>
</li>
<li><p><code>while(IN)</code> for the loop,</p>
</li>
</ul>
<table class=code><tr><td class=code>
<pre class=code><div class=t> Perl5 </div>
1 <span class="synPreProc">#!/usr/bin/perl</span>
2
3 <span class="synStatement">use strict</span>;
4 <span class="synStatement">use warnings</span>;
5 <span class="synStatement">use </span>Text::VimColor;
6
7 <span class="synStatement">if</span>(<span class="synIdentifier">$ARGV[</span><span class="synConstant">0</span><span class="synIdentifier">]</span> <span class="synStatement">and</span> <span class="synIdentifier">$ARGV[</span><span class="synConstant">0</span><span class="synIdentifier">]</span> <span class="synStatement">eq</span> <span class="synConstant">"help"</span>) {
8 <span class="synStatement">print</span> <span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synIdentifier">$0</span><span class="synConstant"> - PWC #45 Task #2: Source Dumper</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
9 <span class="synStatement">print</span> <span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
10 <span class="synStatement">print</span> <span class="synConstant">" This source code dumper dumps its own source code, but also the </span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
11 <span class="synStatement">print</span> <span class="synConstant">" source code of other files with syntax highlighting using Text::VimColor.</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
12 <span class="synStatement">print</span> <span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
13 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl [<command|file>] [<full>]</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
14 <span class="synStatement">print</span> <span class="synConstant">" command - help|high</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
15 <span class="synStatement">print</span> <span class="synConstant">" file - filename of file to dump.</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
16 <span class="synStatement">print</span> <span class="synConstant">" full - dump full html page not only source code.</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
17 <span class="synStatement">print</span> <span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
18 <span class="synStatement">print</span> <span class="synConstant">" Examples:</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
19 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl - Dumps own source code</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
20 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl help - This Usage information</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
21 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl high - Syntax high for ch-2.pl</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
22 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl ch-1.pl - Syntax high for ch-1.pl</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
23 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl high 1 - Syntax high for ch-2.pl in full html page.</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
24 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl ch-1.pl 1 - Syntax high for ch-1.pl in full html page.</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
25 <span class="synStatement">print</span> <span class="synConstant">" ./ch-2.pl | diff - ch-2.pl - PWC 45 Task #2</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
26 <span class="synStatement">print</span> <span class="synConstant">"</span><span class="synSpecial">\n</span><span class="synConstant">"</span>;
27 }
28 <span class="synStatement">elsif</span>(<span class="synIdentifier">$ARGV[</span><span class="synConstant">0</span><span class="synIdentifier">]</span> <span class="synStatement">and</span> <span class="synIdentifier">$ARGV[</span><span class="synConstant">0</span><span class="synIdentifier">]</span> <span
|