新型引用符

ふとしたきっかけで知ったのだけども、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';
    &amp;Jprint($str."n");
    $str = q(<tr><td>q(?)を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr);
    &amp;Jprint($str."n");
    $str = q/<tr><td>q/?/を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr/;
    &amp;Jprint($str."n");
#    $str = q[<tr><td>q[?]を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr];
#    &amp;Jprint($str."nn");
    $str = "<tr><td>"?"を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr";
    &amp;Jprint($str."n");
    $str = qq(<tr><td>qq(?)を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr);
    &amp;Jprint($str."n");
    $str = qq/<tr><td>qq/?/を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr/;
    &amp;Jprint($str."n");
#    $str = qq[<tr><td>qq[?]を使用<td>$tempを"格納"、'表示'する。<td>][)('"/\<td>$quotstr<td>$doublequotstr];
#    &amp;Jprint($str."n");

    print "</table>n</div>n";
    &amp;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";
    &amp;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";
    &amp;Jprint ("<h1>$G_title</h1><hr>n");
    &amp;printlinks;
    print "<hr></div>n";
}

sub printFooter{
    print "<div class=foot><hr>n";
    &amp;printlinks;
    print "<hr>n";
    &amp;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){ &amp;Jprint ("/n<a href="$G_linkFile">$G_titleの解説</a>n"); }
}

sub Jprint{
    if($G_Code eq $G_myCode){
        foreach (@_){ print; }
    }else{
        foreach (@_){ print &amp;Jconvert($_, $G_Code, $G_myCode); }
    }
}

sub JconvPrint{
    foreach (@_){ print &amp;Jconvert($_, $G_Code, &amp;Jgetcode($_)); }
}
comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。