• ベストアンサー

perlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。 sub tttt { my @out = @_; for (@out) { s/^\s+//; s/\s+$//; } return wantarray ? @out : $out[0]; このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。 分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • secretd
  • ベストアンサー率39% (50/126)
回答No.1

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします. 「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります. 次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します. したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に, 「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします. 置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです. 次に, wantarray ですが, http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です. 呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

fortunefeeling
質問者

お礼

とても分かりやすい説明ありがとうございます。 仰るとおり置換構文sについては事前に調べがついておりました。本当にありがとうございました。助かりました。

その他の回答 (1)

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.2

既に的確な回答が出ていますので、リファレンス本をお薦めしておきます。unicode や 標準モジュールに関する事以外であればだいたい間に合うと思います。

参考URL:
http://www.7andy.jp/books/detail?accd=30527064
fortunefeeling
質問者

お礼

情報ありがとうございます!

関連するQ&A

  • Perlスクリプト (); wantarry, (localtime)[0..2]; について。

    人様の作ったスクリプトの解析をしています。 下記のスクリプトについて質問があります。 my $now = zikoku(); print "$now です。\n"; sub zikoku { my ($sec, $min, $hour) = (localtime)[0..2]; if (wantarray) { return ($hour, $min, $sec); } else { return sprintf "%02d:%02d:%02d", $hour, $min, $sec; } } まず、zikoku(); の部分なのですが、現在自分はサブルーチンは&で呼び出すものとしか認識しておらず、ここではどのような用法で使われているのかがわかりません。();は何なのでしょうか?? また、localtime関数の次の[0..2]の意味が分かりません。 そして、wantarray関数自体の働きは一応理解しているのですが、ここではwantarray関数にどのような意味があるのかが分かりません。 分かる方いらっしゃいましたらご教授頂けると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlスクリプト

    perlの勉強をしているものです。人様の作ったスクリプトを解析しています。以下のスクリプトについて質問があります。 while(chomp($in = <STDIN>)){ last if ($in eq "\cD"); print "$in"; } このスクリプトに出てきている、"\cD"の意味と、ifの前に出てきているlastの働きが分かりません。またこのスクリプトは全体としてどのような仕事をするのでしょうか?? 分かる方いらっしゃいましたら、ご教授いただけると幸いです。よろしくお願いします。

  • Perl 強制終了の回避について

    Attempt to free unreferenced scalar とは? http://oshiete1.goo.ne.jp/qa4237453.html の続きです。 とりあえず、下に現状で分かる最小限の再現性があるスクリプトを 書いておきます。 print &opentmpl("body"); print &opentmpl('footer'); # これがない場合はエラーにならない sub opentmpl { my $fn = shift; my $VAR = shift || {}; my $file = &{$fn}(); &regex(\$file, $VAR, '__([A-Z_\d]+?(\[\d+?\])?)__', ['$VAR->{"%s"}', '$1']); &regex(\$file, $VAR, '&{(.+?)}&', ['%s', '$1']); return $file; return undef; } sub regex { my $str = shift; my $VAR = shift; my $pattern = shift; my $replace = shift; $$str =~ s/((([^\n]*?)$pattern(?=.*))+(\n?))/&func($1, $VAR, $pattern, @$replace)/egs; return; } sub func { my $str = shift; my $VAR = shift; my $pattern = shift; my $buf = shift; $str =~ s/$pattern/$@ = ''; $_ = eval(sprintf($buf, map { eval($_); } @_)); $@ ? $@ : $_/egs; if($str =~ /^\s*\n?$/s) { return; } return $str; } sub body { print "Content-type: text/plain; charset=shift_jis\n\n"; return <<'HTML'; &{ return &opentmpl('table', {'TEST' => 'test'}); }& HTML } sub table { return <<'HTML'; __TEST__ HTML } sub footer { return <<'HTML'; test HTML } 調べてみた限りではActivePerl for Win32以外のPerlでも同様のよう です。 (Linux上でも同様のようです) 5.8.8ではエラーになりますが、5.10.xではエラーにならないようです。 (同じ環境において5.8.8では再現し、5.10.0にバージョンアップすると 再現しなくなり、再度5.8.8にバージョンダウンすると再現します) 本番機の環境が5.8.8で勝手にバージョンアップなどができないため、 5.8.8で正常に動作するようにするにはどうしたらよいでしょうか。 結構、無駄も多いと思いますので全く同じ動作をしながらより効率の いい書き方ができたらいいなと思います。 (なお、実際には使用しているけど上記では使用していない部分が 含まれていてその部分がない場合もエラーにならないようです)

    • ベストアンサー
    • Perl
  • perlで関数のプロトタイプでリファレンスの場合は?

    perlで関数にプロトタイプを記述しようとしたのですが、リファレンスの場合はどうしたらよいのでしょうか? sub test(\$[ここに必ずリファレンス型]){ my($sca, $ref) = @_; } my $a = "A"; my @b = ("1", 2, "3"); test($a, \@b);

    • ベストアンサー
    • Perl
  • ループが可能なHTMLテンプレートを切り離せるperlスクリプト

    はじめまして、いつもphpをつかっててperlの知識がない者です。 perlの中にHTML部分を記入するとコードが読みにくくなるので別ファイル(テンプレート)として切り離したいのです。 そのとき、たとえば掲示板のように、ループ部分があっても、そのテンプレートがつかえるようにしたいのですが、そのような、スクリプトをご存知の方いらっしゃいましたら、どうか教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • perl  TermExtract 動かない

    perl で TermExtract というものを使って専門用語抽出をしたいと思っています。 参考ページ http://gensen.dl.itc.u-tokyo.ac.jp/termextract.h … 形態素解析ソフトは「和布蕪」を使っています。 参考ページの 「和布蕪」の場合の、TermExtract::MeCab サンプルスクリプトを参考にして 動かしてみたんですがうまく動作しません。 <ソース> #! /usr/bin/perl use TermExtract::MeCab; my $data = new TermExtract::MeCab; my $InputFile = "./CGI/mecab_out.txt"; $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = 'sigexit'; my $output_mode = 1; my @noun_list = $data->get_imp_word($InputFile); print "Content-type: text/html; charset=EUC-JP\n\n"; print <<"EOM"; <!DOCTYPE html> <HTML> <HEAD> <TITLE>mecab</TITLE> </HEAD> <BODY> EOM foreach (@noun_list) { # 結果表示 printf "%-60s %16.2f\n", $_->[0], $_->[1] if $output_mode == 1; printf "%s\n", $_->[0] if $output_mode == 2; printf "%s,", $_->[0] if $output_mode == 3; } sub sigexit { $data->unlock_db; } print <<"EOM"; </BODY> </HTML> EOM <---------------> mecab_out.txtには、和布蕪」を使って出食された形態素解析済みのデータ が入っています。 ブラウザでみると、真っ白のページが表示されます。 なにか使い方を間違えているのでしょうか? よろしくお願いいたします。

  • オブジェクト? perlをオーバーライドする方法?

    perl 5.6を使っております。 Perl5.8では PerlIOが入出力の際に文字コードを自動変換しているのですが この機能を5.6でもスクリプト互換で使いたい(スクリプトを5.6と5.8を同じにする)のですが、 既存のprint, getc, read, write関数をオーバーライド?することは可能でしょうか? 一々、if(5.8 <= $])としたくないためです。 例えば、外部がeucでperl処理がutf8の場合 sub getc{ return Jcode->new(...)->utf8; } sub print{ return Jcode->new(...)->euc; } sub read{ return Jcode->new(...)->utf8; } sub write{ return Jcode->new(...)->euc; }

    • ベストアンサー
    • Perl
  • perlのクラスについて

    perlでクラスを作成しています。その際、コンストラクタnewで無名配列を定義して、funcメソッドで、この無名配列に値をいれるにはどうすればよいでしょうか? sub new { my $class = shift; my $self->array = []; bless($self, $class); return $self; } sub func { my $self = shift; $self->arrayに配列のデータを入れる。 }

    • ベストアンサー
    • Perl
  • perlのプログラミングについて

    perlのプログラミングについて詳しい解説をお願いいたします。 sub list_reverce{ my $old=shift; my&new=undef; while (my $cur=$old){ $old=$old‐>[NEXT]; $cur‐>[NEXT]=$new; } return $new } 全くの初心者です。連結リストに対してのreverseなのですが、わかりません。 ご回答お願いいたします。

    • ベストアンサー
    • Perl
  • perlの最適化に取り組む際のa.outについて

    perlの最適化に取り組む際のa.outについて 下記IBMのサイトを参考にperlの最適化について取り組んでいます。 http://www.ibm.com/developerworks/jp/linux/library/l-optperl/ 現在、意図しているscript.plでは、http://.../script.plにアクセスした場合、現状エラーのない状態です。 その状態で素直に、 $ perlcc -B script.pl を実行し、a.outというファイルが出来るのを確認しました。 shell上で $ a.out を実行すると、ウェブにアクセスした場合に表示される画面が表示されます。 $ mv a.out /var/www/lib/db/Atest としてリネームしました。 その後、一応パーミッションも実行権限付けました。 ●test.cgiとして下記を作成しました。 #!/usr/bin/perl use lib '/var/www/lib/db'; unshift @INC, '/var/www/lib/db'; use utf8; use open ":utf8"; use open ":std"; BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } #1. system(Atest); #2. foreach(`Atest`){ print $_; } #3. open(OUT, "| Atest|"); print OUT; close(OUT); 1; Atestの実行結果をWebからのアクセスで表示可能にならないか検証しているのですが、画面は真っ白な状態です。 サーバーのerror.logにも何も表示されません。 上記IBMのサイトで解説されている 抜粋:「perlccはCソースに埋め込まれたものを生成します。このCソースが、完全なスタンドアローンの実行可能ファイルにまでコンパイルされます。」 とあるように、Cが分かっていないと駄目なのでしょうか Webからアクセス時、表示可能なようにするにはどのようにすれば良いかご教授頂けませんでしょうか

    • ベストアンサー
    • Perl

専門家に質問してみよう