投稿

perl 配列内を文字検索

Quick Edit Pencil

[perl] 配列から条件にマッチする要素を取り出す

 配列から条件にマッチする要素を取り出す

「配列の要素を検索しある条件にマッチする要素だけ取り出す」こんな時に先ず思い浮かぶのが、配列全ての要素を順に見ていき、条件にマッチする要素を退避しておく等の方法が考えられます。

 

しかし こんなに煩わしい事をしなくても、perlでは grepという 関数を使用すれば、配列の中からある条件にマッチする要素だけを取得する事が出来ます。 非常に便利なものです。



grep は、第一引数で正規表現を使用して条件を指定し、 第二引数で検索対象となる配列を指定します。 戻り値としてリスト値を指定すればマッチした全ての要素が、スカラ値を指定すればマッチした件数を取得する事が出来ます。



[数値を含む要素のみ取り出す]

@array = ('win95', 'win98', 'win2000', winXP,'mac', 'linux');

@grepedarray = grep(/\d/,@array); 

# ('win95', 'win98', 'win2000')  が取り出される 




[winから始まる要素を取り出す]

@array = ('win95', 'win98', 'win2000', winXP, 'mac', 'linux');

@grepedarray = grep(/^win/,@array); 

# ('win95', 'win98', 'win2000', winXP)  が取り出される 




[winから始まる要素の件数をカウント]

@array = ('win95', 'win98', 'win2000', winXP, 'mac', 'linux');

$cnt = grep(/^win/,@array); 

# 4  が返される 

perl 入門 require

Quick Edit Pencil

use strict;を外す

useとrequireでエラー - Perl - 教えて!goo

my は our

perl 入門 存在確認

Quick Edit Pencil

-e
ファイル存在確認 

-d
ディレクトリ存在確認 

-f
ファイル存在確認 

perl 入門 use strict;とは use warnings;とは

Quick Edit Pencil

test-use-xxx-cgi-script-debug.cgi

#!/usr/bin/perl

### use strict;とは use warnings;とは

#Perl5編 第5章 安全なスクリプトを書く
#http://www.geocities.jp/ky_webid/perl5/005.html

### スクリプトエラー AddHandler cgi-script-debug .cgi

#[perlメモ]XREA系サーバでperlのCGIを動かす時の注意点
#http://blog.kumacchi.com/2009/12/perlxreaperlcgi.html

use strict;
use warnings;
use utf8 ();

print "Content-type: text/html; charset=UTF-8\n\n";
my $num = 100;
print "$num\n";

perl 入門 use utf8;とは

Quick Edit Pencil

#!/usr/bin/perl

#Perlの「use utf8;」
#http://ash.roova.jp/cipher/2010/04/perluse-utf8.html

use utf8;
binmode(STDOUT, ":utf8");

#Perlのuse utf8のメモ - CGIのutf-8改造で文字化けしたときの処方箋
#http://my.xrea.cc/data/pc/perl_use_utf8.html

print "Content-type: text/html; charset=UTF-8;\n\n";

my $string = "検索対象の文字列です。";

if ($string =~ /文.列/) {
print "Match!";
} else {
print "Not Match!";
}

print "こんにちは!\n";

#Perl 5.8.x Unicode関連
#http://www.rwds.net/kuroita/program/Perl_unicode.html#utf8

my $unicode = "\x{0x3b1}";
if(utf8::is_utf8($unicode)){print "bingo";}else{print "not bingo";}

#utf8::decode(@lines);
#my $unicode = @lines;
#if(utf8::is_utf8($unicode)){print "bingo";}else{print "not bingo";}

AppleScriptでURLエンコード

Quick Edit Pencil

AppleScriptでJavaScriptを使わずにURLエンコードする。Perl, Ruby

set theText to "http://ja.wikipedia.org/wiki/アップルスクリプト"

 

--Perl

set theURL to do shell script "perl -MURI::Escape -wle 'print uri_escape(\"" & theText & "\")'"

log "2=" & theURL

(*2=http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88*)

 

--perl

set theURL to do shell script "perl -MEncode -MURI::Escape -e 'print uri_escape(encode('utf8', decode('utf8', \"" & theText & "\")))'"

log "3=" & theURL

(*3=http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88*)

 

--ruby

--AppleScript : URLエンコード http://blog.goo.ne.jp/vallie/e/26f5d6333f44e071863c173300865306

set theURL to do shell script "ruby -r cgi -e 'puts CGI.escape(\"" & theText & "\")'"

log "4=" & theURL

(*4=http%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88*)

 

--URL全体をエンコードしたいときは、上記のエンコード方法では有効なURLとならないので、有効なURLとしてエンコードしておきたいときは、次をかませる。

 

--有効なURL

set theURL to do shell script "echo " & quoted form of theURL & " | sed -e 's/%23/#/g' -e 's/%24/$/g' -e 's/%26/&/g' -e 's/%2B/+/g' -e 's/%2C/,/g' -e 's/%2F/\\//g' -e 's/%3A/:/g' -e 's/%3B/;/g' -e 's/%3D/=/g' -e 's/%3F/?/g' -e 's/%40/@/g'"

logtheURL

(*http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88*)

 

--デコード

set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'print(decodeURI(\"" & theURL & "\"))'"

logtheURL

(*http://ja.wikipedia.org/wiki/アップルスクリプト*)


AppleScriptでJavaScriptを使いたい

AppleScriptとターミナルでJavaScriptを使う

Quick Edit Pencil
AppleScriptでJavaScriptを使いたい
ターミナルでJavaScriptを使いたい

AppleScriptでJavaScriptを使いたい

applescript jsc javascriptcore

具体には、URL全体をエンコード(encodeURI)しておきたい時


下記のように、Sfafariを経由して、JavaScriptを使う事ができるが、Safariが起動してまうし、Safariが起動していてもウィンドウがゼロの時はエラーが出るので、スマートではない。


set theText to "アップルスクリプト"
--JavaScript
tell application "Safari"
set theURL to (do JavaScript "encodeURI(\"" & theText & "\")" in document 1) as text
log "encode=" & theURL
(*0=%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88*)
set theURL to (do JavaScript "decodeURI(\"" & theText & "\")" in document 1) as text
log "decode=" & theURL
(*0=アップルスクリプト*)
end tell

 

そこで、do shell scriptJavaScriptCore.frameworkを直接呼んで、URL全体をエンコード(encodeURI)。

encodeURIとencodeURIComponentは上手くエンコードしてれない。のでURL全体をエンコードしたい場合はリンクを参照。BWNSUY: AppleScriptでURLエンコード

しかし、Safariを通さずJavaScriptを使えるので今後、何かの役にたつかも知れない。
キモは
print([native code])
ターミナルでPATHを通すことで下記とできる。自分のMacだけで使う時はこれでOK。
 do shell script "jsc -e 'print(eccape(\"" & theText & "\"))'"

ln /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc /usr/bin
set theText to ""

--escapeでエンコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theText & "\";print(escape(t))'"
log "encode =" & theURL
(*encode =%E3%81%82*)
--デコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theURL & "\";print(decodeURI(t))'"
log "decode =" & theURL
(*decode =*)

--encodeURIでエンコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theText & "\";print(encodeURI(t))'"
log "encode =" & theURL
(*encode =%C3%A3%C2%81%C2%82*)
--デコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theURL & "\";print(decodeURI(t))'"
log "decode =" & theURL
(*decode =あ*)

--encodeURIComponentでエンコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theText & "\";print(encodeURIComponent(t))'"
log "encode =" & theURL
(*encode =%C3%A3%C2%81%C2%82*)
--デコード
set theURL to do shell script "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'var t=\"" & theURL & "\";print(decodeURI(t))'"
log "decode =" & theURL
(*decode =あ*)

ターミナルでJavaScriptを使いたい

tarminal jsc
ターミナルでもencodeURIとencodeURIComponentは上手くエンコードしてれない。のでURL全体をエンコードしたい場合はリンクを参照。BWNSUY: AppleScriptでURLエンコード

ターミナルでURLをエンコードしてみる

/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc -e 'print(encodeURI("http://ja.wikipedia.org/wiki/アップルスクリプト"))'
又は
/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc encodeurl.js
ホームディレクトリに「encodeurl.js」を新規作成し下記を記述。
// encodeurl.js
(function(){
    print(encodeURI("http://ja.wikipedia.org/wiki/アップルスクリプト")); //標準出力は print 関数
}()); // コードは即時関数で実行させる

JavaScriptCoreへPATHを通す

1 - .bash_profileに記述する方法
ホームディレクトリの「.bash_profile」というファイルにJavaScriptCoreへのPATHを記述します。
alias jsc="/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc"
ターミナルで.bash_profileを開き上記を追記して保存。.bash_profileがない時は新規作成される。
vim ~/.bash_profile
変更した.bash_profileを反映させる
source ~/.bash_profile
2 - ターミナルでハードリンクまたはシンボリックリンクする方法
ターミナルでPATHを通す
ln /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc /usr/local/bin
.bash_profileへの操作、vimのコマンドについての参考サイト
ターミナルで試してみる
jsc -e 'print(encodeURI("http://ja.wikipedia.org/wiki/アップルスクリプト"))'
jsc runner.js

参考にしたサイト