よくPerl のコマンド紹介などで改行コードを削除する便利なコマンドとして紹介されるのが「chomp」というコマンドです。多くは、 「文字列の行末に改行がある場合はそれを削除し無い場合は何もしません」 という紹介がなされます。こういう紹介をうけると、 「おぉ! こいつは便利だ改行コードを自動で削除してくれるんだ、きゃっほーっ!」 ということになります。ところが試してみると 異なるOS間でやり取りしているデータに対して処理するとうまく動きません。なぜなら改行コードと呼ばれる文字には三種類のコードが存在し、chomp君が取ってくれるのは現在Perlが実行されている環境における改行コードだからです。その為ネット上ではPerl 初学者の 「なんかchompがうまく動かないんですけど」 という質問があり、回答として、 「改行コードはさっさと正規表現でとっちゃおうよ」 という至極真っ当な意見ととも
単語頻度を扱うと,ハッシュを結合したくなる.いちいち自己流ロジックを書いていたけれど,何か良い方法はないものか.図書館から借りてきたPerlクックブックを開いてみた. my %new_hash = (%hash1, %hash2); # これは,以下のようなハッシュの初期化ができることから納得できる # my %hash = (hoge => 1, bar => 2, piyo =>3); # my %hash = (hoge, 1, bar, 2, piyo, 3); あれ,もしかして? my %hash = ('hoge', 1, 'bar', 2, 'piyo', 3); foreach my $keyorvalue (%hash){ print $keyorvalue . "\n" } 出力結果: bar 3 foo 2 hoge 1 そういうことか!ハッシュはつまり,key, v
「生年月日から年齢を計算する簡単な計算式」という記事。感心しました。なるほどね。PHP、Perl、Java と 3 つの言語で紹介しておきながら書かれているのは標準出力と型キャストだけというのが、なんともさみしいので、きちんと「計算」部分を書いてみた。 ということで、まずはperl: #!/usr/bin/perl use strict; my $byear = 1977; my $bmon = 11; my $bday = 3; my ($year,$mon, $day) = (localtime(time))[5,4,3]; my $now = sprintf( "%04d%02d%02d", $year+1900, $mon+1, $day ); my $birth = sprintf( "%04d%02d%02d", $byear, $bmon, $bday ); print
はじめに 前回 の記事の続きとなります。前回構築した開発環境を元にして、今度はリモートデバッグができる環境をつくります。 この記事を読むとできるようになること この記事を最後まで読むと、こんな事ができるようになります。 つまり、リモートサーバ上で実行されているPerl5 スクリプトが実行された際に、IDE 上でデバッガを利用して変数の状態を可視化しながらデバッグが行えるようになります。Perl5 で書かれたCGI のデバッグというと print デバッグ頼みになりがちかと思いますが、この記事で解説する環境構築を行うことで一気にPerl5 でもモダンな開発ができるようになります。 準備 前回 の記事で、IntelliJ IDEA Community Edition を用いたPerl5 (以下、Perl) の開発環境の構築について説明しました。まだ IntelliJ IDEA Com

Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに:これは誰のための記事か?Perl で書かれた比較的大きなスクリプトやプロジェクトを保守する必要のある人.Perl 5 との戦いPerl5 (以下Perl) といえば一時期CGI を作るための標準的な技術として Web の開発で利用されたり、テキスト処理用の言語として昔から広く使用されている言語です。 かつてはサーバー上でCGI を動作させるためにPerl でなければならない というような状態がありましたが、近年ではRuby onRails やPHP 製のフレームワークなどがサーバー上で普通に利用できるように

「cgi界」という言葉があるかどうかは知らないが、「Premature end of script headers」というエラーに対して、都市伝説というか民間療法というか、そういうのがあるようだ。例えば、 #! /usr/bin/perl 。。。。でこのエラーとなるときに、 #! /usr/bin/perl -- 。。。。とすれば「なぜかわからないが直る」(笑)と書いてある。 そもそも、このメッセージは、「cgiプログラムがContent-Type ヘッダを出力する前に終了した」ということを示すだけであって、ほとんどの場合、その前に本当のエラーメッセージが出ているはずだ。例えば、 (2)No such file or directory: exec of '/var/www/html/test.cgi' failed Premature end of script headers: tes
perldoc Time::Piece http://d.hatena.ne.jp/hirose31/20100916/1284628891 http://d.hatena.ne.jp/perlcodesample/20091105/1246274997perl 5.8には時刻を扱う標準モジュールがなくて、たいていCPANのDateTimeを使ってたんですが、DateTimeは巨大?で依存モジュールも多いので、ちょっとした日付計算には大げさだなーと思っていました。 すると Time::Piece という軽量なモジュールがあることを知りました。5.10 では標準モジュールに加わったということもあるので、普段はこれを使えばいいかな。 Time::Piece use すると標準のlocaltime を上書きする。詳細な使い方は↑のurlとperldocで。 use Time::Piece; m
Perlにおける配列値の重複や削除といった操作をするにはgrep関数を利用すれば良いけれども、書いては忘れ調べ直しを繰り返している。いい加減覚えるために、メモ書きとして以下に残す。 ある配列の重複する要素を排除するには以下の様に書く。 my %tmp; my @uniq = grep { $tmp{$_}++ < 1; } (@array); 逆に配列の重複した要素だけを取り出すには、grep関数を二回通す。 my (%tmp, %tmp2); my @not_uniq = grep { $tmp2{$_}++ < 1; } (grep { $tmp{$_}++ >= 1; } (@array)); foreachを利用しても上記処理が実現できるけれども、grepを使ったほうが簡潔に記述できる。 参考リンクPerlの組み込み関数 grep の翻訳 -perldoc.jp
正規表現とは、ある特定の文字列ではなく、文字列の一部をパターン化して表現する手法をいいます。 複数行ある文章の中から文字列を検索する時に、検索したい文字列すべてを指定するのではなく、文字列の任意の一部を置き換え可能な状態にして検索をする場合に正規表現を用います。 たとえば、UNIXやWindowsでは、文字列を検索するときに使用される正規表現として、「*」を任意の文字列(空き文字も含む)に、「?」を任意の1文字として使用することができます。パターンを、app* と表現すると、apple application appeal などの文字列がマッチすることになります。 この正規表現の方法は、当然ながらプログラム言語ごとに異なりますが、Perlの場合は他の言語に比べて非常に強力な正規表現によるパターンマッチ機能を備えており、より詳細にかつ容易にパターンマッチを行うことができるとされています。
Perl › 関数 › here chomp関数を使用すると、改行を削除することができます。 # 末尾の改行を削除 chomp $line; OSに依存しないで改行を削除する chompに関して一つ注意点があります。chompは環境に依存するということです。たとえばWindowsで実行した場合は末尾の「\x0D\x0A」あるいは「\x0A」を取り除きますが、Unix系OSで実行した場合は「\x0A」を取り除きます。\x0Dはキャリッジリターンを、\x0Aはラインフィードを表す特殊文字です。Windowsでは改行文字は「\x0D\x0A」で表されれ、Unixでは「\x0A」で表されます。 このような理由でWindows上で保存したスクリプトと読み込んだテキストファイルを、そのままUnix上に移動させた場合に、正しく改行が取り除かれないということが発生します。環境に依存しないで改行を取り除きた
2008年07月14日23:37Perlperlの正規表現で全角文字にマッチさせるには? 今日はperlで正規表現の話です。まずは実際のコードを見てください。 #!/usr/bin/perl use strict; use warnings; use utf8; my $data = 'あ 1245 aa気'; if ($data =~ /^(\w)(\s)(\d{4})(\s)(\w{3})$/) { print "match\n"; } このif条件ってマッチすると思いますか??実はマッチするんです!!�堯�゚Д゚) これがマッチするのは use utf8; しているためです。use utf8; すると内部的にはutf8フラグが立てられ、スクリプトがUTF-8で記述されていることを宣言します。その結果、日本語のような多バイト文字であっても半角文字であっても、1文字は1文字としてカウ

実行されているPerl スクリプトの絶対パスを取得する方法が知りたいです。 __FILE__ でファイル名を取得できることは知っているのですが、取得したファイル名を探す処理を入れるべきなのか、CPAN のモジュールですぐに解決できるのか見当がつきません。 ググッては見たのですが、該当する結果が得られませんでした。
[Perl] 簡単なXMLデータであればXMLデータをツリー構造体として扱うXML::Simpleを使用できる。XML::Simpleではデータ読み込みのためのXMLinと書き出しのためのXMLoutを提供してくれる。以下AWS(Amazon Web Service)にてデータを取得する例 #!/usr/bin/perl my $dev_key = 'Dev Token or Subscription ID Here'; my $af_tag = 'Associate Tag Here'; my $keyword = shift @ARGV or die "Usage:perlamazon_http.pl <keyword>\n"; my $url = "http://webservices.amazon.co.jp/onca/xml3?dev-t=" . $dev_key . "&t
目次 -Perl Index ThemePerl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x290 回。Perl で、処理対象の文字列の文字コード ( コードセット ) が不明な場合に、その文字コードを「 推測 」( guess ) してコードセットの名前を返すモジュール「 Encode::Guess 」の利用法を確認する。 不明な文字コード 前々回 (0x28e) では、起動引数を格納する配列変数「 @ARGV 」の文字コードを、モジュール「 I18N::Langinfo 」を利用して確認しましたが、そこで実際に確認していたのはシステムの「 ロケール 」の文字コードでした。 つまり、「 ロケール 」の情報から間接的に文字コードを推定していたわけで、対象の文字列を直接確認したわけではありません。 対象の文字列を直接確認するためには、モジュール「 Encode::G

Perl › herePerlのモジュールについての解説です。Perlでいうモジュールとは良く使う機能や便利な機能をプログラムで利用するための仕組みです。Perlの基本文法を覚えたらいろいろなモジュールを使ってみましょう。モジュールを組み合わせると複雑な問題を簡単に解決したり、業務の自動化に役立ったりします。 またCPANと呼ばれるモジュールの配布サイトでは役立つたくさんのモジュールが有志によって登録されており無料で利用することができます。cpanコマンドの使い方についてはCPANモジュールの解説を参考にしてください。 モジュールの作成方法 「パッケージ」などのモジュール作成のための基礎知識を知りたい場合は「モジュールの基礎」を参考にしてください。実際にモジュールを自分で作成してみたい方はModule::Starterモジュールを使って、モジュールのひな型を作成するのが早道です。 モジ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く