Tag: perl javascript php ヒアドキュメント bash jquery 正規表現

スクリプト言語メモ

概要

 Perl,JavaScript,PHP,SQLなどスクリプト言語などに関してのメモ。


Web上の参考情報

::http://caniuse.com/
::https://developer.mozilla.org/ja/

初心者向けプログラム講習

::http://dotinstall.com/
:::ドットインストール - 3分動画でマスターする初心者向けプログラミング学習サイト


Perl,PHP,JavaScriptの文法の相違について

 色々やって混乱しているのでちょっとだけ整理。VBAはインタープリター?Perlも中間言語にしていたような、いなかったような?

内容PerlPHPJavaScriptVBA
配列@変数名$変数名変数名変数名
配列の各要素$変数名[配列番号]$変数名[配列番号]変数名[配列番号]変数名(要素番号)
連想配列%変数名$変数名変数名
連想配列の各要素$変数名{'キー'}$変数名['キー']変数名["要素名"]
変数名の大文字小文字区別区別区別無視
関数名の大文字小文字区別無視区別無視

※ 一部の文字はWikiの関係で半角で記述すべきものを全角にしています。>>

変数の有無(内容が設定されているか)確認

  • Perl: defined 変数名
  • PHP: isset(変数); ・・・ 例) if (isset($name)) { print "存在"; }
  • JavaScript: typeof(変数名)で調べる・・・例) if (typeof(myName) == "undefined") { print "存在しない"; }


配列変数の定義の一例

言語記述
Perlmy @arrayName = (11,22,33,44,55);
PHP$arrayName = array(123,456, 789);
JavaScriptarrayName = new Array("var1", "var2", "var3");


連想配列の宣言or定義

  • PHP
    $変数名 = array("キー1" => "値1", "キー2" => "値2" ...);
    PHP 5.4からは、次の様にも記述可能
    $変数名 = ["キー1" => "値1", "キー2" => "値2" ...];
    ※キーは数字または文字、値は任意の型が可能
  • JavaScript
    var 変数名={"キー1":"値1","キー2":値2 ... };




内容PerlPHPJavaScriptVBA
配列の要素数$変数=@配列名count(配列名)配列名.length参考:UBound(変数)
最後の添え字$#配列名UBound(変数)
配列先頭に要素追加unshift(@配列変数,データ)array_unshift($変数名,追加データ)配列名.unshift(データ)
配列先頭に要素追加push(@配列変数,データ)$配列名[]=データ配列名.push(データ)
タブ記号で分割split(/\t/, $変数)split("\t",$変数)変数.split("\t")配列変数 = Split(タブ入り文字変数, vbTab)
コメント# 他// 他// 他' シングルコーテーション


文字列処理

内容PerlPHPJavaScriptVBA
文字列の長さlength($string)strlen($string)string.lengthLen(変数)
文字列の置換 str_replace(置換前,置換後, $string)string.replace(対象文字列,置換後文字列)
対象文字列で/\s+/gなどのように正規表現が指定可
末尾改行削除chomprtrimstring.replace(/\n+$/g,'')
文字列の一部を取り出すsubstr($string, $start, $len)substr($string,$start,$len)string.substr(start,len)Mid(文字変数, 桁位置, 長さ)
文字列を分割split(正規表現,$string)explode($delimiter,$string)string.split(delimiter)Split(文字列,分割する文字)
文字列配列を結合$kekka=join($spr, @strs)$kekka=join($spr, $strs)文字列変数名=配列変数名.join('結合時挿入文字')
文字列を検索index($string, $word)strpos($string, $word)string.indexOfInStr(検索開始位置, 文字列変数, 検索文字)
正規表現$str="1234test";
$str =~ /^(\d+)$/;
 :
preg_match
など
var regex = /^(\d+)$/;
var s = "1234test";
var result = regex.exec(s);
 :
VBSが使えると連携できる?
URL等のエンコードunpackなどの利用$kekka=urlencode($string)encodeURI(string)
encodeURIComponent(string)
URL等のデコードpack等の利用$kekka=urldecode($encodestring)decodeURIComponent(string)
decodeURI(string)
出来ない文字があるとエラー終了

※ chompは、PerlのINPUT_RECORD_SEPARATORとして設定されている文字を取り除く。フィルの文字コードなどによっては、この辺を意識しないと動作が思いもよらないものとなります。

※ JavaScriptの正規表現で、単に一致するかの確認の場合は、execよりtestの方が、戻り値がtrueかfalseになるので使い勝手が良い。


配列変数関係の処理

内容PerlPHPJavaScriptVBA
配列変数のソート@変数名 = sort @変数名;
$変数名 = sort($変数名);
変数名=変数名.sort;
配列変数の逆順ソート@変数名 = reverse @変数名;$変数名 = rsort($変数名);
変数名=変数名.reverse;
文字列の繰り返し$変数名 = "文字列" x 回数;$変数名=str_repeat('文字列', 回数);
存在有無確認--boolean変数 = in_array(検索する文字など,配列変数);----
検索し要素番号取得--変数 = array_search(検索する文字など,配列変数);配列変数.indexOf(検索する文字など,スタートする位置番号);--

※ 逆順ソートは値に応じて並び替える場合と、入っている順を反対にする場合とあります。
※ JavaScriptの配列のindexOfは、IEのバージョンによってはサポートしない(古いものがサポート外)でエラーとなります。ECMAScript5に対応しているブラウザでは利用出来るようです。


内容PerlPHPJavaScriptVBA
文字列を数値に変換$val=$str+0;$val=intval($str);num=parseInt(str);Val(文字列)
数値を文字列に変換$str=$val."";$str=strval($val);str=num + "";Str(数値)


内容PerlPHPJavaScriptVBA
16進数表記0xff
0x12ef
0xff
0x12ef
0xFFFF


内容PostgreSQL
コメント-- コメント
文字列の長さlength(string)
文字列の一部を取り出すsubstring('sample' from 2 for 3) → 'amp'
文字列を検索position('pl' in 'Sample') → 4
文字列の連続repeat('st', 3) → 'ststst'
型キャスト数値など::numeric


  • 文字列の桁の指定
    • Perl,PHP,JavaScript: 1文字目は0
    • VBA: 1文字目が1
  • 数値を文字列に変換
    • PHPのintvalはオプションを追加すると2進数,8進数,16進数に変換可能。
    • JavaScriptでもPerl同じような変換が可能。num = str + 0;
    • VBAのStrでは、数値が正の数の時に頭に符号をつける為の空白が入る。CStrだと入らない。


  • 正規表現
    • PHP,JavaScriptでは他にも記述方法がある。PHPはpreg_matchなどが利用しやすいかな。
  • VBA
    • 前後の空白をカット: Trim(文字変数)
    • 正規表現に比べると機能は劣るが、Like演算子を使うとワイルドカードなどが使える



正規表現

Perl

  • マッチ: $str =~ /パターン/オプション;
  • 置換: $str =~ s/パターン/オプション;

PHP

  • マッチ: preg_match('パターン', $str);
  • 置換: preg_replace('パターン', '置き換える文字', $str);

パターンの部分は'/abc/'とか'/^xyx/'・・・などとなる。スラッシュを忘れない様にする。

JavaScript

  • execの他に、使い方が異なるが、matchなどがある。正規表現の部分は文字列では無いので
    ○ regex = /^m_\d+_(1|2|7|8)\D*/;
    X regex = '/^m_\d+_(1|2|7|8)\D*/';
    などとしてシングルコーテーションなどで囲まない事。


外部リンク

PHP, Perl, Python, Ruby, Smalltalk の基本文法一覧表

http://hyperpolyglot.wikidot.com/scripting

Bash, Tcl, Lua, Javascript の基本文法一覧表

http://hyperpolyglot.wikidot.com/small


ヒアドキュメント

 BASH(ボーンシェル)、Perl、PHPなどではヒアドキュメントの構文が使えます。スクリプト内で複数行の文字列を変数に代入、表示、実行する時に便利です。スクリプトの種類により微妙に異なるので混同して文法エラーを起こすので簡単に整理。
(2012-01-08)

BASH

メールの送信

  • スクリプトからsendmailでメール送信? より
    cat <<EOM | /usr/sbin/sendmail -t -i -f "sample_err_kanri@oi21.com"
    From: sample_from@eigyou.0258.net
    To: sample_to@iscb.net
    Subject: test mail
     
    This is contents!
     
    next 4lines are japanease.
    タイトルの日本語表示も含めて、送信するデータは、
    適宜文字コード変換したり、エンコードが必要。
    適切に処理しないと、メールクライアントによっては
    文字化けします。
     
    --------
    isao
     
    EOM

sqlの実行

  • シェルでのSQL発行例? より
    psql -U postgres sample01 <<EOSQL | mail -s "$TITLE" $MAIL
    select to_char(hiduke, 'hh24'), count(*),repeat('*',count(*)/$GRAPHRATE)
     from u_denpyo
        where hiduke between
                ('$TODAY'||' 00:00:00')::timestamp - interval '1 day'
              and ('$TODAY'||' 23:59:59')::timestamp - interval '1 day'
        group by to_char(hiduke, 'hh24');"
    EOSQL

sqlの実行内容をメール送信

$ psql -U postgres ishimarudb <<EOSQL
> \d
> EOSQL
                  リレーションの一覧
 スキーマ |        名前        |     型     |  所有者
----------+--------------------+------------+----------
 public   | hanbai_meisai      | テーブル   | postgres
 public   | kokyaku_daichou    | テーブル   | postgres
 public   | syouhin_daichou    | テーブル   | postgres
 public   | test_sirial        | テーブル   | isao
 public   | test_sirial_id_seq | シーケンス | isao
(5 行)

の1行目にパイプでmailコマンドを次のように使えば、

$ psql -U postgres ishimarudb <<EOSQL | mail -s "ishimarudb" sample@oi21.org
\d
EOSQL

結果は、そこでは表示されませんが、sample@oi21.org に次の結果の内容が送信されます。

                  リレーションの一覧
 スキーマ |        名前        |     型     |  所有者
----------+--------------------+------------+----------
 public   | hanbai_meisai      | テーブル   | postgres
 public   | kokyaku_daichou    | テーブル   | postgres
 public   | syouhin_daichou    | テーブル   | postgres
 public   | test_sirial        | テーブル   | isao
 public   | test_sirial_id_seq | シーケンス | isao
(5 行)


Perl

print <<'EOMSG';
ここから上の「EOMSG」の直前までがprintで表示される内容となります。
ここは2行目です。ヒアドキュメントの終わりを示す文字「EOMSG」は
任意の文字に変更できますが、途中に含めても終了の文字としては
判断されません。また、シングルコーテーション、ダブルコーテーションで
は変数の展開が行われるか否かの違いが通常の文字列と同様にあります。
EOMSG


PHP

選択リストを表示

echo  <<< EOMSG
<select name="test">
<option value="1">1月</option>
<option value="2">2月</option>
<option value="3">3月</option>
<option value="4">4月</option>
<option value="5">5月</option>
<option value="6">6月</option>
<option value="7">7月</option>
<option value="8">8月</option>
<option value="9">9月</option>
<option value="10">10月</option>
<option value="11">11月</option>
<option value="12">12月</option>
</select>
EOMSG;


VBA

MsgBoxでのメッセージ改行

  • 2012-02-06
     シンプルなメッセージでも改行して表示にちょっとした配慮を行うと見やすさが格段に向上します。ExcelのVBAでは、m
    MsgBox "エラーが次の処理で発生しました。" & vbCrLf & vbCrLf _
           エラーの内容 & vbCrLf & vbCrLf _
           "○○が正しく入力されているか確認してください。"

といった書き方や 「vbCrLf」のかわりに「Chr(13) & Chr(10)」を使う方法がある。次のURLを参考にしました。

http://support.microsoft.com/kb/281670/ja


関数および手続き

PHP5での関数への引数を参照渡しする

  • 2012-05-12
    <?php
      $x = 10;
      testfunc($x);
      print $x;
     
    function testfunc($para) {
      $para = $para * 2;
    }
    ?>

結果は、

10

 引数に指定した変数の内容を変更し、それを関数を呼び出した側で活用する場合は、参照渡しにします。関数の定義の部分で、変数名の$の前に&をつけます。
 以下のようにすると、20と表示される。

<?php
  $x = 10;
  testfunc($x);
  print $x;
 
function testfunc(&$para) {
  $para = $para * 2;
}
?>


パイプのオープン

  • 2012-07-31
    一時ファイルに入れたり、配列変数に一気に格納してからそれをループしていましたが、パイプとして開くと、表現が適当かわかりませんが、無理なく、普通のファイルと同様に開いて処理が可能です。

Perl

  • openの時、ファイル名の最後に「|」パイプをつけます
  • grepで検索した結果を表示
    open( FILE, "grep hoge $filepath |");
    while ( <FILE> ){
        print;
    }
    close( FILE );
    

PHP

  • popenを利用します
  • grepでファイルを検索した結果を受け取り、さらに加工して表示
    echo "<pre>";
    $handle = popen('grep -E "(^##|,'.$area.',)" ../hogefuge/data1/2012_07s_ang_yuha.csv', 'r');
    $date = "";
    while ($buffer = fgets($handle, 1024)){
    	$buffer = trim($buffer);
    	if (strlen($buffer)>20) {
    		$flds = explode(',', $buffer);
    		echo $date.":".$flds[0].":".$flds[14]."\n";
    		$date = "";
    	} else {
    		$date = $buffer;
    	}
    }
    pclose($handle);
    echo "</pre>";

JQuery

idnameという要素名(idセレクタ指定)の背景色を白にする

  • 2013-04-23
    $("#idname").css("background-color", "white");

HTMLが読み込まれた後に実行する・・・

  • 2013-05-24
$(document).ready(function(){
 実行するスクリプトの内容
});

または、

$(function(){
 実行するスクリプトの内容
});


改変履歴

  • 2011.03.03 ~ <<編集中>>
  • 2011.06.17 Perl,PHP,JavaScriptについて文字列の長さ~文字列を検索追加
  • 2011.08.07 VBA関係の情報をちょっとだけ追加
  • 2011.10.18 PerlとPHPと簡単ですが正規表現について記載追加
  • 2012.01.08 BASH,Perl,PHPでヒアドキュメントの追加
  • 2012.02.06 VBAのMsgBoxでの改行表記について追加
  • 2012-05-12 PHP5での関数への引数を参照渡しする
  • 2012-07-31 「パイプのオープン」を追加
  • 2013-01-29 基本関数にソートなど追加
  • 2013-02-15 Perlの文字列検索をindexに訂正
  • 2013-04-23 JQueryのメモを開始
  • 2013-05-24 正規表現部分でJavaScriptについてメモ追加
  • 2013-07-30 大文字、小文字の変数、関数での区別について追加
  • 2013-12-03 「文字列の置換」追加
  • 2013-12-10 「変数の有無(内容が設定されているか)確認」追加
  • 2014-10-06 「Web上の参考情報」追加
  • 2015-12-01 JavaScript末尾の改行削除を正規表現で行う例追加