ある配列の中から、'Address' という文字列を探し、
もし見つかれば、その配列の何番目に格納されている
か値を返してくれる関数はないでしょうか。

例えば、

 @test[0] = 'No';
 @test[1] = 'Name';
 @test[2] = 'Point';
 @test[3] = 'Address';

 とあった場合、かえってくる値が 3 という具合
 です。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

関数にはないんじゃないかな~。


CPANを探せば、モジュールのなかには、有るだろうけれど、
一般的ではないので、逆に分かりにくくなると思う。

========================================
print &search('Address', @test);

sub search($key_, @array_) {
my $key_ = shift;
my $i = -1;
map { ++$i; return $i if /^$key_$/; } @_;
}
========================================

以上みたいな関数で良いのでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。
このまま貼って使えました。感激です。
こういうのがサラッと書ける方が羨ましいです。
手持ちポイントが 20pt しかないのが残念で仕方
ありません。
心より感謝です。

お礼日時:2002/01/14 02:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q@b = grep(/マッチパターン/, @a);でなく@a = grep(/マッチパターン/, @a);でOKについて

@b = grep(/マッチパターン/,@a);だと配列@aの中でマッチするものを探して@bに入れる・・・というのは理解できるんですが、
@a = grep(/マッチパターン/,@a);とし、
foreach $_ (@a) {
print $_;
}
で参照した場合、@aの中のマッチパターンにマッチするのだけ表示されますけれども、ここでマッチしないのは削除されるのでしょうか・・。

@aから@aにいれる・・・となる事について、どのように@aにマッチしたものを入れ、マッチしないものは削除されるのかの仕組みについて、ご説明できる方はいらっしゃいますでしょうか(例えば内部的にpopやshiftが機能していて・・・みたいな事なのかな・・とか思うんですけれども)

お手数ですが、ご存知の先生方ご教授願えましたら幸いです。

Aベストアンサー

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
{
dVAR;
OP *o;

(略

if (is_list_assignment(left)) {
static const char no_list_state[] = "Initialization of state variables"


という具合なので、代入の左右両辺が同じ変数かどうかのチェックは多分やってません。

#1でのTacosanさんの回答の1です。
つまり、
@a = grep(/マッチパターン/,@a);
これは
@aの内容を列挙→ grepに掛ける→条件に合うものだけのリストを作成→作成したリストを代入。
となります。
grepに掛かる前の@aの内容は、代入の際に「丸ごと」破棄されます。

perly.y
/* Binary operators between terms */
termbinop:term ASSIGNOP term /* $x = $y */
{ $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
TOKEN_GETMAD($2,$$,'o');
}

op.c

OP *
Perl_newASSIGNOP...続きを読む

Qperlスクリプト 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~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qperl cgi文字化け解消方法と[1~][11~][21~][最新10件]のようなリンクを付ける方法。

perlにてcgiを勉強しようと初掲示板を作ってみました。
しかし、日本語を入力すると文字化けしてしまいます。
また、入力フォームの下に[1~][11~][21~][最新10件]のようなリンクを付けたいです。
以上2点のやり方を教えて下さい。お願いします。

#!/usr/bin/perl -w

use strict;
use warnings;
use Encode;
use utf8;
use CGI;

print "location: ./bbs.html\n\n";
print "Content-type: text/html\n\n";

my $q = new CGI;
my $name = $q->param('name');
my $body = $q->param('body');

$name =~ s/</&lt;/g;
$name =~ s/>/&gt;/g;
$body =~ s/</&lt;/g;
$body =~ s/>/&gt;/g;
$body =~ s/\n/<br \/>/g;

my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$year += 1900;
$mon += 1;
$wday = sprintf("%s", qw(日 月 火 水 木 金 土)[$wday]);
my $time = sprintf "$year/%02d/%02d($wday) %02d:%02d:%02d",$mon,$mday,$hour,$min,$sec;

open LOG, ">> log.txt";
print LOG "$time<>$name<>$body\n";
open LOG, "< log.txt";
my @log = <LOG>;
close LOG;

open HTML, "> bbs.html";
print HTML << "END";
<html>
<head>
<style>
body{background:#f0f0f0;}
span.name{color:blue;}
p.body{margin-left:32px;}
</style>
<script type="text/javascript">
<!--
function check(form){
function id(id){return(document.getElementById(id));}
if(form.name.value == "" || form.body.value == ""){
id('err').innerHTML = "入力に誤りがあります<br />";
id('err').style.color = "red";
return false;
}else{
return true;
}
}
//-->
</script>
<title>簡易掲示板</title>
</head>
<body>
<form action="bbs.cgi" method="post" onsubmit="return check(this)">
<fieldset>
<legend>入力フォーム</legend>
<span id="err"></span>
<label>名前</label><br />
<input type="text" name="name" /><br />
<label>本文</label><br />
<textarea name="body"></textarea><br />
<input type="submit" value="書き込み" />
</fieldset>
</form>
<hr />
END
close HTML;

open HTML, ">> bbs.html";
my $num = 0;
for(@log){
$num++;
chomp($_);
my @write = split /<>/, "$_";
print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p>\n<p class='body'>$write[2]</p>\n";
}

print HTML << "END";
<hr />
<a href="dammy">TOP</a>
</body>
</html>
END
close HTML;

exit;

よろしくお願いします。

perlにてcgiを勉強しようと初掲示板を作ってみました。
しかし、日本語を入力すると文字化けしてしまいます。
また、入力フォームの下に[1~][11~][21~][最新10件]のようなリンクを付けたいです。
以上2点のやり方を教えて下さい。お願いします。

#!/usr/bin/perl -w

use strict;
use warnings;
use Encode;
use utf8;
use CGI;

print "location: ./bbs.html\n\n";
print "Content-type: text/html\n\n";

my $q = new CGI;
my $name = $q->param('name');
my $body = $q->param('body');...続きを読む

Aベストアンサー

<つづき>

my $num = 0;
my $p = int(@log/10);
if(@log%10){$p+=1}
my$index;
my$pg=1;
my$s=1;
my$l=10;
if(@log>10){
 $index=qq(<a href="bbs.html">[最新の10件]</a> );
 for(2..$p){
  $s+=10;$l=$_==$p?scalar(@log):$l+10;
  $index.=qq(<a href="bbs_$_.html">[$s‐$l]</a> );
 }
}
@log=reverse(@log);
for(@log){
 chomp;
 $num++;
 my @write = split /<>/;
 print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p><p class='body'>$write[2]</p>\n";
 unless($num%10&&$num!=scalar(@log)){
  print HTML << "END";
<hr>
$index
</body>
</html>
END
  close HTML;
  last if($pg==$p);
  $pg++;
  open HTML, "> bbs_$pg.html";
  print HTML << "END";
<html>
<head>
<style>
body{background:#f0f0f0;}
span.name{color:blue;}
p.body{margin-left:32px;}
</style>
<script type="text/javascript">
<!--
 function check(form){
 function id(id){return(document.getElementById(id));}
 if(form.name.value == "" || form.body.value == ""){
  id('err').innerHTML = "入力に誤りがあります<br>";
  id('err').style.color = "red";
  return false;
 }else{
  return true;
 }
}
//-->
</script>
<title>簡易掲示板</title>
</head>
<body>
<form action="bbs.cgi" method="post" onsubmit="return check(this)">
<fieldset>
<legend>入力フォーム</legend>
<span id="err"></span>
<label>名前</label><br>
<input type="text" name="name"><br>
<label>本文</label><br>
<textarea name="body"></textarea><br>
<input type="submit" value="書き込み">
</fieldset>
</form>
<hr>
END
 }
}
exit;

__END__

<つづき>

my $num = 0;
my $p = int(@log/10);
if(@log%10){$p+=1}
my$index;
my$pg=1;
my$s=1;
my$l=10;
if(@log>10){
 $index=qq(<a href="bbs.html">[最新の10件]</a> );
 for(2..$p){
  $s+=10;$l=$_==$p?scalar(@log):$l+10;
  $index.=qq(<a href="bbs_$_.html">[$s‐$l]</a> );
 }
}
@log=reverse(@log);
for(@log){
 chomp;
 $num++;
 my @write = split /<>/;
 print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p><p class='body'>$write[2]</p>\n";
 unless($num%10...続きを読む

Q$abc[1] と @abc[1] の違いについて

$abc[1]は理解できるのですが、
@abc[1]がわかりません、
宜しくお願いします。

Aベストアンサー

> 「配列スライス」はどんな場合使うのですか
うーん、私はあまり配列スライスは使わないのでよい例が浮かびませんが、、^^;
例えば、検索を行うCGIなどでページ分割を行う時、@data に検索結果全件が入っているとして、
  my $lines = 50;           # 1ページに表示する件数
  my $page = $FORM{page} - 1;  # 表示するページ
  @data = @data[$page*$lines .. ($page+1)*$lines-1];
みたいな感じで、表示する部分を抽出するとかかな?

Q@data[0] = "id,http://okweb.com/WE7

@data[0] = "id,http://okweb.com/WE7@x,pass";
@data[1] 以降続く。

foreach (@data) {
($id,$url,$pass)=split(/\,/,$_);
if ($id eq $in{'id'}) {last;}
}
print "$url\n";
これだと
$url の@以降の部分が表示されずに
http://okweb.com/WE7
このようになってしまいます。

@data = "id,http://okweb.com/WE7\@x,pass";
このように、@の前に\を入れれば大丈夫なのですが、他に何かよい方法はないでしょうか?

Aベストアンサー

「perl 変数展開 しない」で検索。

http://www.google.co.jp/search?hl=ja&q=perl+%E5%A4%89%E6%95%B0%E5%B1%95%E9%96%8B+%E3%81%97%E3%81%AA%E3%81%84&lr=lang_ja


おすすめ情報