• ベストアンサー

関数reverseの戻り値

2行目と3行目の出力がなぜ異なるのか理解できません。 2行目が期待通りに動かなかったので3行目のように書き直したのですが、 理由を教えていただけると助かります。 $s = 'goo'; print ((reverse $s), "\n"); print (($t = reverse $s), "\n");

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

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

しっかりとした検証はしていませんが… 2行目はリストコンテキストの評価となり、3行目はスカラコンテキストでの評価になるからだと思われます。

JF1Msf
質問者

お礼

なるほどなるほど、確かにそういうことでしょう。 デフォルトでは、2行目のようにリストコンテキストになるんですね。 配列の要素が1つしかなくて、それをreverseするから、 結果だけ見ると、何も起こっていないように見える。 納得しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数の戻り値がこうなる理由が分かりません。

    かなり簡単なプログラムだと思いますが、関数内で出力した場合と、呼び出し側で出力した場合で値が異なります。理由が分からないので教えていただけますか? #include <stdio.h> #include <stdlib.h> Table(int num, double ltable) { double temp[] = { 0.99852, // 1 0.99410, // 2 0.98677 // 3 }; ltable=temp[num]; printf("%f\n",ltable); } main (int argc, char *argv[]) { int num ; double ltable ; num=1; Table(num, ltable); printf("%f\n",ltable); } 実行結果 0.994100 0.000000

  • プログラミング 関数

    逆順する関数reverseを作成したいんです。 以下のは関数reverseを利用したmainのプログラムです。 #include <stdio.h> void reverse(char str1[],char str2[]); int main (void) { char strin[255]="abcdefg"; char strout[255]; reverse(strin, strout); printf(" input=%s\n",strin); printf("output=%s\n",strout); return 0; } 教えてください。

  • open関数を +> で用いても。。。

    モノの本によるとファイルを開く際にファイル入出力記号を +> にすると、追加書き込みは出来ないものの、読み取り、書き込み、新規作成、上書きが出来るとのこと。 ファイルからデータを読み込んで、読み込んだ内容を加工して、すぐにファイルに保存する用途に最適だなと思いましたが、実際に使ってみると読み出しをしてくれません。 何がいけないのでしょうか。 my @s; my @t=('a','b'); open IO,'+>test.txt'; @s=<IO>; print "\$@の要素数は ".@s."個\n"; for(@t) { print IO $_."\n"; } close IO;

    • ベストアンサー
    • Perl
  • recvfrom関数の戻り値がおかしいんですが…

    初めて投稿させていただきます。 現在、Cにてあるクライアントプログラムを作成している者です。 構成は以下の通り。 《構成》 サーバ:PLC(シーケンサと書けば大体の方はわかりますか?) クライアント:Linux Ubuntu9.10 通信方式:TCP/IP 《開発環境》 言語:C IDE:eclipse コンパイラ:gcc 4.x 《質問》 クライアントプログラムからASCIIデータをサーバへ送信し、サーバはクライアントから受信したASCIIデータに応答し、ASCIIデータ伝文を返信してきます。 このサーバからのASCIIデータ応答伝文をrecvfrom関数で受信し、応答伝文のASCIIデータを'buf'変数に格納し、標準出力関数で表示させるといったプログラムです。 このプログラムでは、ユーザ関数内でrecvfrom関数をコールしているのですが、ユーザ関数内でrecvfrom関数をコールした場合、受信データの先頭4byteしか受信できておらず、困っています。 ちなみに、main関数内でrecvfrom関数をコールすると、応答伝文全体のデータをきちんと受信できています。 ちなみに、サーバの応答ASCIIデータ伝文は、仕様通り(期待通り)のデータが返信されています。(ネットワークモニタ:wiresharkで確認済み) recvfrom関数をコールする場所によって、変数に格納するデータ量が変わるといったことがあるのでしょうか。 ソースの一部を添付します。 参照の上、アドバイス等いただけないでしょうか。 《ソース》 ◆mainソース #include ... :<-#include定義 int main{   :<-変数定義、変数初期値代入処理等 ユーザ関数1()コール<-ユーザ関数1内でソケット通信処理を動作させている。 ユーザ関数2()コール<-同上 } ◆ユーザ関数用ソース #include...   :<-#include定義 unsigned char ユーザ関数名1;<-ユーザ関数プロトタイプ宣言 unsigned char ユーザ関数名2:<-同上 char 変数1[5]; char s_buf[4096]; char buf[4096]; /*データ受信用バッファ*/ char 変数2[256]; size_t len; long l; int sock_fd; /*ソケット用ファイル記述子*/ struct sockaddr_in cl_addr; /*CPU用ソケットアドレス*/ socklen_t cl_len = 0; /*cl_addrのサイズ格納用*/ ssize_t n = 0; unsigned char ユーザ関数1(char *引数1,…char *引数5){   :送信データ生成処理 //* ソケット作成 *// if ((sock_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return 1;   } //* 接続先定義*// memset(&cl_addr, 0, sizeof cl_addr); cl_addr.sin_family  = AF_INET; /*プロトコル定義*/ cl_addr.sin_addr.s_addr = inet_addr("***.***.***.***"); /*IPアドレス定義*/ cl_addr.sin_port  = htons(****); /*Port定義*/ //* 接続 *// if (connect(sock_fd, (struct sockaddr *)&cl_addr, sizeof cl_addr) < 0) { perror("connect"); return 1;   } //* データ送信 *// if(send(sock_fd, s_buf, strlen(s_buf), 0) < 0){ fprintf(stderr, "could not send message : %s\n", s_buf); exit(EXIT_FAILURE); } printf("\nSendMessage\n%s\n",s_buf); //* データ受信 *// cl_len = sizeof cl_addr; //*↓↓このrecvfrom関数でbuf内にサーバ応答伝文の先頭4byteのみが格納されている。↓↓*// if (( n = recvfrom(sock_fd, buf, sizeof buf,0, (struct sockaddr *)&cl_addr, &cl_len)) < 0) { perror("recvfrom"); return 1; } fprintf(stderr ,"TCP from addr = %s, port = %d\n", inet_ntoa(cl_addr.sin_addr), ntohs(cl_addr.sin_port) );

  • Rubyのgets関数について

    以下のプログラムを実行して、コマンドプロンプトからsと入力してEnterを押すと、differentと表示されます。sameと表示されることを期待しています。何が原因なのでしょうか?環境はWindows2000です。よろしくお願いします。 i = gets t = "s" if i == t print "same" else print "different" end

  • Perlの戻り値について

    配列の戻り値が理解できていないのですが、 Perlで正しく動作させるためには どのように記述したら良いのでしょうか? 戻り値の動作を詳しく書いてある(出来れば図入りで) 本はありますか? 例) sub a { my @a = ('A'); return (@a, "B", 2); } my (@a, $b, $c) = &a; print "a=[@a] b=[$b] c=[$c]\n"; # a=[A] b=[B] c=[2] # これを期待していたが # a=[A B 2] b=[] c=[] # こちらになる

    • ベストアンサー
    • Perl
  • ライプニッツの公式 導関数

    fn(x)=x^n*logx fn(x)のn+1階導関数を求める問題で ライプニッツの公式を使うためのx^nの導関数を求めるのはわかります。 場合分けするのも分かりますが、 t≦nのとき n!x^n-tではない理由がよくわかりません。 あとライプニッツの公式を使う際どちらの関数をf,gとおくか迷います。 判断基準はありますか? 画像3行目 x^nのt階導関数です。 4行目x^-1 ですがx^n-tです。 間違えました

  • 構造体が戻り値の関数についてわかりません

    問題文:文字列を保存する構造体word_pairを下記の様に定義する。 typedef struct word_pair{ char longer_word[10]; char shorter_word[10]; char combined_word[20]; int longer_word_length; int shorter_word_length; }word_pair_t; この構造体を新たに作成し、データをセットして返す関数 word_pair_t create_word_pair(char *a, char *b); を作成せよ。create_word_pairは以下の仕様を満たす。 create_word_pairは2つの文字列a,bを比較し、長い文字列をlonger_wordに、短い文字列をshorter_wordに代入する。また、これらの長さが同じ場合には辞書的に後ろのものをlonger_wordに、前のものをshorter_wordに代入する。もし、a,bがまったく同じ文字列であれば、エラーメッセージを出力した上で、longer_wordに入力された文字列をshorter_wordに空の文字列を代入する。またcombined_wordにはlonger_word とshorter_wordをスペース区切りで結合したものを代入する。 標準入力から文字列を2つ読み取り、create_word_pairを用いて、新たにそれらのデータが代入された構造体を作成した後に、これらのメンバ変数を全て、標準出力に表示するプログラムを作成せよ。 という問題で、とりあえず自分で細かい条件は無視して文字列を標準入力してから構造体のメンバに文字を格納するところまでやろうとしたのですが、strcpyするのに型が違うとコンパイルエラーが出たのですが、型は一緒だと私は思っているため、なぜ違うのかわかりません。 また辞書的に後ろ前をif文でどのように表現すればいいのかと、文字列結合にstrcatを使うと思うのですが、結合の合間にスペースをいれる方法が分かりません。以下自分のコード。 #include<stdio.h> #include<string.h> #define max 50 typedef struct word_pair{ char longer_word[10]; char shorter_word[10]; char combined_word[20]; int longer_word_length; int shorter_word_length; }word_pair_t; word_pair_t create_word_pair(char *a, char *b); int main() { char a[max],b[max]; word_pair_t *str; printf("文字列を2つ入力してください。\n"); printf("1つ目:"); scanf("%s\n",a); printf("2つ目:"); scanf("%s\n",b); create_word_pair(a,b); printf("長い方の文字列%s\n",str->longer_word); printf("短い方の文字列%s\n",str->shorter_word); printf("連結した文字列%s\n",str->combined_word); printf("長い方の文字列の長さ%d\n",str->longer_word_length); printf("短い方の文字列の長さ%d\n",str->shorter_word_length); return 0; } word_pair_t create_word_pair(char *a, char *b) { int d, e; char c[max]; word_pair_t *str; d = strlen(a); e = strlen(b); if(d > e){ strcpy(str->longer_word, a); strcpy(str->shorter_word, b); c = strcat(a,b); strcpy(str->combine_word, c); strcpy(str->longer_word_length, d); strcpy(str->shorter_word_length, e); } if(d < e) { strcpy(str.longer_word, b); strcpy(str.shorter_word, a); c = strcat(a,b); strcpy(str.combine_word, c); strcpy(str.longer_word_length, e); strcpy(str.shorter_word_length, d); } }

  • C言語で文字列の出力の問題

    1行目に文字列aを出力し、2行目にaの各文字を2回づつ出力し、3行目にaの格文字の文字コードを出力する関数 void print_string(char a[]) を作成せよ。 この関数を print_string("abcd") で呼び出したときの出力は abcd aabbccdd 97 98 99 100 となる。 という問題なのですが、2行目と3行目をどうしたら文字列aの文字や文字コードを個別に出力できるのかわかりません。 1行目までしかできてないですが、次のが私の作ったプログラムです。 #include <stdio.h> void print_string(char a[]) { printf("%s\n",a); } int main (void) { print_string("abcd"); return(0); } よろしくお願いします。

  • awk詳しい方へ

    あるファイルの最終行のみ、他の行と出力形式を変えたいのですが awkとNRを使ってスマートにできないでしょうか? 詳しい方ご教授お願いします。 不細工に作ると(ファイル名xxxのとき) nnn=`wc -l xxx | awk '{print $1}'` awk '{ if (NR != $nnn) printf("%s %s \n",$1,$2) else printf("%s %s \n",$3,$4) }' aaa こんな感じでしょうか。 なんか、一行とかでかけないでしょうか?