ふとしたきっかけで知ったのだけども、perlには新型引用符(?)があるらしい。なかなか面白いことを考えてくれる。
「新型引用符」というのは「()」に機能を付け加えたもののようで、「q(?)」と書くと「’?’」に、「qq(?)」と書くと「"?"」になるらしい。「q()」の中では「’」をエスケープする必要が無い。同じように「qq()」の中では「"」が文字として有効になる。
perlの「命令」というか「文法」がいまいち見えてこないけど、「q[?]」や「q/?/」でも大丈夫らしい。でも、何故一度に沢山の記号を使えるようにするのか。例えば、「qq(?)」と「qq[?]」で記号の扱い方を変えるとかすれば、もっと機能的になるのに・・・。いや、ホントは機能が違うのかもしれないけど・・・。
やはり不思議なのだが、「q(?)」の中では「()」が、「q[?]」の中では「[]」が使える。ただし、組数は等しくし、開いて閉じなければならない。どちらにしろ、エスケープは出来るので紛らわしいことはやめたほうがよさそうだ。
あと、今回は「Shift_JIS」では全部は表示できなかった。エラーの内容から考えると、文字列の中に「[」を示すコードが入っているようで「[?]」の行が実行できなくなっている。だから、「Shift_JIS版」はその部分を省いた。「表示」が文字化けしている・・・。やはり通常使うのは「EUC」の方がよさそうだ。
ついでだったので、「’?’」で格納した変数と、「"?"」で格納した変数を、引用符の中で展開したらどうなるかも調べてみた。意外なことだが、「」は「’?’」の中でも、エスケープされることがわかった。やはり「」を示すには、常にエスケープするように気をつけたほうがいいのかも。その他にも、引用符に使用している記号だけはエスケープされるようだ。使う文字列によって引用符を使い分けるようにすると、案外便利かも。
ソースコード
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
|
#!/usr/bin/perl
# 初期設定
# require Jcode;
# $JcodeVer = "Jcode $Jcode::VERSION";
# *Jgetcode = &Jcode::getcode;
# *Jconvert = &Jcode::convert;
require "../../../cgi-bin/jcode.pl";
$JcodeVer = "jcode.pl $jcode::version";
*Jgetcode = &jcode::getcode;
*Jconvert = sub { &jcode::to($_[1], $_[0], $_[2]); };
@G_styles = ('../../ipp.css','../test.css');
$G_title = 'テスト19';
$G_myCode = &Jgetcode('漢字');
$G_Code = 'jis';
$G_Charset = 'iso-2022-jp';
$G_scrName = $ENV{'SCRIPT_NAME'};
if($G_scrName =~ /ts[0-9]{4}/){
$G_scrName = $&;
$G_linkFile = "../$G_scrName.htm";
}
{
&printHeader;
print "<div class=test>n<table border=1>";
$temp = '"変数"という文字列';
$quotstr = '][)('"/\';
$doublequotstr = "][)('"/\";
$str = '<tr><td>'?'を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr';
&Jprint($str."n");
$str = q(<tr><td>q(?)を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr);
&Jprint($str."n");
$str = q/<tr><td>q/?/を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr/;
&Jprint($str."n");
# $str = q[<tr><td>q[?]を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr];
# &Jprint($str."nn");
$str = "<tr><td>"?"を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr";
&Jprint($str."n");
$str = qq(<tr><td>qq(?)を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr);
&Jprint($str."n");
$str = qq/<tr><td>qq/?/を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr/;
&Jprint($str."n");
# $str = qq[<tr><td>qq[?]を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr];
# &Jprint($str."n");
print "</table>n</div>n";
&printFooter;
exit;
}
sub printHeader{
if($G_Charset){
print "Content-type: text/html; charset=$G_Charsetnn";
}else{
print "Content-type: text/htmlnn";
}
print '<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">'."n";
print "<html lang=ja>n<head>n";
if($G_Charset){ print "<meta http-equiv="Content-Type" content="text/html; charset=$G_Charset">n"; }
print '<meta http-equiv="Content-Script-Type" content="text/javascript">',"n";
print '<meta http-equiv="Content-Style-Type" content="text/css">'."n";
&Jprint ("<title>$G_title</title>n");
foreach (@G_styles){ print "<link rel="stylesheet" type="text/css" href="$_">n"; }
print "</head>n<body>n";
print "<div class=head>n";
&Jprint ("<h1>$G_title</h1><hr>n");
&printlinks;
print "<hr></div>n";
}
sub printFooter{
print "<div class=foot><hr>n";
&printlinks;
print "<hr>n";
&Jprint("漢字コード変換 : $JcodeVer<br>n");
open(IN, '../../sig.txt');
print while (<IN>);
close(IN);
print "</div>n";
print "</body></html>n";
}
sub printlinks{
print "<a href="../../../index.htm">Home</a>n";
print "/n<a href="../../">Perl</a>n";
print "/n<a href="../">TestCGI Index</a>n";
if($G_linkFile){ &Jprint ("/n<a href="$G_linkFile">$G_titleの解説</a>n"); }
}
sub Jprint{
if($G_Code eq $G_myCode){
foreach (@_){ print; }
}else{
foreach (@_){ print &Jconvert($_, $G_Code, $G_myCode); }
}
}
sub JconvPrint{
foreach (@_){ print &Jconvert($_, $G_Code, &Jgetcode($_)); }
}
|